9.9.3 Nacos作为注册中心集成

本节围绕 Nacos 作为注册中心与 Spring Cloud 生态的集成流程,说明依赖引入、服务注册与发现、命名空间与分组、权重与元数据、实例生命周期管理及常见集成注意事项。核心目标是让服务启动即注册、调用即发现、变更可控、治理可观测。

原理草图与交互流程#

文章图片
sequenceDiagram
  participant App as App(A)
  participant Nacos as Nacos Server
  App->>Nacos: 注册实例(IP/端口/元数据)
  loop 心跳
    App->>Nacos: 心跳
  end
  App->>Nacos: 获取服务列表
  Nacos-->>App: 实例列表(权重/健康)

集成步骤与基础配置#

1) 依赖引入(Maven)#

pom.xml(示例为 Spring Boot 2.7.x + Spring Cloud 2021.x)

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>com.alibaba.cloud</groupId>
      <artifactId>spring-cloud-alibaba-dependencies</artifactId>
      <version>2021.0.5.0</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>

<dependencies>
  <dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  </dependency>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
  </dependency>
</dependencies>

2) 应用配置(YAML)#

src/main/resources/application.yml

server:
  port: 8081

spring:
  application:
    name: order-service
  cloud:
    nacos:
      discovery:
        server-addr: 10.0.0.11:8848,10.0.0.12:8848,10.0.0.13:8848
        namespace: dev-namespace-id
        group: ORDER_GROUP
        cluster-name: shanghai
        ip: 10.0.1.21
        metadata:
          version: v1
          region: cn-east

3) 简单服务注册验证(启动日志)#

# 启动应用
$ mvn -q -DskipTests spring-boot:run

# 预期效果:控制台出现 "register service""nacos" 相关日志
# 并能在 Nacos 控制台看到 order-service 实例

4) 服务发现与调用示例#

src/main/java/com/example/OrderController.java

@RestController
@RequestMapping("/order")
public class OrderController {

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/pay")
    public String pay() {
        // service-name 调用,会通过 Nacos 获取实例
        return restTemplate.getForObject("http://pay-service/pay", String.class);
    }
}

@Configuration
class RestConfig {
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

服务注册机制与关键参数#

  • 临时实例(默认):依赖心跳维持,适合弹性服务。
  • 持久化实例:需显式配置,适合固定节点服务。

application.yml(持久化实例)

spring:
  cloud:
    nacos:
      discovery:
        ephemeral: false

心跳参数说明(在 bootstrap.ymlapplication.yml):

spring:
  cloud:
    nacos:
      discovery:
        # 心跳间隔(ms)
        heart-beat-interval: 5000
        # 心跳超时(ms)
        heart-beat-timeout: 15000
        # 删除实例超时(ms)
        ip-delete-timeout: 30000

权重与元数据管理(API示例)#

调整权重(命令示例)#

# 修改实例权重为 2.0
curl -s -X PUT "http://10.0.0.11:8848/nacos/v1/ns/instance" \
  -d "serviceName=order-service" \
  -d "ip=10.0.1.21" \
  -d "port=8081" \
  -d "weight=2.0" \
  -d "namespaceId=dev-namespace-id"

查询服务实例#

curl -s "http://10.0.0.11:8848/nacos/v1/ns/instance/list?serviceName=order-service&namespaceId=dev-namespace-id" | jq .

元数据示例(灰度标签)#

application.yml

spring:
  cloud:
    nacos:
      discovery:
        metadata:
          version: v2
          gray: true

常见问题与处理要点(含排错命令)#

1) 服务未注册#

  • 排错命令与检查点:
# 确认 Nacos 服务端可达
curl -s "http://10.0.0.11:8848/nacos/v1/console/health/readiness"

# 查看应用是否加载到 Nacos 依赖
mvn -q -DskipTests dependency:tree | grep nacos

# 检查端口是否被占用
ss -lntp | grep 8081
  • 处理建议:确认 server-addr、命名空间、网络连通、鉴权配置。

2) 实例频繁上下线#

  • 排错命令:
# 查看应用日志中心跳发送情况
grep -i "heartbeat" -n logs/*.log | tail

# 查看 Nacos Server 健康
curl -s "http://10.0.0.11:8848/nacos/v1/console/health" | jq .
  • 处理建议:调整心跳间隔与超时,检查网络抖动、Nacos Server 负载。

3) 调用不均衡#

  • 排错命令:
# 查看实例权重
curl -s "http://10.0.0.11:8848/nacos/v1/ns/instance/list?serviceName=order-service" | jq '.hosts[]|{ip,port,weight,healthy}'
  • 处理建议:核对权重、健康状态与集群优先策略。

练习与验证#

1) 服务注册练习
- 启动两个实例(端口 8081/8082),并在控制台确认注册成功。

# 启动实例2(覆盖端口)
mvn -q -DskipTests spring-boot:run -Dspring-boot.run.arguments="--server.port=8082"

2) 权重灰度练习
- 将 8082 实例权重设置为 0.1,观察流量倾斜。

curl -s -X PUT "http://10.0.0.11:8848/nacos/v1/ns/instance" \
  -d "serviceName=order-service" \
  -d "ip=10.0.1.21" \
  -d "port=8082" \
  -d "weight=0.1"

3) 故障演练
- 停止 8082 实例,验证服务发现是否自动剔除。

# 关闭实例2后检查实例列表
curl -s "http://10.0.0.11:8848/nacos/v1/ns/instance/list?serviceName=order-service" | jq '.hosts[]|{ip,port,healthy}'

本节完成后,应具备在 Spring Cloud 应用中将 Nacos 作为注册中心的完整实践能力,确保服务注册稳定、发现可靠,并支持多环境治理。