Skip to content
第 16 章 ⏱ 13 分钟阅读

第 16 章:Nacos 注册中心 ​

学习目标 ​

  • 启动 Nacos Discovery
  • 微服务自动注册与发现
  • 用 OpenFeign / RestTemplate 调用
  • 配置健康检查与负载均衡

一、服务注册中心是什么 ​

服务注册中心 = 服务地址的字典。

text
服务 A 启动 → 注册到 Nacos (地址、端口、版本)
服务 B 启动 → 注册到 Nacos
服务 B 调用服务 A → 从 Nacos 查 A 的地址列表 → 随机选一个

解决:微服务之间互相发现 + 动态扩容 + 健康检查。

二、对比其他注册中心 ​

中心一致性性能健康检查
EurekaAP(可用优先)中心跳
NacosAP / CP 可切高心跳 / TCP / HTTP
ConsulCP(强一致)低多协议
ZookeeperCP中TCP

Nacos 支持 AP 切换到 CP:curl -X PUT 'localhost:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP'

三、Spring Cloud Alibaba 整合 ​

依赖 ​

xml
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

application.yml ​

yaml
spring:
  application:
    name: order-service
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
        namespace: dev
        username: nacos
        password: nacos

主类 ​

java
@SpringBootApplication
@EnableDiscoveryClient    // ⚠️ 开启服务注册
public class OrderApplication { ... }

⚠️ 坑 1:Spring Cloud 2020+ 默认 Nacos 自动注册,但部分版本仍需 @EnableDiscoveryClient。

四、服务注册 ​

启动 order-service,登录 Nacos 控制台 → 服务列表,可见:

text
order-service | 192.168.1.10:8081 | UP | 1 个实例

五、服务发现 ​

5.1 用 DiscoveryClient ​

java
@Resource
private DiscoveryClient discoveryClient;

public List<ServiceInstance> getOrderInstances() {
    return discoveryClient.getInstances("order-service");
}

5.2 OpenFeign 调用(推荐) ​

依赖:

xml
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
java
@FeignClient(name = "order-service")
public interface OrderClient {

    @GetMapping("/order/{id}")
    Order getOrder(@PathVariable Long id);
}
java
@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。

六、负载均衡策略 ​

yaml
order-service:                # 服务名
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

策略:

  • RoundRobinRule:轮询(默认)
  • RandomRule:随机
  • WeightedResponseTimeRule:响应时间加权
  • NacosRule(Nacos 自带):优先选同集群的实例

七、健康检查 ​

Nacos 心跳机制:

yaml
spring:
  cloud:
    nacos:
      discovery:
        heart-beat-interval: 5000       # 心跳间隔
        heart-beat-timeout: 15000       # 超时判下线

实例心跳超时 → 自动从列表剔除,调用方自动剔除故障实例。

⚠️ 坑 3:heart-beat-timeout < heart-beat-interval 是错的,一般设 timeout = 3 × interval。

八、保护阈值(重要) ​

yaml
spring:
  cloud:
    nacos:
      discovery:
        threshold: 0.5

含义:健康实例数 / 总实例数 < 阈值 → 触发保护,不再剔除实例(避免雪崩)。

生产推荐:threshold: 0.5 ~ 0.7。

⚠️ 坑 4:保护阈值设太高(0.9),故障实例剔除慢;太低(0.1),正常摘除也受影响。

九、集群部署 ​

yaml
spring:
  cloud:
    nacos:
      discovery:
        cluster-name: BJ                  # 自定义集群
        server-addr: localhost:8848

Nacos 控制台可见:

text
order-service
├─ BJ 集群
│   └─ 192.168.1.10:8081
└─ SH 集群
    └─ 192.168.1.20:8081

调用方优先同集群,跨集群调用警告。

十、典型微服务结构 ​

text
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,优先同集群调用

动手练习 ​

  1. 启动两个 user-service(不同端口),注册到 Nacos
  2. 另一个服务用 OpenFeign 调用 user-service,观察请求被均分
  3. 故意 kill 一个实例,观察 Nacos 列表和 OpenFeign 调用变化

全系列完结:完成了 Redis、Elasticsearch、MongoDB、RabbitMQ、Kafka、RocketMQ、Nacos 共 16 个中间件核心使用章节。

本站基于 VitePress 构建 · 由 StackHub 团队维护