在使用微服务的时候,我们经常会涉及到服务之间的调用,如下图:
像上图所示,客户端通过gateway网关进行访问后端的服务,后端的服务会涉及到调用gateway转发到service-a服务,然后service-a服务还可以调用service-b服务。service-b服务还可能会调用service-c服务。
对于上面的流程,我们有时候会在生产环境涉及到灰度发布的场景,那这个时候,我们就可能增加一些判断条件,例如service-c检测到请求头里面带有gray=true的标签,那么service-c就去调用service-d-beta服务。那么在service-c服务之前,还有gateway,还有service-a,还有service-b,那么此时这个gray=true的标签主要是客户端添加的,所以这个标签需要经过 gateway -> service-a -> service-b -> service-c。经过这样的链路进行透传。在传统的spring cloud 微服务里面,我们可能需要写在gateway,service-a,service-b项目中编写拦截器,然后通过拦截器把这个gray=true的标签透传下去。但是在spring cloud tencent微服务框架里面,我们就不需要那么麻烦。详细的做法如下:
1)在整个项目的父pom里面添加如下的依赖:
<dependency> <groupId>com.tencent.cloud</groupId> <artifactId>spring-cloud-starter-tencent-polaris-router</artifactId> </dependency>
2)然后在客户端的request里面添加想要透传的信息,假设我们这里想要透传 gray=true这个标签,那么我们在客户端的request header里面添加如下的请求头即可,这里请求头的格式如下:
X-SCT-Metadata-Transitive-${tag}=${value}
也就是需要以X-SCT-Metadata-Transitive-为开头即可,例如我们这里添加的gray=true标签,那么添加的请求头如下:
X-SCT-Metadata-Transitive-gray=true
3)启动项目进行测试,这里我们演示的时候添加两个自定义的标签,看下是否可以透传:
X-SCT-Metadata-Transitive-gray=true X-SCT-Metadata-Transitive-env=prod
添加的信息如下图:
这里我们在user-service和product-service中的代码里面也打印了header信息,如下图:
然后我们启动项目测试一下,看看结果,请求地址是:
http://192.168.31.147:8080/users/test
请求结果如下图:
然后我们看下user-service打印的日志是否获取了需要透传的这两个标签,如下图:
然后我们看看product-service打印的日志是否获取了需要透传的这两个标签,如下图:
可以看到标签被透传了,在请求头的sct-custom-metadata这个键里面就可以获取到透传的值。
备注:
1、需要透传的话,这里需要在主调方添加router的maven依赖,这里我们添加到父pom里面的,主要是真是的环境,其实任何一个服务都可能是主调方,因此不需要在每一个服务里面都添加一遍这个router的maven依赖。
2、这里透传的话,需要在对应的服务里面的sct-custom-metadata这个header的键里面获取值,获取到的是json格式,这里上图打印的是被urlencode了,进行urldecode就可以看到具体的信息,例如上面的两个键对应的json完整信息如下:
{"gray":"true","env":"prod"}
如下图:
3、这里我们的user-service是通过feign调用的product,所以对于这个透传,天生支持feign client 调用。
最后按照惯例,附上本案例的源码,登录后即可下载。
还没有评论,来说两句吧...