7.4服务提供者注册

分类: Nacos服务注册与发现

服务提供者注册

服务提供者需要注册到 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:port
  • namespace:命名空间,用于环境隔离,默认:public
  • group:服务分组,默认:DEFAULT_GROUP
  • ip:服务注册的 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:服务注册验证

启动服务

启动顺序:

  1. 启动 Nacos

    cd mall-microservices/docker/nacos docker-compose -f docker-compose-simple.yml up -d
  2. 启动用户服务

    cd mall-microservices/user-service mvn spring-boot:run
  3. 启动商品服务

    cd mall-microservices/product-service mvn spring-boot:run
  4. 启动订单服务

    cd mall-microservices/order-service mvn spring-boot:run

验证服务注册

方法1:通过 Nacos 控制台验证

  1. 访问 Nacos 控制台:http://localhost:8848/nacos
  2. 登录:nacos/nacos
  3. 进入"服务管理" -> "服务列表"
  4. 应该能看到三个服务:
    • user-service
    • product-service
    • order-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 控制台查看服务详情:

  1. 点击服务名称,查看服务详情
  2. 查看服务实例列表
  3. 查看服务健康状态
  4. 查看服务元数据

服务注册流程

常见问题

可能遇到的问题:

  1. 服务注册失败

    • 问题:服务无法注册到 Nacos
    • 解决:
      • 检查 Nacos 是否启动
      • 检查 server-addr 配置是否正确
      • 查看服务启动日志
  2. 服务注册后立即下线

    • 问题:服务注册后很快变为不健康状态
    • 解决:
      • 检查服务是否正常启动
      • 检查 Actuator 健康检查端点是否正常
      • 查看 Nacos 日志
  3. 无法访问 Nacos

    • 问题:无法连接到 Nacos 服务器
    • 解决:
      • 检查 Nacos 容器是否运行:docker ps | grep nacos
      • 检查端口是否被占用
      • 检查防火墙设置

服务注册原理

自动注册机制

Spring Cloud Alibaba Nacos Discovery 自动注册机制:

  1. 启动时注册

    • 应用启动时,Nacos Discovery 自动连接 Nacos 服务器
    • 获取本机 IP 和端口(从 server.port 获取)
    • 发送服务注册请求
  2. 心跳保持

    • 注册成功后,定期发送心跳
    • 默认心跳间隔:5秒
    • Nacos 服务器根据心跳判断服务健康状态
  3. 下线处理

    • 服务正常关闭时,发送下线请求
    • 服务异常关闭时,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 配置说明

  1. 服务注册机制:官方文档详细说明了 Nacos 的服务注册机制,包括自动注册、心跳保持、服务下线等流程。文档强调,Nacos 客户端会在应用启动时自动注册服务,并定期发送心跳以保持服务在线状态。

  2. 配置项说明:官方文档详细列出了所有 Nacos Discovery 的配置项,包括服务器地址、命名空间、分组、元数据等。文档特别说明了命名空间和分组的作用,以及如何利用它们实现环境隔离和服务分组。

  3. 与 Spring Cloud 集成:官方文档提供了完整的 Spring Cloud 集成示例,说明了如何与 Spring Cloud LoadBalancer、OpenFeign 等组件配合使用,实现服务发现和负载均衡。

参考资源

本节小结

在本节中,我们完成了服务提供者注册:

第一个是添加 Nacos 依赖。 在用户服务、商品服务、订单服务的 POM 中添加了 Nacos Discovery 依赖。

第二个是配置文件配置。 为每个服务配置了 Nacos 连接信息,包括服务器地址、命名空间、分组等。

第三个是更新启动类。 在启动类上添加了 @EnableDiscoveryClient 注解(可选,但建议显式添加)。

第四个是注册多个服务。 完成了用户服务、商品服务、订单服务的注册配置。

第五个是服务注册验证。 通过 Nacos 控制台和 API 验证了服务注册是否成功。

第六个是服务注册原理。 了解了服务自动注册、心跳保持、下线处理的机制。

这就是服务提供者注册。现在三个服务都已经注册到 Nacos,可以在 Nacos 控制台看到它们。在下一节,我们将学习服务消费者发现,让订单服务能够通过服务名调用用户服务和商品服务。