← 返回主页
案例 01
Nacos 生产集群搭建与高可用配置

背景描述

某公司 30+ 微服务使用 Nacos 1.x 单节点,某次 Nacos 宕机导致全链路服务发现中断 2 小时。需升级至 Nacos 2.x 并部署高可用集群。

解决方案

部署 3 节点 Nacos 2.2 集群 + MySQL 8.0(主从)做持久化存储。使用 gRPC 长连接替代 HTTP 短轮询,降低资源消耗。Nginx 做负载均衡转发。

技术要点

  • Nacos 2.x 使用 gRPC + MCP over HTTP 双通道
  • MySQL 集群存储服务注册信息和配置数据
  • Nginx upstream 配置 weight 分流 3 节点
  • 鉴权:nacos.core.auth.enabled=true,自定义密钥
# application.properties(每节点 cluster.conf 相互配置) nacos.inetutils.ip-address=192.168.1.21 server.port=8848 spring.datasource.platform=mysql db.url.0=jdbc:mysql://mysql-master:3306/nacos?useSSL=false db.user=nacos db.password= nacos.core.auth.enabled=true nacos.core.auth.plugin.nacos.token.secret.key= nacos.core.auth.server.identity.key=serverIdentity nacos.core.auth.server.identity.value=security # cluster.conf(每节点相同) 192.168.1.21:8848 192.168.1.22:8848 192.168.1.23:8848 # Nginx 配置 upstream nacos_cluster { server 192.168.1.21:8848 weight=5; server 192.168.1.22:8848 weight=5; server 192.168.1.23:8848 weight=5; } server { listen 8848; location /nacos/ { proxy_pass http://nacos_cluster; proxy_set_header Host $host; } }
案例 02
配置中心多环境管理与灰度发布

背景描述

开发/测试/预发/生产四套环境,每套环境各有 20+ 配置文件。之前用本地 application.yml 管理,改配置需重新打包。需迁移到 Nacos 配置中心统一管理。

解决方案

Nacos Namespace 隔离环境(dev/test/staging/prod),Data ID 命名规范:{service}-{env}.yaml。利用 Nacos Group 实现灰度配置:DEFAULT_GROUP 全量,GRAY_GROUP 灰度。

技术要点

  • Namespace ID 对应各环境,配置和服务完全隔离
  • Data ID 命名规范:{spring.application.name}-{profile}.{ext}
  • 灰度场景:修改 GRAY_GROUP 配置,仅灰度机器生效
  • 动态刷新:@RefreshScope 注解 + @Value 实现不重启更新
# Spring Boot bootstrap.yml spring: application: name: order-service cloud: nacos: config: server-addr: nacos.example.com:8848 namespace: ${NACOS_NAMESPACE:prod} # 按环境注入 file-extension: yaml group: DEFAULT_GROUP refresh-enabled: true discovery: server-addr: nacos.example.com:8848 namespace: ${NACOS_NAMESPACE:prod} # 灰度机器通过启动参数指定 java -jar order-service.jar \ --NACOS_NAMESPACE=prod \ --spring.cloud.nacos.config.group=GRAY_GROUP # 配置变更后动态刷新 curl -X POST 'http://order-service/actuator/refresh'
案例 03
Nacos 服务健康检查失效导致流量打到异常节点

背景描述

某服务更新后部分节点 OOM 假死(进程在但无法处理请求),Nacos 临时实例的健康检查心跳正常,导致网关持续转发流量到异常节点,大量请求超时。

解决方案

将关键服务的实例类型切换为永久实例(ephemeral=false),添加 Spring Boot Actuator 自定义健康端点。网关侧配合 Sentinel 熔断兜底。

技术要点

  • 临时实例 vs 永久实例:临时靠心跳(5s),永久靠 Nacos Server 主动探测
  • 永久实例需手动注销,但支持更精准的健康检查
  • 健康端点检测数据库连接、Redis 连通性等真实服务能力
  • 额外配置 Sentinel 网关流控规则,异常比例 >50% 自动熔断
# 切换为永久实例 spring: cloud: nacos: discovery: ephemeral: false # 永久实例,服务端主动健康检查 # 自定义健康端点 @Component public class CustomHealthIndicator implements HealthIndicator { @Override public Health health() { // 检查数据库连接 boolean dbOk = checkDatabaseConnection(); boolean redisOk = checkRedisConnection(); if (dbOk && redisOk) { return Health.up() .withDetail("database", "OK") .withDetail("redis", "OK") .build(); } return Health.down() .withDetail("database", dbOk ? "OK" : "DOWN") .withDetail("redis", redisOk ? "OK" : "DOWN") .build(); } }