微服务生态的灰度发布如何实现?

那就要用到我们客户端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项目。

com.rainbow.gray gray-plugin-framework-starter-service 1.0.0-SNAPSHOT

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

com.rainbow.gray gray-plugin-framework-starter-gateway 1.0.0-SNAPSHOT

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

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

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

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

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

规则说明

微服务生态的灰度发布如何实现?_第1张图片微服务生态的灰度发布如何实现?_第2张图片微服务生态的灰度发布如何实现?_第3张图片微服务生态的灰度发布如何实现?_第4张图片微服务生态的灰度发布如何实现?_第5张图片

使用说明

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

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

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

nacos.server-addr= s p r i n g . c l o u d . n a c o s . d i s c o v e r y . s e r v e r − a d d r n a c o s . u s e r n a m e = {spring.cloud.nacos.discovery.server-addr} nacos.username= spring.cloud.nacos.discovery.serveraddrnacos.username={spring.cloud.nacos.discovery.username}
nacos.password= s p r i n g . c l o u d . n a c o s . d i s c o v e r y . p a s s w o r d n a c o s . p l u g i n . n a m e s p a c e = {spring.cloud.nacos.discovery.password} nacos.plugin.namespace= spring.cloud.nacos.discovery.passwordnacos.plugin.namespace={spring.cloud.nacos.discovery.namespace}

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

spring.cloud.nacos.discovery.metadata.group=example-service-group
spring.cloud.nacos.discovery.metadata.version=1.0
spring.cloud.nacos.discovery.metadata.region=dev
spring.cloud.nacos.discovery.metadata.env=env1
spring.cloud.nacos.discovery.metadata.zone=zone1

4、亲和性

启动和关闭可用区亲和性,即同一个可用区的服务才能调用,同一个可用区的条件是调用端实例和提供端实例的元数据Metadata的zone配置值必须相等。缺失则 《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》无偿开源 威信搜索公众号【编程进阶路】 默认为false

spring.application.zone.affinity.enabled=true

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

spring.application.zone.route.enabled=true

外部参数Header

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

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

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

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

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

n-d-version-weight=1.0=90;1.1=10
n-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=qa
n-d-region={“discovery-guide-service-a”:“qa”, “discovery-guide-service-b”:“qa”}

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

下任选一个

n-d-region=qa
n-d-region={“discovery-guide-service-a”:“qa”, “discovery-guide-service-b”:“qa”}

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

你可能感兴趣的:(Java,经验分享,面试,java)