灰度值怎么降级_微服务生态的灰度发布如何实现?

f6a4a1285753d0a4f7b8dafabfbd8ad0.png

前言

相信很多小伙伴们都听说过灰度发布,但是不一定知道如何实现?今天我们就介绍一下基本原理,以及提供代码实现给小伙伴们。

灰度概念

fbaa541da7c59193ff5f52f7a42433c3.png

即原来的生产环境是1.0版本,那现在我们需要升级到2.0版本,但是我们需要验证2.0版本,在生产环境不会出问题,而且要稳定后,才能够完全切换为2.0

小伙伴们就会问,2.0版本应该我们测试人员 测试了啊,肯定没有问题啊。升级到2.0,直接升级就行了啊。

这个是不对的,因为生产环境有很多场景是独有的,如用户流量,数据量等。所以必须要验证2.0的稳定性;升级步骤如下:

1)100%的用户流量打到1.0版本上面;但测试人员可以通过测试工具指定线上2.0版本,即测试人员请求的是2.0版本。2)测试初步验证后,可以先分5%的用户流量到2.0版本,95%的用户流量还是在1.0版本3)查看2.0的稳定情况,分阶段的分配用户流量4)完成切换到2.0版本,下线1.0版本;在下线1.0版本的时候不同的方案 会遇到不同的坑

实现原理一

老顾这个灰度的框架是建立在springcloud alibaba生态的注册中心和配置中心都是使用的是nacos;我们先来看看整个系统架构,在升级状态是什么情况:

6454a95f8198ad24f31e5b8ad2b2be88.png

在spring cloud中,不管是网关 -> 服务A -> 服务B -> 服务C整个请求,网关是怎么知道有哪些服务A的?服务A是怎么知道有哪些服务B?服务B有哪些服务C?

这个是因为我们的所有服务都注册到了nacos注册中心里面,然后每个服务实例会通过5秒的心跳去请求nacos,获取到nacos里面的注册信息。

这个就是很重要的一个点,服务信息的同步;我们可以重写每个服务实例去拉取服务信息的时候,做一些过滤处理。举个例子,我们怎么保证服务A(1.0)只访问服务B(1.0)。

服务A(1.0)在调用服务B时,需要去拉取服务B的服务实例信息,当我们发现服务B中有2.0版本时,就直接过滤掉;1.0才同步到本地缓存;通过这原理,就是保证了服务A(1.0)实例,只能访问服务B(1.0)

那怎么重写拉取服务呢?就是继承NacosServerList重写getInitialListOfServers、getUpdatedListOfServers方法,直接上源代码。

8ae9ec297122d5f4fc7a1b3c371b7f5a.png

实现原理二

只实现过滤掉不需要的版本,是不够的;因为我们有另一个需求,就是流量权重;即服务A可以访问服务B(1.0),也就是访问服务B(2.0);只是流量权重占比不一样而已;那怎么实现呢?

那就要用到我们客户端client的rabbion组件了,这个组件主要用来调用服务实例的,而是可以实现负载均衡;那我们就可以重写负载均衡算法,实现自定义的流量权重这个需求。

具体实现就是继承ZoneAvoidanceRule

重写Server choose(Object key),直接上代码

