注册中心高可用:Nacos 集群与保护阈值
注册中心是微服务的“通信录”,一旦宕机,新实例无法注册、消费者拿不到地址,故障会迅速放大。本章讲 Nacos 生产级部署的两件事:集群化保证自身高可用,保护阈值防止下游雪崩。
集群部署要点
Nacos 生产环境建议至少 3 节点组成集群,并外接 MySQL 作为数据源(默认内嵌 Derby 仅适合单机体验)。集群节点间通过一致性协议协调服务元数据,官方文档对临时实例与持久实例使用的一致性协议(如临时实例走 Distro 类 AP 协议、持久实例走 Raft 类 CP 协议)有详细说明,选型细节以官方文档为准。
- 准备 MySQL,执行官方提供的建表脚本,创建
nacos_config等库。 - 每台节点配置数据源:
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://10.0.0.10:3306/nacos_config?characterEncoding=utf8&serverTimezone=UTC
db.user=nacos
db.password=your-password
- 编写集群成员文件
conf/cluster.conf,每行一个节点:
10.0.0.1:8848
10.0.0.2:8848
10.0.0.3:8848
- 依次启动各节点(
startup.sh -m cluster)。
端口规划
Nacos 2.x 起客户端与服务端默认走 gRPC:主端口 8848 提供 HTTP/控制台,客户端 gRPC 端口约为主端口 +1000(9848),服务端间通信另有端口。部署在云环境/NAT 后时必须把相关端口一并放通,否则会出现“能看控制台、服务却连不上”的经典问题;完整端口说明以官方文档为准。
前置负载均衡与健康检查
客户端通过一个虚拟入口访问集群,通常前置 Nginx 或 SLB:
upstream nacos-cluster {
server 10.0.0.1:8848;
server 10.0.0.2:8848;
server 10.0.0.3:8848;
}
server { listen 8848; location / { proxy_pass http://nacos-cluster; } }
客户端配置 spring.cloud.nacos.server-addr=nacos.example.com:8848 指向虚拟入口即可。注意:多节点间时钟偏差、机器单点、数据库单点都会拖垮“集群”,数据库也要做主从或云 RDS。
健康检查与保护阈值
Nacos 对实例有主动/被动健康检查机制:临时实例靠客户端心跳维持(超时未上报会被标记不健康并摘除),持久实例由服务端主动探测,细节以官方文档为准。
保护阈值是 Nacos 的自我保护能力,配置在某个具体服务上(控制台“服务详情”可调,取值范围 0~1,默认 0 表示关闭):
- 含义:当“健康实例数 / 总实例数”的比例低于该阈值时,说明健康实例已很少。
- 行为:此时即使把健康实例全部返回给消费者,流量也可能把它们瞬间压垮,因此 Nacos 会把不健康实例也一并返回,让请求“雨露均沾”地分摊,避免剩余健康实例过载雪崩。
# 客户端无需特殊配置;保护阈值在 Nacos 控制台/OpenAPI 按服务设置
# 例如阈值设 0.5:健康比例低于 50% 时进入保护,返回全部实例
这本质上是“用正确性换可用性”:下游已经大面积故障时,宁可让部分请求打到不健康实例上快速失败,也不能让幸存的健康实例被集中流量打死。阈值不宜设过高(如 0.9),否则稍有波动就频繁保护,掩盖真实故障。
集群验证
集群部署完成后建议演练验证:停掉 1 个节点观察注册/发现是否正常;停到只剩 1 个节点观察行为;再配合熔断、降级看消费方是否雪崩。这类演练应该定期做,并纳入故障预案文档。
小结
Nacos 集群解决“注册中心自己不能挂”,保护阈值解决“下游服务大规模故障时不雪崩”。前者靠多节点+MySQL+负载均衡,后者靠服务级阈值配置;两者配合,注册中心链路才真正具备高可用能力。