在实际的生产环境中,我们经常会涉及到部署多套环境,特别是C端,这里有时我们称为灰度发布,有时称为金丝雀发布,有时称为蓝绿发布,有时称为全链路灰度发布。这样子做的原因主要有几个:
1、测试部分功能, 2、生产环境的两个环境相互切换 等业务场景
这里的话,我们使用spring cloud tencent微服务框架实现起来非常简单(这里特别强调一下,使用spring cloud tencent个人认为比spring cloud alibaba简单方便很多),所以这里我们直接演示一下。
整个灰度发布的流程图如下:
如上图所示,我们的整个灰度发布的流程如下:
1、首先给每个服务打上一个标签env=f2。 2、然后在request请求头里面添加env=f2标签,这样子只要实例匹配上对应的标签,他就会走相同的服务实例组。
下面我们直接来实战演示一下:
1)在所有的服务里面添加如下的maven依赖:
<dependency> <groupId>com.tencent.cloud</groupId> <artifactId>spring-cloud-starter-tencent-polaris-router</artifactId> </dependency> <dependency> <groupId>com.tencent.cloud</groupId> <artifactId>spring-cloud-tencent-featureenv-plugin</artifactId> </dependency>
添加这两个依赖主要的目的是:
1、提供服务之间的路由 2、添加服务之间的header头透传 3、每个服务根据透传的header头匹配对应的实例
2)在服务的每个实例的application.yml配置文件里面添加如下的配置:
spring: cloud: tencent: metadata: content: featureenv: f1 # f1 替换为测试环境名称
这里的话,我们在gateway-service,user-service,product-service上面都需要添加如下的配置。
3)正对user-service的特别说明
这里的话,我们对user-service添加一个说明,主要是想要部署两个user-service,分别适配两个不同的request 头,这样子我们在后面测试一部分服务走user-service1,返回响应1,一部分服务走user-service2,返回响应2。所以对于user-service做如下的操作。分别如下:
1、首先在user-service1中添加如下的配置:
spring: cloud: tencent: metadata: content: featureenv: f1 # f1 替换为测试环境1名称
然后我们在user-service1的服务里面的user-controler里面编码返回的是:
@RequestMapping("/test") public String hello(@RequestHeader Map<String, String> headers) { headers.forEach((key, value) -> { // 日志中输出所有请求头 log.info(String.format("Header '%s' = %s", key, value)); }); return "user :"+JSON.toJSONString(productClient.product()); }
这样子我们实现了user-service1的返回内容是响应1,
2、首先在user-service2中添加如下的配置:
spring: cloud: tencent: metadata: content: featureenv: f2 # f2 替换为测试环境2名称
然后我们在user-service2的服务里面的user-controller里面编码返回的是:
@RequestMapping("/test") public String hello(@RequestHeader Map<String, String> headers) { headers.forEach((key, value) -> { // 日志中输出所有请求头 log.info(String.format("Header '%s' = %s", key, value)); }); return "user2"; }
以上我们就做好了user-service1和user-service2的服务了。
4)启动gateway-service1,user-service1,user-service2,product-service1,然后我们看看北极星的服务启动情况。
然后看看user-service的实例信息:
5)测试
这里的话,我们来测试一下,请求的url统一为:
http://192.168.31.147:8080/users/test
首先我们在request的头里面添加如下的键值对:
X-Polaris-Metadata-Transitive-featureenv=f1
可以看到无论请求多少次,返回结果都是一样的,说明走的是实例配置为env=f1这个实例。
接着我们把request头的env替换为f2,看看返回结果:
可以看到无论请求多少次,返回的结果都是返回的是响应2。说明走的是env=f2这个实例。
然后我们在把request头的env修改为f3,这里我们其实没有配置env=f3的user实例,那看下访问结果:
可以看到没有对应实例的话,这里直接负载均衡随机使用实例了。
以上就是关于使用spring cloud tencent 实现灰度发布的演示。
备注:
1、这里添加标签的话,统一使用如下的格式:
spring.cloud.tencent.metadata.content.${key}=${value}
那么在request的header里面添加的头格式的话,就需要和上面对应起来:
X-Polaris-Metadata-Transitive-${key}=${value}
2、一定要记得添加上诉的两个maven依赖。
最后按照惯例,附上本案例的源码,登录后即可下载:
还没有评论,来说两句吧...