public class ZoneAvoidanceRuleDecorator extends ZoneAvoidanceRule {    。。。。。。    @Override    public Server choose(Object key) {      //todo 选择的逻辑    }}

知道了基本的原理后,就可以直接去写了。

实现原理三

另一个需求,就是我们需要考虑到在线动态的改变灰度路由的规则,而不是每次改变了规则,需要重新启动服务,这个就不对了。

这个的实现可以考虑利用nacos自身的功能。去订阅nacos的配置中心的变化,从而达到动态更新。

案例

因为篇幅原因,老顾这里只介绍一些原理,具体源代码,可以到git上面去获取,要给个star哦。

https://gitee.com/gujiachun/gray

引入依赖

1、微服务项目需引入gray-plugin-framework-starter-service项目。

<dependency>   <groupId>com.rainbow.graygroupId>   <artifactId>gray-plugin-framework-starter-serviceartifactId>   <version>1.0.0-SNAPSHOTversion>dependency>

2、网关项目需引入gray-plugin-framework-starter-gateway项目。

<dependency>   <groupId>com.rainbow.graygroupId>   <artifactId>gray-plugin-framework-starter-gatewayartifactId>   <version>1.0.0-SNAPSHOTversion>dependency>

3、本组件推荐使用远程配置的方法,配置rule规则,现在只支持nacos配置中心。

4、组件支持全局订阅,或局部订阅。

全局订阅即:DataId = group1,Group=group1;即DataId也为group名称,这样每个微服务以及网关都只订阅的是同一个rule规则。

局部订阅即:DataId = 服务名称,Group=group1;即DataID是服务名称,即只有这个服务订阅了rule规则;其他服务不适用。

(推荐全局订阅,因为灰度发布一般针对所有的服务生效;而且规则里面可以细化到每个服务的规则)

规则说明

205c834113551285f50606c2f90581e9.pngb6370ba88d1199d4b05703566efca1d3.png7b662b06033c50cbef3cd329d7e144ab.png6494bf5b45e471505106077e27809ec6.png6ded30babf77c9d5cbf393f497ecebe9.png

使用说明

1、配置nacos,在bootstrap.properties中配置nacos注册中心

spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848spring.cloud.nacos.discovery.username=nacosspring.cloud.nacos.discovery.password=nacosspring.cloud.nacos.discovery.namespace=sit

2、在bootstrap.properties中组件需要的配置。

nacos.server-addr=${spring.cloud.nacos.discovery.server-addr}nacos.username=${spring.cloud.nacos.discovery.username}nacos.password=${spring.cloud.nacos.discovery.password}nacos.plugin.namespace=${spring.cloud.nacos.discovery.namespace}

3、在application.properties 配置元数据,非常重要,这个就是每个服务不同的版本version,地域region,环境env,区zone相关的配置

spring.cloud.nacos.discovery.metadata.group=example-service-groupspring.cloud.nacos.discovery.metadata.version=1.0spring.cloud.nacos.discovery.metadata.region=devspring.cloud.nacos.discovery.metadata.env=env1spring.cloud.nacos.discovery.metadata.zone=zone1

4、亲和性

启动和关闭可用区亲和性,即同一个可用区的服务才能调用,同一个可用区的条件是调用端实例和提供端实例的元数据Metadata的zone配置值必须相等。缺失则默认为false

spring.application.zone.affinity.enabled=true

启动和关闭可用区亲和性失败后的路由,即调用端实例没有找到同一个可用区的提供端实例的时候,当开关打开,可路由到其它可用区或者不归属任何可用区,当开关关闭,则直接调用失败。缺失则默认为true

spring.application.zone.route.enabled=true

外部参数Header

通过前端(Postman)方式传入灰度路由策略,来代替配置中心方式,传递全链路路由策略。这样就可以实现由测试人员自行选择走哪些路径。

注意:当配置中心和外部参数都配置后,会先从配置中心的规则会先过滤执行,然后外部参数再过滤的原则

-版本匹配策略,Header格式如下任选一个

n-d-version=1.0n-d-version={"discovery-guide-service-a":"2.0", "discovery-guide-service-b":"2.0"}

-版本权重策略,Header格式如下任选一个

n-d-version-weight=1.0=90;1.1=10n-d-version-weight={"discovery-guide-service-a":"1.0=90;1.1=10", "discovery-guide-service-b":"1.0=90;1.1=10"}

-区域匹配策略,Header格式如下任选一个

n-d-region=qan-d-region={"discovery-guide-service-a":"qa", "discovery-guide-service-b":"qa"}

-区域权重策略,Header格式如下任选一个

n-d-region-weight=dev=99;qa=1n-d-region-weight={"discovery-guide-service-a":"dev=99;qa=1", "discovery-guide-service-b":"dev=99;qa=1"}

-IP地址和端口匹配策略,Header格式如下任选一个

n-d-address={"discovery-guide-service-a":"127.0.0.1:3001", "discovery-guide-service-b":"127.0.0.1:4002"}n-d-address={"discovery-guide-service-a":"127.0.0.1", "discovery-guide-service-b":"127.0.0.1"}n-d-address={"discovery-guide-service-a":"3001", "discovery-guide-service-b":"4002"}

-环境隔离下动态环境匹配策略

n-d-env=env1

-服务下线实时性的流量绝对无损,全局唯一ID屏蔽策略

n-d-id-blacklist=e92edde5-0153-4ec8-9cbb-b4d3f415aa33;af043384-c8a5-451e-88f4-457914e8e3bc

-服务下线实时性的流量绝对无损,IP地址和端口屏蔽策略

n-d-address-blacklist=192.168.43.101:1201;192.168.*.102;1301

当外界传值Header的时候,网关也设置并传递同名的Header,需要决定哪个Header传递到后边的服务去。需要通过如下开关做控制:

# 当外界传值Header的时候,网关也设置并传递同名的Header,需要决定哪个Header传递到后边的服务去。如果下面开关为true,以网关设置为优先,否则以外界传值为优先。缺失则默认为truespring.application.strategy.gateway.header.priority=false# 当以网关设置为优先的时候,网关未配置Header,而外界配置了Header,仍旧忽略外界的Header。缺失则默认为truespring.application.strategy.gateway.original.header.ignored=true# 当外界传值Header的时候,网关也设置并传递同名的Header,需要决定哪个Header传递到后边的服务去。如果下面开关为true,以网关设置为优先,否则以外界传值为优先。缺失则默认为truespring.application.strategy.zuul.header.priority=false# 当以网关设置为优先的时候,网关未配置Header,而外界配置了Header,仍旧忽略外界的Header。缺失则默认为truespring.application.strategy.zuul.original.header.ignored=true

总结

整体灰度的功能还是挺多,不过实现的原理就是上面介绍的原理;这里也要感谢开源社区的nepxion discovery开源项目,借鉴了设计思路,以及一些代码设计,简化了实现。

257fe9bcb0f0d71f11698942fb44fbdd.png

bdf7fb53a11f810cbfa193eec346ab83.gif分享、在看与点赞都在这儿点下给小编加点料21b9c036cd78c84b4e856f0f2962369b.gif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/550140.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在电脑上显示未知发布者怎么办_笔记本电脑显示器花屏怎么办?电脑屏幕花屏的解决方法...

笔记本电脑显示器花屏怎么办&#xff1f;笔记本电脑屏幕花屏该如何解决呢&#xff1f;近日有用户反映在使用笔记本电脑时候&#xff0c;会出现花屏的问题&#xff0c;下面就给大家介绍具体解决方法。一&#xff1a;检查显示器与显卡的连线是否松动若显示屏花屏的话&#xff0c;…

mongodb 字段出现次数_MongoDB数据库

内容回顾Xpath选择器不要求记忆&#xff0c;只要混个眼熟即可基于openpyxl模块爬取豆瓣电影单页爬取多页爬取1.校验请求头里面是否有User-Agent参数 请求头里面加上即可2.限制IP规定时间内的访问次数 1.人为的加上时间延迟 在你的程序里面加上time.sleep()让你的程序间歇一段时…

相似三角形·中考

概述相似&#xff0c;主要是相似三角形&#xff0c;在中考中有举足轻重的地位&#xff0c;难度也较高&#xff0c;往往倒三题中至少有一题是圆和相似的结合相似常常和四边形、反比例函数、圆、二次函数等结合&#xff0c;十分灵活 比例性质 概念若$\displaystyle \frac{a}{b}\f…

php 对接 北向数据接口 socket

function encode($msgType, $timeStamp, $body) {return "\xFF\xFF".pack(CNn, $msgType, $timeStamp, strlen($body)).$body;}$connection->send(encode(1, time(), reqLoginAlarm;userxxx;keyxxx;typexxx)); 详情参考: 请教使用socket做为客户端和北向接口对接&…

RHEL7单独安装图形X11

RHEL7 默认是最小化安装&#xff08;Minimal Install&#xff09;&#xff0c;没有图形界面&#xff0c;我们应该选择Server with GUI。若已错过此步骤&#xff0c;我们采用以下方式补充安装GUI界面。 # yum group list Available Environment Groups:Minimal InstallCompute N…

485通讯线是几芯的_小令老师说门禁| 为什么485门禁必然会取代韦根?

韦根和485&#xff08;RS485&#xff09;是两种不同的通讯协议。通讯协议解决的是通讯双方数据如何传输和如何控制的问题。对于门禁而言&#xff0c;指的是读头和控制器之间的通讯。传统门禁很多采用韦根通讯方式&#xff0c;而现在485更为普及&#xff0c;大部分韦根门禁也完成…

epoll nio区别_大厂面试系列(二)::NIO和Netty

NIO和Netty面试题 NIO 阐述 NIO原理&#xff1f;BIO/NIO/AIO有什么区别&#xff1f;有那些实现&#xff1f;讲讲NIO的原理与实现&#xff1f;NIO用到了哪个经典技术思想&#xff1f;JDK1.8中NIO有做什么优化了解多路复用机制 常见问题 同步阻塞、同步非阻塞、异步的区别&#x…

拦截地址栏参数_selenium操作chrome时的配置参数

参数说明&#xff1a;about:version - 显示当前版本about:memory - 显示本机浏览器内存使用状况about:plugins - 显示已安装插件about:histograms - 显示历史记录about:dns - 显示DNS状态about:cache - 显示缓存页面about:gpu -是否有硬件加速about:flags -开启一些插件 chrome…

升级步骤linux_开发人员福音,在win10系统上安装linux子系统

对于软件开发人员来说&#xff0c;linux基本上是一个绕不过去的槛。 因为工作经常要用到linux&#xff0c;电脑用纯linux还是windows 虚拟机装linux&#xff0c;我一直纠结。因为我要使用docker的原因&#xff0c;所以就搜索到这文章了。如果装个纯linux&#xff0c;则一些win…

curl put方法 测试http_HTTP接口调试利器!4.8万Star的HTTP命令行客户端!

【导语】&#xff1a;Python实现的HTTP请求命令行客户端&#xff0c;我理解为curl的Python版本&#xff0c;但是提供了更友好&#xff0c;更易使用的命令及选项。简介HTTPie是使用Python实现的HTTP命令行工具&#xff0c;提供了更人性化、交互性更好的命令和选项&#xff0c;可…

文件打开特别慢_“Origin进不去、下载慢”的解决办法合集

玩儿烂橘子的游戏&#xff0c;喜闻乐见会见到下面这句话&#xff1a;呃&#xff0c;发生了些意料之外的事情。其实&#xff0c;这还挺意料之中的。▌进不去方法①&#xff1a;挂加速器。加速器挂Steam或者Origin大厅一般是免费的&#xff0c;没效果就换一个节点、模式、加速器。…

关于使用CPU缓存的一个小栗子

一、背景知识 CPU缓存&#xff08;Cache Memory&#xff09;&#xff0c;是位于CPU与内存之间的临时存储器&#xff0c;它的容量比内存小的多但是交换速度却比内存要快得多。高速缓存的出现主要是为了解决CPU运算速度与内存读写速度不匹配的矛盾&#xff0c;因为CPU运算速度要比…

输入快捷键显示未知命令_「干货」华为VRP基础和常用命令了解一下

华为VRP系统的理解手机里面是安卓系统&#xff0c;电脑里面windows系统在我们路由器、交换机、防护墙等网络设备中他们当中的系统就是VRP系统(通用路由平台)可以理解为华为的类型交换机&#xff0c;华为类型路由器以及防火墙他们之间的命令行几乎都是一样华为设备提供丰富的功能…

2 字符串求交集_PostGIS教程十八:维数扩展的9交集模型

一、什么是维数扩展的9交集模型"维数扩展的9交集模型-Dimensionally Extended 9-Intersection Model"&#xff08;DE9IM&#xff09;是一个用于建模两个空间对象如何交互的框架。首先&#xff0c;每个空间对象都具有&#xff1a;内部&#xff08;interior)边界&#…

房子里的K2 BPM业务流程管理

房…子这件事上&#xff0c;尴尬实在太多。 ಥ_ಥ 职场新人&#xff0c;租房很尴尬&#xff1b; 未婚男女&#xff0c;婚房很尴尬&#xff1b; 有下一代的&#xff0c;学区房很尴尬&#xff1b; 耄耋之年&#xff0c;养老房很尴尬... ▽ 甭管买房、租房、装修、设计&#xff0c…

大学生体测成绩判断c语言_体育改革瞄准高校,体测不过关可能真的毕不了业了...

「ECO氪体」体育圈人www.ecosports.cn文/ 圈哥回忆上学期间&#xff0c;体育最令你头疼的时刻是什么&#xff1f;是不是在体育中考将要到来之前&#xff0c;还没日没夜枯燥的训练和近乎苛刻的饮食控制&#xff1f;而现在&#xff0c;体育似乎不想再局限于中学了。图片截自&…

gojs 节点右键点击事件_SWMM快速建模方法(3)—建立管线上下游节点编号

在SWMM中&#xff0c;管线需要输入上下游节点检查井编号&#xff0c;那么在GIS中可否实现自动获取上下游节点编号呢&#xff1f;思路是这样的&#xff0c;首先获得管线两端节点&#xff0c;然后对端点进行融合&#xff0c;删除重复的节点&#xff0c;最后根据坐标关系分别建立管…

android 设置setmultichoiceitems设置初始化勾选_Linux内核启动:虚拟盘空间设置和内存管理结构初始化...

1. 设置虚拟盘并初始化接下来main函数将对外设中的虚拟盘区进行设置。 检查makefile文件中"虚拟盘使用标志"是否设置&#xff0c; 以此确定系统是否使用了虚拟盘(假设有虚拟盘&#xff0c;大小设置为2 MB)。 操作系统从缓冲区的末端起开辟2MB内存空间设置为虚拟盘&am…

关闭mysql服务的方法有哪些_MySQL--启动和关闭MySQL服务

介绍了启动服务器的两种方式&#xff0c;以及可能遇到的问题第一种&#xff1a;系统服务1)可以通过右击方式一步步找到服务右击计算机->选择管理->找到服务&#xff0c;然后双击打开&#xff0c;找到mysql&#xff0c;我安装的是mysql8.0所以服务的名称显示是mysql80&…

devstack mysql_DevStack部署OpenStack开发环境 - 问题总结

建议在使用DevStack搭建OpenStack开发环境前,先安装好开发工具包组.特别是gcc,主要一定是在yum update -y 之前,否则更新完系统后,在安装开发工具包会出现很多依赖包因为版本更新而无法安装.要部署OpenStack需要注意若电脑配置不高,我自己的经验是先最小化或基本Web安装,然后,再…