9.9.5 灰度发布与动态配置

灰度发布与动态配置#

灰度发布与动态配置需要“流量路由 + 版本标识 + 配置隔离”协同。Nacos 提供注册发现与配置中心能力,可与 Spring Cloud Gateway/LoadBalancer 组合实现基于标签/权重的灰度放量,并通过配置推送实现动态刷新。

原理草图(灰度 + 动态配置协同)#

文章图片

安装与前置准备(示例环境)#

示例:单机 Nacos(Docker)

# 1) 拉取镜像
docker pull nacos/nacos-server:v2.2.3

# 2) 启动(单机模式)
docker run -d --name nacos \
  -e MODE=standalone \
  -e NACOS_AUTH_ENABLE=true \
  -p 8848:8848 \
  nacos/nacos-server:v2.2.3

# 3) 验证
curl -s "http://127.0.0.1:8848/nacos" | head -n 3

命令说明
- MODE=standalone:单机运行,适合实验与学习。
- NACOS_AUTH_ENABLE=true:启用权限控制,防止误操作。
- -p 8848:8848:暴露控制台与 API 端口。

灰度发布与动态配置示例(Spring Cloud)#

1)服务实例注册带版本标签#

应用配置:application.yml

spring:
  application:
    name: order-service
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        metadata:
          version: gray  # 灰度实例标识
server:
  port: 8082

启动两组实例

# 稳定版
java -jar order-service-1.0.jar --server.port=8081 \
  --spring.cloud.nacos.discovery.metadata.version=stable

# 灰度版
java -jar order-service-2.0.jar --server.port=8082 \
  --spring.cloud.nacos.discovery.metadata.version=gray

预期效果
- Nacos 控制台服务列表显示两个实例,metadata 不同。
- 网关根据标签路由灰度流量。

2)网关按标签路由(Header 灰度)#

Gateway 配置:application.yml

spring:
  cloud:
    gateway:
      routes:
        - id: order-gray
          uri: lb://order-service
          predicates:
            - Header=X-Gray, true
          filters:
            - Name: LoadBalancerClientFilter
        - id: order-stable
          uri: lb://order-service

说明
- Header=X-Gray, true:请求头含 X-Gray: true 才进入灰度实例。
- 默认请求进入稳定实例。

请求验证

# 稳定请求
curl -s http://127.0.0.1:8080/order/info

# 灰度请求
curl -s -H "X-Gray: true" http://127.0.0.1:8080/order/info

3)动态配置(Nacos 配置中心)#

Nacos 控制台新增配置
- Data ID:order-service.yaml
- Group:DEFAULT_GROUP
- 配置内容:

feature:
  promotion: true
rate:
  limit: 100

Spring Boot 读取与动态刷新

@RefreshScope
@RestController
public class ConfigController {
    @Value("${feature.promotion:false}")
    private boolean promotion;

    @Value("${rate.limit:50}")
    private int limit;

    @GetMapping("/config")
    public String config() {
        return "promotion=" + promotion + ", limit=" + limit;
    }
}

开启 Spring Cloud 动态刷新

# bootstrap.yml 或 application.yml
spring:
  application:
    name: order-service
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
        file-extension: yaml
management:
  endpoints:
    web:
      exposure:
        include: refresh,health,info

验证配置更新

# 修改 Nacos 配置后,服务无需重启即可生效
curl -s http://127.0.0.1:8081/config

灰度 + 配置协同流程(可执行清单)#

  1. 灰度实例上线(version=gray)。
  2. Nacos 发布灰度配置(可用 Group=GRAY_GROUP)。
  3. 网关按 Header/用户 ID 导流。
  4. 观测指标(错误率/延迟)。
  5. 无异常后扩大比例,最终全量并合并配置。

灰度配置隔离示例

# application.yml
spring:
  cloud:
    nacos:
      config:
        group: GRAY_GROUP

关键命令与排错#

查看 Nacos 服务实例

curl -s "http://127.0.0.1:8848/nacos/v1/ns/instance/list?serviceName=order-service"

常见问题与排查
- 灰度不生效:确认网关规则是否正确匹配请求头或用户标签。
- 配置不刷新:检查是否加了 @RefreshScope,并暴露 refresh 端点。
- 实例不注册:核对 server-addr、网络连通性与认证信息。

Nacos 服务日志

docker logs -f nacos | tail -n 50

练习#

  1. 灰度路由练习:基于请求头将 10% 用户路由到灰度实例。
  2. 配置回滚练习:修改 rate.limit 参数,观察变更后回滚到旧值。
  3. 命名空间隔离练习:创建 gray 命名空间,验证不同环境配置隔离效果。