天天看点

基于springCloud的灰度发布构想实现过程

SpringCloud是当前比较主流的分布式微服务框架。 且应用都是通过集群部署的。

所以,灰度发布是一种必然的趋势。 新应用上线之后,需要通过灰度测试通过之后,才能正式上线。

本文就是基于上述思考, 通过对SpringCloud的组件进行适当封装,实现应用的灰度发布,且对业务代码无浸入。

实现过程

概述

首先,SpringCloud的简单调用过程如下:

基于springCloud的灰度发布构想实现过程

所有应用向eureka注册中心注册, 然后URL请求调用Zuul网关的时候,通过负载均衡方式调用后台服务应用。

基于上述过程,我们调整架构,如下:

基于springCloud的灰度发布构想实现过程

第一步 引入Redis

首先,引入Redis,作为存储灰度服务的缓存数据库。通过Redis管理服务应用的地址信息。

第二步 Eureka封装

在服务注册到eureka的时候, eureka增加@EventListener监听应用注册。

在监听到新应用注册的时候,在redis中,增加新应用IP地址,端口,serverName等信息,且该记录标记状态为灰度。 

在监听到新应用下线的时候,在redis中,将应用的状态标记为下线。

第三步 Zuul封装

1. URL请求到达zuul网关的时候, zuul在pre阶段,进行过滤操作。zuul在pre阶段,过滤逻辑如下:

2. 查询redis中是否有该请求的灰度应用地址。

3. 如果有, 则通过redisTemplate方式,直接调用灰度发布的地址获取信息,并返回给前端。如果灰度地址有多个,则可以自定义负载均衡策略,来实现负载转发。

4. 如果没有,则不拦截, 使用ribbon,进行转发后端应用。(并重写IRule方法,过滤掉灰度服务器和下线服务器)

第四部 后台管理系统

1. 可通过系统的后台管理系统,对应用进行管理。访问redis获取所有应用的状态。

2. 然后通过后台管理系统,更改redis中应用的标记状态(从灰度标记为上线,表示灰度测试通过,可以上线使用了; 或者从上线改为灰度,将对应应用服务切到灰度测试版本)

基于上述构想,则可以实现应用的灰度发布。

后续思考

1. 灰度测试的时候,我们想只有特定手机号才能访问灰度地址, 其他手机号都是访问非灰度的地址,从而无需修改代码,实现灰度测试。

2. 细化灰度的粒度, 之前是基于应用的灰度发布。 如何实现基于URL的灰度?