7.4、服务提供者注册
服务提供者注册
服务提供者需要注册到 Nacos,才能被其他服务发现和调用。本节将学习如何注册服务提供者。
本节将学习:添加 Nacos 依赖、配置文件配置、启动类注解,以及服务注册验证。
在商城项目中集成 Nacos
步骤1:添加 Nacos 依赖
更新用户服务 POM:
文件路径: mall-microservices/user-service/pom.xml
在 <dependencies> 中添加:
<!-- Nacos 服务发现 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
完整的用户服务 POM 配置:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>com.mall</groupId> <artifactId>mall-microservices</artifactId> <version>1.0.0</version> </parent> <artifactId>user-service</artifactId> <name>User Service</name> <description>用户服务</description> <dependencies> <!-- Spring Boot Web --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- Nacos 服务发现 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <!-- MyBatis Plus --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> </dependency> <!-- MySQL --> <dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> </dependency> <!-- Lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <!-- Spring Boot Actuator --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!-- Spring Security --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
步骤2:配置 Nacos 连接
更新用户服务配置文件
文件路径: mall-microservices/user-service/src/main/resources/application.yml
server: port: 8081 spring: application: name: user-service cloud: nacos: discovery: server-addr: localhost:8848 namespace: public group: DEFAULT_GROUP # 服务注册的 IP 和端口(可选,默认自动获取) # ip: 127.0.0.1 # port: 8081 # 服务元数据(可选) metadata: version: 1.0.0 cluster: default datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/user_db?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai username: root password: root # MyBatis Plus 配置 mybatis-plus: configuration: map-underscore-to-camel-case: true log-impl: org.apache.ibatis.logging.stdout.StdOutImpl global-config: db-config: id-type: auto # Actuator 配置 management: endpoints: web: exposure: include: health,info,metrics endpoint: health: show-details: always
配置说明
Nacos 配置项说明:
server-addr:Nacos 服务器地址,格式:host:portnamespace:命名空间,用于环境隔离,默认:publicgroup:服务分组,默认:DEFAULT_GROUPip:服务注册的 IP(可选,默认自动获取)port:服务注册的端口(可选,默认使用server.port)metadata:服务元数据,可以添加自定义信息
步骤3:更新启动类
用户服务启动类
文件路径: mall-microservices/user-service/src/main/java/com/mall/userservice/UserServiceApplication.java
package com.mall.userservice; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @SpringBootApplication @EnableDiscoveryClient @MapperScan("com.mall.userservice.mapper") public class UserServiceApplication { public static void main(String[] args) { SpringApplication.run(UserServiceApplication.class, args); } }
注解说明
@EnableDiscoveryClient 注解:
- 启用服务发现客户端
- 自动注册服务到 Nacos
- 自动从 Nacos 获取服务列表
注意:在 Spring Cloud 2020 版本后,@EnableDiscoveryClient 可以省略,只要添加了 spring-cloud-starter-alibaba-nacos-discovery 依赖,会自动启用服务发现。
步骤4:注册商品服务和订单服务
商品服务配置
文件路径: mall-microservices/product-service/pom.xml
添加 Nacos 依赖(同用户服务):
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
文件路径: mall-microservices/product-service/src/main/resources/application.yml
server: port: 8082 spring: application: name: product-service cloud: nacos: discovery: server-addr: localhost:8848 namespace: public group: DEFAULT_GROUP datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/product_db?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai username: root password: root
文件路径: mall-microservices/product-service/src/main/java/com/mall/productservice/ProductServiceApplication.java
package com.mall.productservice; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @SpringBootApplication @EnableDiscoveryClient @MapperScan("com.mall.productservice.mapper") public class ProductServiceApplication { public static void main(String[] args) { SpringApplication.run(ProductServiceApplication.class, args); } }
订单服务配置
文件路径: mall-microservices/order-service/pom.xml
添加 Nacos 依赖:
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
文件路径: mall-microservices/order-service/src/main/resources/application.yml
server: port: 8083 spring: application: name: order-service cloud: nacos: discovery: server-addr: localhost:8848 namespace: public group: DEFAULT_GROUP datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/order_db?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai username: root password: root # 注意:此时还不能使用服务名调用,需要等待下一节配置 LoadBalancer # service: # user: # url: http://localhost:8081 # product: # url: http://localhost:8082
步骤5:服务注册验证
启动服务
启动顺序:
-
启动 Nacos:
cd mall-microservices/docker/nacos docker-compose -f docker-compose-simple.yml up -d -
启动用户服务:
cd mall-microservices/user-service mvn spring-boot:run -
启动商品服务:
cd mall-microservices/product-service mvn spring-boot:run -
启动订单服务:
cd mall-microservices/order-service mvn spring-boot:run
验证服务注册
方法1:通过 Nacos 控制台验证
- 访问 Nacos 控制台:http://localhost:8848/nacos
- 登录:nacos/nacos
- 进入"服务管理" -> "服务列表"
- 应该能看到三个服务:
user-serviceproduct-serviceorder-service
方法2:通过 API 验证
# 查询所有服务 curl http://localhost:8848/nacos/v1/ns/service/list # 查询特定服务的实例列表 curl http://localhost:8848/nacos/v1/ns/instance/list?serviceName=user-service
查看服务详情
在 Nacos 控制台查看服务详情:
- 点击服务名称,查看服务详情
- 查看服务实例列表
- 查看服务健康状态
- 查看服务元数据
服务注册流程
常见问题
可能遇到的问题:
-
服务注册失败:
- 问题:服务无法注册到 Nacos
- 解决:
- 检查 Nacos 是否启动
- 检查
server-addr配置是否正确 - 查看服务启动日志
-
服务注册后立即下线:
- 问题:服务注册后很快变为不健康状态
- 解决:
- 检查服务是否正常启动
- 检查 Actuator 健康检查端点是否正常
- 查看 Nacos 日志
-
无法访问 Nacos:
- 问题:无法连接到 Nacos 服务器
- 解决:
- 检查 Nacos 容器是否运行:
docker ps | grep nacos - 检查端口是否被占用
- 检查防火墙设置
- 检查 Nacos 容器是否运行:
服务注册原理
自动注册机制
Spring Cloud Alibaba Nacos Discovery 自动注册机制:
-
启动时注册:
- 应用启动时,Nacos Discovery 自动连接 Nacos 服务器
- 获取本机 IP 和端口(从
server.port获取) - 发送服务注册请求
-
心跳保持:
- 注册成功后,定期发送心跳
- 默认心跳间隔:5秒
- Nacos 服务器根据心跳判断服务健康状态
-
下线处理:
- 服务正常关闭时,发送下线请求
- 服务异常关闭时,Nacos 根据心跳超时判断服务下线
服务注册信息
注册到 Nacos 的服务信息包括:
- 服务名:
spring.application.name - IP 地址:自动获取或手动配置
- 端口:
server.port - 命名空间:
spring.cloud.nacos.discovery.namespace - 分组:
spring.cloud.nacos.discovery.group - 元数据:
spring.cloud.nacos.discovery.metadata
官方资源
根据 Nacos 与 Spring Cloud 集成文档 和 Nacos Discovery 配置说明:
-
服务注册机制:官方文档详细说明了 Nacos 的服务注册机制,包括自动注册、心跳保持、服务下线等流程。文档强调,Nacos 客户端会在应用启动时自动注册服务,并定期发送心跳以保持服务在线状态。
-
配置项说明:官方文档详细列出了所有 Nacos Discovery 的配置项,包括服务器地址、命名空间、分组、元数据等。文档特别说明了命名空间和分组的作用,以及如何利用它们实现环境隔离和服务分组。
-
与 Spring Cloud 集成:官方文档提供了完整的 Spring Cloud 集成示例,说明了如何与 Spring Cloud LoadBalancer、OpenFeign 等组件配合使用,实现服务发现和负载均衡。
参考资源:
- Nacos 服务注册:https://nacos.io/docs/use-nacos-with-spring-cloud.html
- Nacos Discovery 配置:https://github.com/alibaba/spring-cloud-alibaba/wiki/Nacos-discovery
本节小结
在本节中,我们完成了服务提供者注册:
第一个是添加 Nacos 依赖。 在用户服务、商品服务、订单服务的 POM 中添加了 Nacos Discovery 依赖。
第二个是配置文件配置。 为每个服务配置了 Nacos 连接信息,包括服务器地址、命名空间、分组等。
第三个是更新启动类。 在启动类上添加了 @EnableDiscoveryClient 注解(可选,但建议显式添加)。
第四个是注册多个服务。 完成了用户服务、商品服务、订单服务的注册配置。
第五个是服务注册验证。 通过 Nacos 控制台和 API 验证了服务注册是否成功。
第六个是服务注册原理。 了解了服务自动注册、心跳保持、下线处理的机制。
这就是服务提供者注册。现在三个服务都已经注册到 Nacos,可以在 Nacos 控制台看到它们。在下一节,我们将学习服务消费者发现,让订单服务能够通过服务名调用用户服务和商品服务。