我有大约10个微服务,全部使用Eureka和FeignClients通过Spring boot 2构建。我的微服务使用某些标头值来跟踪数据,因此当使用FeignClient时,它需要传递传入请求中的某些值。因此,如果微服务1调用了微服务2,则它必须将传入请求中的标头传递到微服务2上。我无法找到如何做到这一点。我了解他们是@Header,但是如果您有20个FeignClients,那么您就不必手动将@header添加到所有FeignClients。您能指出FeignClients必须从传入的请求中读取某个标头并将其传递给FeignClient吗?
答案 0 :(得分:1)
您可以在Feign
中使用请求拦截器。
示例实现:
请求拦截器:
@Component
public class MyRequestInterceptor implements RequestInterceptor {
@Override
public void apply(RequestTemplate template) {
ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
String authorization = requestAttributes.getRequest().getHeader(HttpHeaders.AUTHORIZATION);
if(null != authorization) {
template.header(HttpHeaders.AUTHORIZATION, authorization);
}
}
}
Bean配置:
@Configuration
public class CustomFeignConfig {
@Bean
public Contract feignContract() {
return new feign.Contract.Default();
}
@Bean
public MyRequestInterceptor basicAuthRequestInterceptor() {
return new MyRequestInterceptor();
}
@Bean
public OkHttpClient client() {
return new OkHttpClient();
}
}