聊一聊Spring Cloud 微服务灰度发布

什么是灰度发布

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

image

  • 简单的来说就是请求头携带灰度标识,在服务之间调度之前需要从请求头中获取灰度标识,然后从服务注册中心中获取实例,获取到所有可用的服务实例后通过灰度标识进行筛选目标服务,然后调用目标服务,调用服务也要往下传递灰度标识

思路

  • 到这里我们大概了解灰度发布,接下来我们通过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负载均衡缓存,此缓存默认是开启的,避免双重缓存

image

  • 从警告中可以看到Spring 官方给出的提示:“虽然基本的非缓存实现对于原型设计和测试很有用,但它的效率远低于缓存版本,因此我们建议在生产环境中始终使用缓存版本。DiscoveryClient例如EurekaDiscoveryClient,如果实现已完成缓存,则应禁用负载均衡器缓存,以防止双重缓存”

  • 通过源码跟踪可看到 Nacos DiscoveryClient 获取实例存在缓存机制,获取的实例是从一个serviceInfoMap缓存Map中取出服务实例信息,然后从服务信息serviceInfo.getHosts()取出实例集合,如下图

image

image

  • 因此在通过Nacos DiscoveryClient 获取实例存在缓存机制时,需要禁用loadbalancer负载均衡默认缓存,避免双重缓存
posted @ 2025-05-04 17:21  程序员の奇妙冒险  阅读(35)  评论(0)    收藏  举报