什么是灰度发布
介绍灰度发布流程之前我先一句话介绍一下什么是灰度发布。灰度发布就是,线上app无需停机就可以保证运行的是经过测试的稳定版本,且我们在冒烟测试时也不会影响到线上App的运行。
为什么我们要搞灰度发布
线上的服务每次都是我来构建,我可以非常负责任的讲,冒烟测试时不重新发布的几率很小,而且很多时候需要我去定位线上问题,这个过程我不知道你们痛不痛苦,反正我是很痛苦。换个角度分析,如果我是正在使用App的用户我会吐槽:这是什么牛马App,一天能卡个好几次,一次卡个几分钟,这还用个大锤子!为了能让用户有更好的体验,也为了我不在那么痛苦所以我们急需要一款灰度发布系统。
灰度发布系统怎么搞
一个很简单的理论,同时准备两份服务,让符合规则的请求路由到灰度接口,不符合规则的路由到之前发布的服务就好了哇~
代码实现
熟悉SpringCloudGateway的同学对于gateway的路由配置不会很陌生,以下面的基础配置为例简单的讲解一下。
1 |
|
当Gateway识别到请求符合某个断言后,就会将请求路由到该组断言对应的uri下。让符合规则的请求路由到灰度接口,不符合规则的路由到之前发布的服务就好了哇~,对于这个简单的需求我们只要在path断言不变的前提下在增加一个管理规则的断言不就可以了吗,以指定请求头包含指定value的规则为例,我们就可以自定义如下的断言。
自定义Gateway断言工厂
自定义Gateway的断言工厂那是相当的easy呀,你只需要复制我下面的代码修改下apply方法中规则为你想要的规则即可,你要是不信你也可以随便点进一个Gateway官方定义的任意一个断言工厂,官方的代码就是这么写的。
1 |
|
使用自定义的断言工厂
注意关注我上面自定义断言的类名,把RoutePredicateFactory后缀去掉就是断言的使用方法。
1 |
|
有个小问题
如果是单机的小服务,我们可以修改url来映射到不同的接口,但是对于微服务的集群我们要怎么搞嘞。
自定义Gateway全局过滤器借助Nacos的元数据进行负载均衡
自定义全局过滤器也是very的easy呀,我们只需要新建一个类继承GlobalFilter和Ordered接口就好啦,getOrder返回的值越大,执行的越靠后。
1 |
|
1 |
|
最终配置
1 |
|
最后只要是请求中具有canaryFlag的请求头且值为jiangtongxue或者chuitongxue的请求就会路由到release版本的服务集群上~