日升时奋斗,日落时自省
目录
1、实现框架
Spring Cloud全链路灰色发布实现构架:
灰度发布的具体实现 :
前端程序在灰度测试用户Header头中打上标签,例如Header中添加一个参数"gray-tay:true",其表示要进行会灰度测试的(访问灰度服务),而其他则为正式服务
在负载均衡器Spring Cloud LoadBalancer中,拿到Header中的"gray-tag"进行判断,如果此标签不为空,并等于"true"的话,表示要访问灰度发布的服务,否则只访问正式的服务
在网关Spring Cloud Gateway中,Header标签"gray-tag:true"继续往下一服务中传传递(因为通过网关的时候,是从新发送请求,Header中是没有灰度标签的)
在后续的调用服务中,需要实现以下两个关键功能:
- 在负载均衡器Spring Cloud LoadBalancer中,判断灰度发布标签,将请求分发到对应服务
- 将灰度发布标签(如果存在),继续传递给下一个调用的服务
经过第四步的反复传递之后,整个Spring Cloud全链路的灰度发布就完成了
2、负载均衡模块
实现ReactorServiceInstanceLoadBalancer接口
public class GrayLoadBalancer implements ReactorServiceInstanceLoadBalancer{
private static final Log log = LogFactory.getLog(GrayLoadBalancer.class);
private final String serviceId;
private AtomicInteger position; // 位置,下标
private ObjectProvider<ServiceInstanceListSupplier> serviceInstanceListSupplierProvider;
public GrayLoadBalancer(ObjectProvider<ServiceInstanceListSupplier> serviceInstanceListSupplierProvider, String serviceId) {
this.serviceId = serviceId;
this.serviceInstanceListSupplierProvider = serviceInstanceListSupplierProvider;
this.position = new AtomicInteger(new Random().nextInt(1000)); //随机进行设置一个值
}
public Mono<Response<ServiceInstance>> choose(Request request) {
// 提供备选的服务实例列表
ServiceInstanceListSupplier supplier = (ServiceInstanceList