返回顶部
首页 > 资讯 > 精选 >SpringCloud如何实现灰度发布
  • 578
分享到

SpringCloud如何实现灰度发布

2023-06-30 16:06:24 578人浏览 八月长安
摘要

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

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

1.什么是灰度发布?

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

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

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

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

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

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

3.1网关到服务代码实现

1.1整体流程

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

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

  • eureka:注册中心

  • zuul:网关

  • service-v1:集群服务v1版本

  • service-v2:集群服务v2版本

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个至少服务)

  • eureka:注册中心

  • service-A:服务调用方

  • service-v1:集群服务v1版本

  • service-v2:集群服务v2版本

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如何实现灰度发布这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: SpringCloud如何实现灰度发布

本文链接: https://lsjlt.com/news/330263.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • SpringCloud如何实现灰度发布
    这篇文章主要讲解了“SpringCloud如何实现灰度发布”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SpringCloud如何实现灰度发布”吧!1.什么是灰度发布?灰度发布又称金丝雀发布...
    99+
    2023-06-30
  • SpringCloud实现灰度发布的方法步骤
    目录1.什么是灰度发布?2.灰度发布有什么作用?3.灰度发布的实现方式:网关到服务,服务到服务3.1网关到服务代码实现3.2网关到服务代码实现1.什么是灰度发布? 灰度发布又称金丝雀...
    99+
    2024-04-02
  • java灰度发布如何实现
    Java灰度发布是指在发布新版本时,只将一部分用户引流到新版本,以验证新版本的稳定性和性能,最终再将全部用户引流到新版本。下面是几种...
    99+
    2023-10-27
    java
  • 什么是灰度发布?灰度发布几种类型
    一、方案背景介绍 1. 什么是灰度发布 灰度发布是指在 黑和白(0和1)之间,能够平滑过渡的一种发布方式。 AB test就是一种灰度发布方式,指为产品已发布A版本,在发布B版本时,在同一时间维度, 让一部分用户继续用A版本,一部分用户开始...
    99+
    2023-08-18
    java 服务器 运维
  • springboot怎么实现接口灰度发布
    这篇文章主要介绍“springboot怎么实现接口灰度发布”,在日常操作中,相信很多人在springboot怎么实现接口灰度发布问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”springboot怎么实现接口灰...
    99+
    2023-06-29
  • springboot 实现接口灰度发布的实例详解
    目录前言最小化改造方式springmvc接口请求原理HandlerMapping简介RequestCondition接口定义代码实现过程1、添加一个自定义注解用于标注接口类以及接口方...
    99+
    2024-04-02
  • F5与Openshift集成怎么实现灰度发布
    这期内容当中小编将会给大家带来有关F5与Openshift集成怎么实现灰度发布,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一、为什么要使用灰度发布什么是灰度发布灰度发布是指在黑与白之间,能够平滑过渡的一...
    99+
    2023-06-04
  • 大数据中如何分析蓝绿发布、灰度发布和滚动发布
    这篇文章给大家介绍大数据中如何分析蓝绿发布、灰度发布和滚动发布,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。应用程序升级面临最大挑战是新旧业务切换,将软件从测试的最后阶段带到生产环境,同时要保证系统不间断提供服务。长期...
    99+
    2023-06-19
  • 一文带你了解Vue灰度发布
    Vue灰度发布是指在发布新版本的时候,只将新版本的一部分用户引流到新版本上,以便测试新版本的稳定性和功能是否正常。灰度发布是一种渐进...
    99+
    2023-09-22
    Vue
  • python实现灰度图
    本文实例为大家分享了python实现灰度图的具体代码,供大家参考,具体内容如下 任务描述 背景 真彩色图像和灰度图像是数字图像的两种常见类型,如下图所示,左图是真彩色图像,右图是灰度...
    99+
    2024-04-02
  • springcloud如何用Redlock实现分布式锁
    目录一、redlock简介 二、怎么用java使用 redlock 三、参考资料 之前写过一篇文章《如何在springcloud分布式系统中实现分布式锁? 》,由于自己仅仅是阅读了相...
    99+
    2024-04-02
  • SpringCloud协同开发如何实现
    本文小编为大家详细介绍“SpringCloud协同开发如何实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“SpringCloud协同开发如何实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。微服务注册问题像下...
    99+
    2023-07-04
  • 使用Docker Compose、Nginx和MariaDB实现PHP应用程序的灰度发布
    灰度发布是一种软件发布的策略,通过在生产环境中逐步引入新版本,来缓解发布带来的风险。在实际应用中,我们可以通过使用Docker Compose来管理容器化的应用程序,结合Nginx负载均衡和MariaDB来实现灰度发布。Docker Com...
    99+
    2023-10-21
    Docker nginx mariadb
  • Python灰度变换中灰度切割分析实现
    目录1. 介绍2. 灰度切割代码实现3. 阈值处理1. 介绍 灰度切割:增强特定范围的对比度,突出图像中特定范围的亮度(灰度级分层也叫灰度切割) 实现灰度切割的方法有很多种,但基本的...
    99+
    2024-04-02
  • 浅谈Vue灰度发布新功能的使用
    目录概述组件级别页面级别方案一 新增入口页面分发方案二 高阶组件方案方案三 动态Router.js引入总结参考什么是灰度发布?百度百科的解释如下。 灰度发布是指在黑与白之间,能够平滑...
    99+
    2024-04-02
  • 用小程序灰度发布,整点新鲜的!
    “不就是提个小需求么?你们怎么反应那么慢?”“你们这个需求排不到App里面,不予立项”“你们产品写的需求文档不是我们要的效果啊,我们看重的是……”“排队排队排队,研发人不够,排期已经到下个月中了。”“功能测试已经通过了,但是App近期没有上...
    99+
    2023-06-05
  • C++如何实现基于灰度图上色GrayToColorFromOthe
    小编给大家分享一下C++如何实现基于灰度图上色GrayToColorFromOthe,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!场景需求   ...
    99+
    2023-06-20
  • SpringCloudGateway Nacos GitlabRunner全自动灰度服务搭建发布
    目录1 | 业务场景说明2 | 具体实现方案2.1 | SCG2.2 | Nacos2.3 | GitlabRunner3 | 后续 TODO4 | 使用版本说明1 | 业务场景说明...
    99+
    2023-05-15
    SpringCloudGateway Nacos GitlabRunner SpringCloudGateway Nacos GitlabRunner
  • 阿里云服务器灰度发布设置详解
    本文将详细介绍如何在阿里云服务器上设置灰度发布,包括灰度发布的基本概念、步骤以及需要注意的事项。灰度发布是一种逐步引入新版本或新功能的方法,旨在减少对生产环境的影响,同时可以快速收集和反馈用户对新版本或新功能的反馈。 阿里云服务器灰度发布设...
    99+
    2023-11-19
    灰度 阿里 详解
  • 微服务架构中如何处理服务的灰度发布和重试?
    随着互联网应用越来越复杂,微服务架构已经逐渐成为建立高可用、高可扩展性并且易于维护的应用的标准。对于微服务架构的服务而言,服务的灰度发布和重试是非常关键的问题。本文将介绍微服务架构中如何处理服务的灰度发布和重试。一、什么是灰度发布在微服务架...
    99+
    2023-05-16
    微服务架构 灰度发布 重试
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作