聊一聊Spring Cloud 微服务灰度发布
什么是灰度发布
- 灰度发布是一种渐进式的软件发布策略。它允许新版本服务先对小部分用户或流量开放,验证无误后再逐步扩大范围,最终完成全量发布
- 下面让
DeepSeek帮我们回答一下灰度发布的实现原理:

- 简单的来说就是请求头携带灰度标识,在服务之间调度之前需要从请求头中获取灰度标识,然后从服务注册中心中获取实例,获取到所有可用的服务实例后通过灰度标识进行筛选目标服务,然后调用目标服务,调用服务也要往下传递灰度标识
思路
- 到这里我们大概了解灰度发布,接下来我们通过
Nacos作为服务注册中心 - 客户端请求 ->
Spring Cloud Gateway->实例服务A(传递灰度标识给下游)->实例服务B
Step1
- 可重写
Spring Cloud Gateway网关 过滤器,在过滤器中获取需要调用的服务所有实例,尝试从请求头中获取灰度标识,如果有则通过灰度标识筛选出所有可用的目标服务,然后通过算法(如轮询算法)得到最终调用的服务,例如服务A
Step2
- 当从
Spring Cloud Gateway网关请求到服务A,如果服务A需要调用服务B,服务A再请求服务B之前,可通过重写负载均衡,从请求头中获取灰度标识,,然后获取到所有可用的服务B实例后,通过灰度标识进行筛选目标服务(需要注意的是,灰度发布的实例B可用部署了多个),然后通过算法(如轮询算法)得到最终需要调用的服务B,调用服务B也要往下传递灰度标识 - 每个服务之间以此类推进行灰度筛选调用
注意点
- Spring 官方明确指出,如果是通过
DiscoveryClient获取服务实例,需要禁用loadbalancer负载均衡缓存,此缓存默认是开启的,避免双重缓存

-
从警告中可以看到Spring 官方给出的提示:
“虽然基本的非缓存实现对于原型设计和测试很有用,但它的效率远低于缓存版本,因此我们建议在生产环境中始终使用缓存版本。DiscoveryClient例如EurekaDiscoveryClient,如果实现已完成缓存,则应禁用负载均衡器缓存,以防止双重缓存” -
通过源码跟踪可看到 Nacos DiscoveryClient 获取实例存在缓存机制,获取的实例是从一个
serviceInfoMap缓存Map中取出服务实例信息,然后从服务信息serviceInfo.getHosts()取出实例集合,如下图


- 因此在通过Nacos DiscoveryClient 获取实例存在缓存机制时,需要禁用
loadbalancer负载均衡默认缓存,避免双重缓存

浙公网安备 33010602011771号