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.yml 或 application.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 作为注册中心的完整实践能力,确保服务注册稳定、发现可靠,并支持多环境治理。