【SpringCloud】Feign诡异的Header传参问题


自言自语

如果大家使用了SpringCloud,享受给我们带来便利的同时,有时候也会带来意想不到的惊喜,总结原因呢,还是对其内部的原理和细节不了解。直到某一天,你的系统满足不了你的业务了,需要额外的功能支撑,不得不去寻找突破,在探究的同时,你渐渐的剥去了某些神秘的面纱,才恍然大悟,原来是这样啊~~~~~

场景故事

小D同学最近使用SpringCloud全家桶搭建了SAAS系统,有一个地方就是使用JWT全局Token作为用户鉴权,而整个系统又分为若干个子系统,彼此间提供服务(互相调用该禁止),RPC是使用Feign模板式注解。其中两个服务,分别为服务A,服务B,其中服务A调用服务B。一开始,小D在服务A中可以拿到Token,没怎么去关系这件事。突然有一天,小D需要在服务B中使用Token,也用原来的方式,即从Request中获取Header信息(Token存储在header中),才意识到这个header根本没有传过来,一顿搜索啊,才发现了下面的一些事。

Feign传递Header信息

小D同学在网上查找解决办法,发现可以使用Feign拦截器RequestInterceptor(也可以在接口上使用RequestHeader注解)在Feign Client请求之前把Request Header信息传递进去。代码如下:

如此操作一通,服务B中确实可以拿到Token信息了。

某一天,小D想验证下Hystrix的功能,发现默认情况,Hystrix是关闭的,于是乎打开了Hystrix的开关,如下图:

奇怪的事情发生了,服务B中Token信息神奇的消失了。

又是一顿搜索(搜索引擎是个好东西),发现原来是SpringCloud默认情况Hystrix资源隔离为THREAD策略,还有另外一种策略:SEMAPHORE。

有人说配置为SEMAPHORE策略,就可以拿到Token了。配置完之后,果然可以拿到Token,没毛病。

这两种策略有什么区别呢(往前翻,看另一篇《Feign、Ribbon、Hystrix之间不为人知的秘密》)?(涉及到多线程及并发知识,暂时不发散)

但是,看了网上好多的建议和官方的推荐,都倾向于使用THREAD策略。那有什么办法可以既使用THREAD策略,还能传递Header参数呢?这点问题是挡不住伟大的程序猿

我们可以定义自己的Hystrix资源隔离策略。

于是小D同学自定义了HystrixConcurrencyStrategy类,并重写了wrapCallable方法

哈哈,小D同学终于松了口气,在服务B中可以顺利的拿到Token了。

使用SpringCloud的同学,对于Sleuth并不陌生,

可以参考SleuthHystrixConcurrencyStrategy的并发策略写法。

你自己去探索吧,欢迎再来交流。

举报
评论 0