文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

SpringCloud如何实现灰度发布

2023-06-30 16:33

关注

这篇文章主要讲解了“SpringCloud如何实现灰度发布”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SpringCloud如何实现灰度发布”吧!

1.什么是灰度发布?

灰度发布又称金丝雀发布,是在系统升级的时候能够平滑过渡的一种发布方式。在其上可以进行A/B测试,即让一部分用户继续用产品特性A,一部分用户开始用产品特性B,如果用户对B没有什么反对意见,那么逐步扩大范围,把所有用户都迁移到B上面来。灰度发布可以保证整体系统的稳定,在初始灰度的时候就可以发现、调整问题,以保证其影响度。

关于金丝雀发布名称的来历:矿工下要矿井,要验证是否有瓦斯,金丝雀对瓦斯很敏感,通过观察金丝雀的反应判断是否安全。

2.灰度发布有什么作用?

降低发布带来的影响,虽然功能都在测试环境测过,但毕竟没有发布到生产环境,如果先让少部分用户先使用新版本,提前发现bug,或者性能问题,提前做好修复,就可以降低新版本带来的影响;

通过对新老版本的对比,观察新版本带来的效果。结合工作中使用到的灰度发布实践和对其他大厂的灰度发布调研,总结了以下灰度发布方案。

3.灰度发布的实现方式:网关到服务,服务到服务

3.1网关到服务代码实现

1.1整体流程

指定灰度规则->预制代码规则->springcloud自定义metadata

1.2前置环境(需要自行搭建四个至少服务)

1.3核心代码

pom.xml

        <!-- 实现通过 metadata 进行灰度路由 -->        <dependency>            <groupId>io.jmnarloch</groupId>            <artifactId>ribbon-discovery-filter-spring-cloud-starter</artifactId>            <version>2.1.0</version>        </dependency>

灰度过滤器(核心代码)

@Componentpublic class GrayFilter extends ZuulFilter {    @Override    public String filterType() {        return FilterConstants.PRE_TYPE;    }     @Override    public int filterOrder() {        return 0;    }     @Override    public boolean shouldFilter() {        return true;//return false 关闭该过滤器    }     @Autowired    private CommonGrayRuleDaoCustom commonGrayRuleDaoCustom;     @Override    public Object run() throws ZuulException {        RequestContext currentContext = RequestContext.getCurrentContext();        HttpServletRequest request = currentContext.getRequest();         String userId = request.getHeader("userId");        // 根据用户id查规则查库,        String rule = findRuleById(userId);         // 金丝雀        if ("v1".equals(rule)) {            RibbonFilterContextHolder.getCurrentContext().add("version", "v1");            // 普通用户        } else if ("v2".equals(rule)) {            RibbonFilterContextHolder.getCurrentContext().add("version", "v2");        }         return null;    }     //查库的伪代码    private String findRuleById(String userId) {        Map<String, String> map = new HashMap();        map.put("9527", "v1");        map.put("9528", "v2");        return map.get(userId);    } }

3.2网关到服务代码实现

2.1整体流程

springcloud自定义metadata->获取当前用户的版本->遍历服务获取服务的的版本,返回合适的服务

2.2前置环境(需要自行搭建5个至少服务)

2.3核心代码

threadlocal工具类 

public class RibbonParameters {    private static final ThreadLocal local = new ThreadLocal();     public static <T> T get() {        return (T) local.get();    }     public static <T> void set(T t) {        local.set(t);    }}

 切面获取version的值 

@Aspect@Componentpublic class RequestAspect {     @Pointcut("execution(* com.mashibing.apipassenger.controller..*Controller*.*(..))")    private void anyMehtod() {     }     @Before(value = "anyMehtod()")    public void before(JoinPoint joinPoint) {         HttpServletRequest request = ((ServletRequestAttributes)         RequestContextHolder.getRequestAttributes()).getRequest();        String version = request.getHeader("version");        //方式二:        HashMap<Object, Object> map = new HashMap<>();        map.put("version",version);        RibbonParameters.set(map);    }

rule规则

import com.netflix.client.config.IClientConfig;import com.netflix.loadbalancer.AbstractLoadBalancerRule;import com.netflix.loadbalancer.ILoadBalancer;import com.netflix.loadbalancer.Server;import com.netflix.niws.loadbalancer.DiscoveryEnabledServer;import org.springframework.context.annotation.Configuration; import java.util.List;import java.util.Map; @Configurationpublic class GrayRule extends AbstractLoadBalancerRule {     @Override    public void initWithNiwsConfig(IClientConfig clientConfig) {    }     @Override    public Server choose(Object key) {        return choose(getLoadBalancer(), key);    }     private Server choose(ILoadBalancer lb, Object key) {        System.out.println("灰度,rule");        Server server = null;        while (server == null) {            List<Server> reachableServers = lb.getReachableServers();            //获取当前线程的参数 用户 version=v1            Map<String, String> map = (Map<String, String>) RibbonParameters.get();            String version = "";            if (map != null && map.containsKey("version")) {                version = map.get("version");            }            System.out.println("当前rule,version=" + version);            //遍历服务列表选取用户服务            for (int i = 0; i < reachableServers.size(); i++) {                server = reachableServers.get(i);                //用户的version知道了,服务自定义的meta不知道                Map<String, String> metadata = ((DiscoveryEnabledServer) server).getInstanceInfo().getMetadata();                String metaMap = metadata.get("version");                 //用户的version知道了,服务meta也知道了                if (version.trim().equals(metaMap)) {                    return server;                }            }         }        return null;    }}

注意:提前踩坑,No qualifying bean of type &lsquo;com.netflix.loadbalancer.IRule&lsquo; available: expected single matching bean

SpringCloud如何实现灰度发布

当是觉得很奇怪,命名自己只定义了grayRule负载均衡策略规则,metadataAwareRule这个我代码中并没有。经过排查自己使用在pom中引入了Ribbon的包,该包默认会带负载均衡策略规则。导致有多个规则,从而报错。

<dependency>    <groupId>io.jmnarloch</groupId>    <artifactId>ribbon-discovery-filter-spring-cloud-starter</artifactId>    <version>2.1.0</version></dependency>

删除该包即可

删除后重新运行

SpringCloud如何实现灰度发布

服务与服务的灰度发布的另外一种方式:可以在requestAspect中获取到version后,直接比对版本:RibbonFilterContextHolder.getCurrentContext().add("version", "v1"),这种凡是与网关与服务的灰度发布相似。

感谢各位的阅读,以上就是“SpringCloud如何实现灰度发布”的内容了,经过本文的学习后,相信大家对SpringCloud如何实现灰度发布这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