解决Spring Cloud Feign 请求时附带请求头的问题
问题描述
Feign在请求时是不会将request的请求头带着请求的,导致假如Feign调用的接口需要请求头的信息,比如当前用户的token之类的就获取不到
解决方案FeignConfiguration
通过实现Feign的RequestInterceptor将从上下文中获取到的请求头信息循环设置到Feign请求头中。
/** *feign配置文件 *将请求头中的参数,全部作为feign请求头参数传递 *@author:linjinp *@create:2020-06-2809:54 **/ @Configuration publicclassFeignConfigurationimplementsRequestInterceptor{ @Override publicvoidapply(RequestTemplaterequestTemplate){ HttpServletRequestrequest=SpringContextUtils.getHttpServletRequest(); EnumerationheaderNames=request.getHeaderNames(); if(headerNames!=null){ while(headerNames.hasMoreElements()){ Stringname=headerNames.nextElement(); Stringvalues=request.getHeader(name); requestTemplate.header(name,values); } } } }
使用
通过configuration=FeignConfiguration.class指定这次Feign请求走哪种配置
@FeignClient(name="admin",contextId="factoryPlmseriesRelation",configuration=FeignConfiguration.class) //@FeignClient(name="admin2",contextId="factoryPlmseriesRelation",url="http://127.0.0.1:8582/",configuration=FeignConfiguration.class) publicinterfaceFeignFactoryPlmseriesRelationService{ /** *根据当前用户,获取工厂与PLM关联关系 *@return */ @GetMapping(value="/factoryPlmseriesRelation/getFactoryPlmseriesRelation") ErrorMsg>getFactoryPlmseriesRelation(); }
配置修改
主要是hystrix.command.default.execution.isolation后面的配置,需要将hystrix配置为信号量模式,否则会出现由于隔离策略导致获取不到请求头
#ribbon配置 ribbon: OkToRetryOnAllOperations:false#对所有操作请求都进行重试,默认false ReadTimeout:5000#负载均衡超时时间,默认值5000 ConnectTimeout:5000#ribbon请求连接的超时时间,默认值2000 MaxAutoRetries:0#对当前实例的重试次数,默认0 MaxAutoRetriesNextServer:1#对切换实例的重试次数,默认1 #hystrix配置 hystrix: command: default:#default全局有效,serviceid指定应用有效 execution: timeout: #是否开启超时熔断 enabled:true isolation: thread: timeoutInMilliseconds:10000#断路器超时时间,默认1000ms #hystrix隔离模式改为信号量模式,feign才能获取到父线程中的请求头 strategy:SEMAPHORE #允许的并发量,默认值为10 semaphore: maxConcurrentRequests:100
总结
到此这篇关于解决SpringCloudFeign请求时附带请求头的问题的文章就介绍到这了,更多相关SpringCloudFeign请求头内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!