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
灰度 + 配置协同流程(可执行清单)#
- 灰度实例上线(
version=gray)。 - Nacos 发布灰度配置(可用
Group=GRAY_GROUP)。 - 网关按 Header/用户 ID 导流。
- 观测指标(错误率/延迟)。
- 无异常后扩大比例,最终全量并合并配置。
灰度配置隔离示例
# 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
练习#
- 灰度路由练习:基于请求头将 10% 用户路由到灰度实例。
- 配置回滚练习:修改
rate.limit参数,观察变更后回滚到旧值。 - 命名空间隔离练习:创建
gray命名空间,验证不同环境配置隔离效果。