FeignClient传递标题

时间:2019-10-25 10:26:37

标签: spring-boot spring-cloud-feign

我有大约10个微服务,全部使用Eureka和FeignClients通过Spring boot 2构建。我的微服务使用某些标头值来跟踪数据,因此当使用FeignClient时,它需要传递传入请求中的某些值。因此,如果微服务1调用了微服务2,则它必须将传入请求中的标头传递到微服务2上。我无法找到如何做到这一点。我了解他们是@Header,但是如果您有20个FeignClients,那么您就不必手动将@header添加到所有FeignClients。您能指出FeignClients必须从传入的请求中读取某个标头并将其传递给FeignClient吗?

1 个答案:

答案 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();
    }

}