Controller接收到请求后,我们可以在service中通过feign直接调用其它服务的接口,但是,controller接收到的请求和通过feign调用其它服务,其它服务接收到的请求,是不一样的。例如我们往往习惯于在header中放入用户的token信息,在不做处理的情况下,其它服务接收到的请求,可能就是无用户信息状态,这种请求应该判定为无效状态。
在服务的提供方或者调用方定义一个拦截器,将当前请求的token信息手动添加到feign请求的header中。
@Configuration
public class FeignRequestInterceptorConfig implements RequestInterceptor {
@Bean
public RequestContextListener requestContextListener() {
return new RequestContextListener();
}
@Override
public void apply(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