最近写一个小项目,使用了微服务的架构,当然就少不了openfeign和hystrix。在使用过程中可谓是问题频频,而且遇到问题不好解决。
1. 新版本的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的请求模板就可以了
@ConfigurationpublicclassFeignConfigimplementsRequestInterceptor{@Overridepublicvoidapply(RequestTemplaterequestTemplate){vartoken=getToken();requestTemplate.header("X-Token",getToken());}privateStringgetToken(){ServletRequestAttributesservletRequestAttributes=(ServletRequestAttributes)RequestContextHolder.getRequestAttributes();if(servletRequestAttributes!=null){HttpServletRequestrequest=servletRequestAttributes.getRequest();if(request!=null){returnrequest.getHeader("X-Token");}}return"";}}
但是在实际的使用过程中就发现了第四个问题。没法获得HttpServletRequest
3. RequestContextHolder.getRequestAttributes();为空 网络上普遍的说明是增加一个RequestContextListner的配置
@BeanpublicRequestContextListenerrequestContextListener(){returnnewRequestContextListener();}
然并卵,增加了也没啥用。 最后再某个角落发现了原来是hystrix开启了后,hystrix的隔离策略的问题。
hystrix:command:default:execution:isolation:strategy:SEMAPHORE
相对简单的解决了这个问题,然后该方案不是官方很推荐的方案,官方推荐自定义并发策略,需要自己编写一个类,让其继承 HystrixConcurrencyStrategy类,重写wrapCallable方法,出于时间考虑,先把项目跑起来吧,随后尝试其他方法。