springcloud中openfeign止hystrix的几个问题
Posted aofengdaxia
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了springcloud中openfeign止hystrix的几个问题相关的知识,希望对你有一定的参考价值。
最近写一个小项目,使用了微服务的架构,当然就少不了openfeign和hystrix。在使用过程中可谓是问题频频,而且遇到问题不好解决。
- 新版本的hystrix不起作用
首先是在使用openfeign的过程中发现fallback不起作用。左思右想,查了各种资料,大多数材料都是说openfeign默认不开启hystrix。需要设置
feign:
hystrix:
enabled: true
但是设置后,依然不起作用。最后考虑到的可能是openfeign版本变化的问题,我使用的最新的3.0.3版本,然后退回到2.2.6.RELEASE版本以后,恢复正常。
在这里本地不吐槽一下SpringCloud的向下兼容的问题,更新一个版本就会有一些类库移入或者移出。这样搞,只能是在某个阶段熟悉一个版本的springcloud,然后长期的使用下去,即便是有bug或者严重的缺陷,也很难很轻易的更新到新的版本。一方面是学习成本老高,另外是老项目如何升级。相比之下的.net core就好很多。
2. openfeign的请求中添加token的请求头
这个就相对简单,配置一下openfeign的请求模板就可以了
@Configuration
public class FeignConfig implements RequestInterceptor {
@Override
public void apply(RequestTemplate requestTemplate) {
var token = getToken();
requestTemplate.header("X-Token",getToken());
}
private String getToken(){
ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
if(servletRequestAttributes != null) {
HttpServletRequest request = servletRequestAttributes.getRequest();
if(request != null) {
return request.getHeader("X-Token");
}
}
return "";
}
}
但是在实际的使用过程中就发现了第四个问题。没法获得HttpServletRequest
3. RequestContextHolder.getRequestAttributes();为空
网络上普遍的说明是增加一个RequestContextListner的配置
@Bean
public RequestContextListener requestContextListener(){
return new RequestContextListener();
}
然并卵,增加了也没啥用。
最后再某个角落发现了原来是hystrix开启了后,hystrix的隔离策略的问题。
hystrix:
command:
default:
execution:
isolation:
strategy: SEMAPHORE
相对简单的解决了这个问题,然后该方案不是官方很推荐的方案,官方推荐自定义并发策略,需要自己编写一个类,让其继承
HystrixConcurrencyStrategy类,重写wrapCallable方法,出于时间考虑,先把项目跑起来吧,随后尝试其他方法。
参考文章:
https://blog.csdn.net/amosjob/article/details/97400347
以上是关于springcloud中openfeign止hystrix的几个问题的主要内容,如果未能解决你的问题,请参考以下文章
springcloud中openfeign止hystrix的几个问题
springcloud中openfeign止hystrix的几个问题