WS分享12-浅谈灰度服务实现

如果这篇文章对您有些用处,请点赞告诉我O(∩_∩)O

假设我们正在开发的是一个仓储系统,对应上十个仓库,或一个门店系统,对应上百家门店。

新版本上线,结果因为一个BUG,导致所有门店或仓库上千名员工“down机",这恐怕是领导最不愿意看到的。

控制上线风险,需要的不仅仅是一个完整的测试流程,更需要一个试用的过程,让某些门店先试用起来。

同一时间某个门店使用的新版本服务就是灰度服务,其他门店使用的稳定版本服务就是正式服务。

注:这里谈论的不是APP的版本切换,是服务的切换。

一、终端如何访问灰度服务

1、网关反向代理

由网关反向代理并路由到灰度服务,终端对灰度服务无感,统一调用网关地址。

WS分享12-浅谈灰度服务实现_第1张图片

2、下发地址直连

终端登录后,如果是灰度门店,调用下发API服务获取所有灰度API地址。终端直连灰度服务。

WS分享12-浅谈灰度服务实现_第2张图片

二、灰度服务之间访问

上文提到灰度服务只能访问灰度服务,正式服务只能访问正式服务,我们依靠读取不同配置实现。

假设所有灰度服务机器名中都包含-x,

如:store-api-x01.idc1.xy,store-api-x02.idc1.xy 对应域名为store-api-x.idc1.xy

store-service-x01.idc1.xy,store-service-x02.idc1.xy对应域名为store-service-x.idc1.xy

WS分享12-浅谈灰度服务实现_第3张图片

上层灰度服务store-api访问下层store-service服务的方式,按照接口调用方式分为两种:

1、使用HTTP接口,服务域名以及URL由代码控制,可以修改。

(1)在上层服务store-api中将下层服务的域名写入配置文件。

domain.store-service-a=http://store-service-a.idc1.xy domain.store-service-x=http://store-service-x.idc1.xy

(2)当调用下层服务接口时,根据当前机器名中是否带有-x,确定自己是否为灰度服务器,如果是,则获取配置中对应的灰度服务域名调用,否则调用正式服务。

String local = InetAddress.getLocalHost().getHostName() //获取机器名

2、使用类似注册中心,服务域名以配置属性形式启动时注入,不易更改。

(1)在上层服务store-api中将下层服务的组名写入配置文件。

group.store-service-a=store-service-a

group.store-service-x=store-service-x

(2)使用SpringEL的静态方法调用方式,动态注入。

#{T(com.xy.storeAPI.config.GreyConfig).getGroupName()}

(3)静态方法获取域名

在com.xy.storeAPI.config.GreyConfig的静态方法getGroupName中,根据当前机器名中是否带有-x,读取配置文件中灰度或正式组名。

三、灰度服务发布流水线

1、不增加发布节点,适合现有流水线改造

WS分享12-浅谈灰度服务实现_第4张图片

(1)一次同步,分开启动

打war包 -> 发布BETA -> BETA测试 -> PREVIEW测试 -> 同时同步war包到灰度和正式ONLINE -> 重启灰度ONLINE -> 灰度使用没有问题 -> 重启正式ONLINE

 

(2)两次同步

打war包 -> 发布BETA -> BETA测试 -> PREVIEW测试 -> 从PREVIEW环境先同步war包到灰度ONLINE -> 灰度使用没有问题 -> 再从PREVIEW环境同步war包到正式ONLINE

2、增加发布节点,适合新建流水线

WS分享12-浅谈灰度服务实现_第5张图片

 

你可能感兴趣的:(架构,网关,java,接口)