第 16 章:Nacos 注册中心
学习目标
- 启动 Nacos Discovery
- 微服务自动注册与发现
- 用 OpenFeign / RestTemplate 调用
- 配置健康检查与负载均衡
一、服务注册中心是什么
服务注册中心 = 服务地址的字典。
服务 A 启动 → 注册到 Nacos (地址、端口、版本)
服务 B 启动 → 注册到 Nacos
服务 B 调用服务 A → 从 Nacos 查 A 的地址列表 → 随机选一个解决:微服务之间互相发现 + 动态扩容 + 健康检查。
二、对比其他注册中心
| 中心 | 一致性 | 性能 | 健康检查 |
|---|---|---|---|
| Eureka | AP(可用优先) | 中 | 心跳 |
| Nacos | AP / CP 可切 | 高 | 心跳 / TCP / HTTP |
| Consul | CP(强一致) | 低 | 多协议 |
| Zookeeper | CP | 中 | TCP |
Nacos 支持 AP 切换到 CP:curl -X PUT 'localhost:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP'
三、Spring Cloud Alibaba 整合
依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>application.yml
spring:
application:
name: order-service
cloud:
nacos:
discovery:
server-addr: localhost:8848
namespace: dev
username: nacos
password: nacos主类
@SpringBootApplication
@EnableDiscoveryClient // ⚠️ 开启服务注册
public class OrderApplication { ... }⚠️ 坑 1:Spring Cloud 2020+ 默认 Nacos 自动注册,但部分版本仍需
@EnableDiscoveryClient。
四、服务注册
启动 order-service,登录 Nacos 控制台 → 服务列表,可见:
order-service | 192.168.1.10:8081 | UP | 1 个实例五、服务发现
5.1 用 DiscoveryClient
@Resource
private DiscoveryClient discoveryClient;
public List<ServiceInstance> getOrderInstances() {
return discoveryClient.getInstances("order-service");
}5.2 OpenFeign 调用(推荐)
依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>@FeignClient(name = "order-service")
public interface OrderClient {
@GetMapping("/order/{id}")
Order getOrder(@PathVariable Long id);
}@Service
public class OrderService {
@Resource
private OrderClient orderClient;
public Order query(Long id) {
return orderClient.getOrder(id);
}
}默认走 Ribbon 负载均衡(轮询)。
⚠️ 坑 2:OpenFeign 默认超时 1s,远程调用慢的接口要配超时:
feign.client.config.order-service.connectTimeout=3000。
六、负载均衡策略
order-service: # 服务名
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule策略:
RoundRobinRule:轮询(默认)RandomRule:随机WeightedResponseTimeRule:响应时间加权NacosRule(Nacos 自带):优先选同集群的实例
七、健康检查
Nacos 心跳机制:
spring:
cloud:
nacos:
discovery:
heart-beat-interval: 5000 # 心跳间隔
heart-beat-timeout: 15000 # 超时判下线实例心跳超时 → 自动从列表剔除,调用方自动剔除故障实例。
⚠️ 坑 3:
heart-beat-timeout<heart-beat-interval是错的,一般设 timeout = 3 × interval。
八、保护阈值(重要)
spring:
cloud:
nacos:
discovery:
threshold: 0.5含义:健康实例数 / 总实例数 < 阈值 → 触发保护,不再剔除实例(避免雪崩)。
生产推荐:threshold: 0.5 ~ 0.7。
⚠️ 坑 4:保护阈值设太高(0.9),故障实例剔除慢;太低(0.1),正常摘除也受影响。
九、集群部署
spring:
cloud:
nacos:
discovery:
cluster-name: BJ # 自定义集群
server-addr: localhost:8848Nacos 控制台可见:
order-service
├─ BJ 集群
│ └─ 192.168.1.10:8081
└─ SH 集群
└─ 192.168.1.20:8081调用方优先同集群,跨集群调用警告。
十、典型微服务结构
gateway(8080)
├─ user-service(8081)
├─ order-service(8082)
└─ pay-service(8083)
所有服务注册到同一个 Nacos namespace调用链路:gateway → user-service → order-service → pay-service
十一、本章小结
| 要点 | 关键 |
|---|---|
| 注册中心 | Nacos = 服务地址字典 |
| 整合 | nacos-discovery + @EnableDiscoveryClient |
| 调用 | OpenFeign + Ribbon 负载均衡 |
| 健康检查 | 心跳超时自动剔除 |
| 保护阈值 | threshold: 0.5 防雪崩 |
| 集群 | cluster-name,优先同集群调用 |
动手练习
- 启动两个
user-service(不同端口),注册到 Nacos - 另一个服务用 OpenFeign 调用
user-service,观察请求被均分 - 故意 kill 一个实例,观察 Nacos 列表和 OpenFeign 调用变化
全系列完结:完成了 Redis、Elasticsearch、MongoDB、RabbitMQ、Kafka、RocketMQ、Nacos 共 16 个中间件核心使用章节。