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

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,一经查实,立即删除!

相关文章

wget抓取网站, 模拟手机端抓取

nohup wget --mirror -p --tries100 --convert-links -P . –user-agent"Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B334b Safari/531.21.10" http://网址 >1.log 2>&1 …

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

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

php 网页转pdf

linux 安装 wkhtmltopdf 下载地址 https://wkhtmltopdf.org/downloads.html 服务器是centos7 wget https://github.com/wkhtmltopdf/packaging/releases/download/0.12.6-1/wkhtmltox-0.12.6-1.centos7.x86_64.rpm 下载有点慢 rpm -ivh wkhtmltox-0.12.6-1.centos7.x86_6…

deluser命令

deluser命令 2012年07月03日 ⁄ 系统管理 ⁄ 暂无评论 1.功能作用 从系统中删除一个用户或组 2.位置 /usr/sbin/deluser 3.格式用法 deluser [options] USER deluser USER GROUP 4.主要参数 --quiet | -q 不将进程信息发给 stdout --help | -h 帮助信息 …

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做为客户端和北向接口对接&…

编译后没有taget文件夹_maven资源文件的相关配置才会在编译后的target里面有

建Maven项目的时候&#xff0c;如果没有进行特殊的配置&#xff0c;Maven会按照标准的目录结构查找和处理各种类型文件。src/main/java和src/test/java这两个目录中的所有*.java文件会分别在comile和test-comiple阶段被编译&#xff0c;编译结果分别放到了target/classes和targ…

配置gunicorn、 nginx、supervisor

1、建立引导&#xff0c;参考博文&#xff1a;https://www.cnblogs.com/wxzbk/p/10335859.html2、启动测试gunicorn -b 0.0.0.0:8080 run:app #run是引导文件&#xff0c;APP是模块名3、配置nginx1.跳转&#xff1a;cd /etc/nginx2.跳转&#xff1a;cd sites-available3.创建配…

添加icon_在zotero中添加百度学术、中国知网的文章检索引擎

方法关于添加文章检索引擎的方法&#xff0c;首先是参考官方文档&#xff1a;locate [Zotero Documentation]。里面提到有一个官方随时更新的engines.json文件&#xff0c;下载下来&#xff0c;保存到相应的文件夹就可以了。另外官方文档里还提供了一张检索引擎列表&#xff0c…

协变和逆变-Covariance and Contravariance

在C#4.0新特性介绍中&#xff0c;总是免不了对协变和逆变的介绍。但似乎协变逆变又很鸡肋。我试图简单地讲下协变&#xff08;Covariance&#xff09;和逆变(Contravariance)。 1&#xff0c;Co&Contravariance并非C#4.0引入的&#xff0c;早在C#1.0中就有了。只是C#4.0加入…

汉字笔画动图怎么做_动态图示范汉字笔顺标准,超全面!

忄先写点和点&#xff0c;最后写竖。匕先写撇&#xff0c;后写竖弯钩。万先写横&#xff0c;再写横折钩&#xff0c;后写撇。母字的最后三笔是点、横、点。及先写撇&#xff0c;再写横折折撇&#xff0c;后写捺。乃先写横折折撇&#xff0c;再写撇。这个字和及字形相近&#xf…

孙悟空的师父是谁? (ZT)

猜测之一 孙悟空是只石猴&#xff0c;很多年后有人说他是这本书的真正主角&#xff0c;其实这是不恰当的&#xff0c;他只是“第一主角”。因为西游的队伍里每个人都是主角&#xff0c;包括龙马。 孙悟空是天产石猴&#xff0c;生于花果山水帘洞&#xff0c;得育明师。修成大道…

decimalformat精度丢失_php intval 两位小数乘以100后结果少1

ASP&period;NET Core开发-后台任务利器Hangfire使用ASP.NET Core开发系列之后台任务利器Hangfire 使用. Hangfire 是一款强大的.NET开源后台任务利器,无需Windows服务/任务计划程序. 可以使用于ASP.NET 应用也 ...【转】NGUI创建UIRoot后报NullReferenceException的解决办法…

小米用户画像_腾讯企鹅智库发布手机品牌用户画像:华为一二线城市用户少于小米...

近日&#xff0c;腾讯旗下企鹅智库公布了《2019中国网民智能手机购机用户画像分析》&#xff0c;统计了国内各大手机品牌的用户特征&#xff0c;结论非常有趣。《分析》统计显示&#xff0c;苹果是所有手机品牌中一线城市用户占比最高的品牌&#xff0c;占比高达31.4%&#xff…

NLP(二十一)根据已有文本LSTM自动生成文本

根据已有文本LSTM自动生成文本 原理 与股票预测类似&#xff0c;用前面的n个字符预测下一个字符https://www.cnblogs.com/peng8098/p/keras_5.html代码from __future__ import print_function import numpy as np import random import syspath rshakespeare_final.txt text …

友盟小米收不到推送消息_Android 推送集成华为,小米,友盟

在小米推送运营平台创建应用&#xff0c;地址点这里, 获取到 AppID , AppKey把从小米下载的 jar 放到 libs 下在 AndroidManifest.xml 中添加权限配置推送服务需要的service和receiverandroid:enabled"true"android:process":pushservice"android:name&quo…

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;大部分韦根门禁也完成…

【第57题】【062题库】2019年OCP认证062考试新题

57题、choose one Which statement is true about a database in ARCHIVELOG mode? A) Full database backups can be performed when the database is opened. B) A Fast Recovery Area (FRA) must be configured for the database. C) Online redo log files have to be mul…