美文网首页
灰度发布思路

灰度发布思路

作者: 川流不息attitude | 来源:发表于2022-06-14 17:38 被阅读0次

灰度发布思路

1. 重写gateway 里面的 负载均衡 filter

2. 拿到对应实例的 列表数据,及元信息

3.获取请求头传过来的版本号,对比实例元信息,找到对应实例(多个可以自定义算法)我这里取第一个

响应式
public class CustomReactiveLoadBalancerClientFilter extends ReactiveLoadBalancerClientFilter 

// 核心方法
private Mono<Response<ServiceInstance>> choose(Request<RequestDataContext> lbRequest, String serviceId, Set<LoadBalancerLifecycle> supportedLifecycleProcessors) {
        ReactorLoadBalancer<ServiceInstance> loadBalancer = (ReactorLoadBalancer)this.clientFactory.getInstance(serviceId, ReactorServiceInstanceLoadBalancer.class);
        if (loadBalancer == null) {
            throw new NotFoundException("No loadbalancer available for " + serviceId);
        } else {
            supportedLifecycleProcessors.forEach((lifecycle) -> {
                lifecycle.onStart(lbRequest);
            });
            RequestDataContext requestContext = lbRequest.getContext();
            HttpHeaders headers = requestContext.getClientRequest().getHeaders();
            List<String> versions = headers.get("version");
            if(!CollectionUtils.isEmpty(versions)){
                log.info("找到 实例 {}",versions.get(0));
                List<ServiceInstance> instances = discoveryClient.getInstances(serviceId);
                for (int i = 0; i < instances.size(); i++) {
                    Map<String, String> metadata = instances.get(i).getMetadata();
                    String version = metadata.get("version");
                    if(Objects.equals(versions.get(0),version)){
                        return Mono.just(new DefaultResponse(instances.get(i)));
                    }
                }
            }

            return loadBalancer.choose(lbRequest);
        }
    }
阻塞式
public class CustomLoadBalancerClientFilter extends LoadBalancerClientFilter
// 核心方法
 @Override
    protected ServiceInstance choose(ServerWebExchange exchange) {
        HttpHeaders headers = exchange.getRequest().getHeaders();
        List<String> stringList = headers.get("version");
        String version = null;
        if(!StringUtils.isEmpty(stringList)){
            version = stringList.get(0);
        }
        String host = ((URI) exchange.getAttribute(ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR)).getHost();
        List<ServiceInstance> instances = discoveryClient.getInstances(host);
        for (int i = 0; i < instances.size(); i++) {
            Map<String, String> metadata = instances.get(i).getMetadata();
            String metadataVersion = metadata.get("version");
            if(Objects.equals(version,metadataVersion)){
                return instances.get(i);
            }
        }


        return super.choose(exchange);
    }

元信息

image.png

思路就是这样,在重写一个 Feign 调用的 负载算法就ok了,这样就可以实现 多实例 多版本线上 测试,测试新版本没问题 在全面升级。

完善的可以参考 开源 Discovery

相关文章

  • 灰度发布思路

    灰度发布思路 1. 重写gateway 里面的 负载均衡 filter 2. 拿到对应实例的 列表数据,及元信息 ...

  • 灰度发布用户选取

    近日接触的项目涉及到“灰度发布”的概念,这是第一次接触灰度发布,因此对灰度发布用户选取的方式十分好奇。“灰度发布(...

  • Openshift上使用Nginx Pod作灰度发布

    参考文章:使用 Nginx 实现灰度发布 什么是灰度发布 【百度百科】灰度发布(又名金丝雀发布)是指在黑与白之间,...

  • 灰度发布discovery原理源码分析及多发布分组设计与实现

    关键字:saas灰度 灰度发布 装饰模式 桥接模式 spring cloud 公司 saas 平台,灰度发布用于先...

  • 浅谈灰度发布

    什么是灰度发布 所谓灰度发布就是将软件新功能版本先发布到灰度区进行可控范围的验证,如果验证结果良好,再进行正式发布...

  • 实现一套灰度发布系统需要考虑哪些问题?

    要了解一个灰度发布系统的功能,个人觉得有必要先了解灰度发布的概念定义和灰度发布流程,从概念和流程中明确灰度的目的并...

  • 什么是灰度发布,灰度测试。

    什么是灰度发布? 灰度发布,又名金丝雀发布,或者灰度测试,是指在黑与白之间能够平滑过渡的一种发布方式。在其上可以进...

  • 灰度发布

    灰度发布:灰度很简单,发布很复杂 - 程序人生的博客 - CSDN博客 灰度发布常见一般有三种方式 - 蒋大帅-蒋...

  • 如何进行灰度发布,考虑啥

    灰度发布的定义: 灰度发布是指在黑与白之间,能够平滑过渡的一种发布方式。AB test就是一种灰度发布方式,让一部...

  • 灰度发布

    灰度发布 更新日志: 一、定义 按照一定策略选取部分用户,让他们先行体验新版本的应用,通过收集这部分用户对新版本应...

网友评论

      本文标题:灰度发布思路

      本文链接:https://www.haomeiwen.com/subject/snlgprtx.html