Controller接收到请求后,我们可以在service中通过feign直接调用其它服务的接口,但是,controller接收到的请求和通过feign调用其它服务,其它服务接收到的请求,是不一样的。例如我们往往习惯于在header中放入用户的token信息,在不做处理的情况下,其它服务接收到的请求,可能就是无用户信息状态,这种请求应该判定为无效状态。
在服务的提供方或者调用方定义一个拦截器,将当前请求的token信息手动添加到feign请求的header中。
@ConfigurationpublicclassFeignRequestInterceptorConfigimplementsRequestInterceptor{@BeanpublicRequestContextListenerrequestContextListener(){returnnewRequestContextListener();}@Overridepublicvoidapply(RequestTemplate requestTemplate){ServletRequestAttributes attributes=(ServletRequestAttributes)RequestContextHolder.getRequestAttributes();if(ObjectUtils.isEmpty(attributes)){return;}HttpServletRequest request= attributes.getRequest();String token= request.getHeader("token"); requestTemplate.header("token", token);}}
在使用过程中,可能会涉及到在请求方获取自己的token信息都是为空的,查看一下是否是Hystrix策略导致的,如下配置可以解决该问题。
hystrix: command:default: execution: timeout: #如果enabled设置为false,则请求超时交给ribbon控制 enabled:true isolation: # 隔离策略 strategy: SEMAPHORE thread: timeoutInMilliseconds:100000