Springboot feign 传递request信息

Posted Jnew

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Springboot feign 传递request信息相关的知识,希望对你有一定的参考价值。

基础实现

requestInterceptor 实现类中添加信息

public class NativeFeignConf {
    @Bean
    public RequestInterceptor getRequestInterceptor(){
        return new RequestInterceptor() {
            @Override
            public void apply(RequestTemplate requestTemplate) {
                ServletRequestAttributes servletRequestAttributes=(ServletRequestAttributes)RequestContextHolder.currentRequestAttributes();
                HttpServletRequest req=servletRequestAttributes.getRequest();
                Map<String,Collection<String>> headerMap=new HashMap();
                //获取你需要传递的头信息
                String myHeaderVal=req.getHeader("myHeader");
                headerMap.put("myHeader",Arrays.asList(myHeaderVal));
                //feign请求时,便可携带上该信息
                requestTempalte.headers(headerMap);
    }
}

feign加入该config

@FeignClient(
    value="target-service",
    configuration=NativeFeignConf.class //加入该配置
)
public interface MyFeign(){
    ...
} 

开启 Hystrix 的情况下

开启hystrix后,feign请求,会运行在hystrix管理的另一线程下。

所以RequestContextHolder.currentRequestAttributes()无法获取值。

解决方法:

创建一个自定义的hystrix 线程策略, 将servletRequestAttributes传入新线程中,并赋给RequestContextHolder:

public class MyHystrixConcurrencyStrategy extends HystrixConcurrencyStrategy{
    @Override
    public <T> Callable<T> wrapCallable(Callable<T> callable){
        ServletRequestAttributes servletRequestAttributes=(ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        return new Callable<T>() {
            @Override
            public T call() throws Exception {
                try {
                    if (null != servletRequestAttributes) {
                        RequestContextHolder.setRequestAttributes(servletRequestAttributes);
                    }
                    return callable.call();
                }finally {
                    RequestContextHolder.resetRequestAttributes();
                }
            }
        };
    }
}

注册该策略

@Configuration
public class HystrixConfig{
    @PostConstruct
    public void init(){
        HystrixPlugins.getInstance().registerConcurrencyStrategy(
            new MyHystrixConcurrencyStrategy()
        )
    }
}

结束。

以上是关于Springboot feign 传递request信息的主要内容,如果未能解决你的问题,请参考以下文章

feign接口调用时问题整理

SpringBoot+SpringCloud实现登录用户信息在微服务之间的传递

SpringBoot+SpringCloud实现登录用户信息在微服务之间的传递

springboot通过HttpServletRequestWrapper获取所有请求参数

SpringBoot 集成Feign的使用

SpringBoot如何使用Feign实现远程接口调用