首页 > 编程语言 > 详细

Springboot feign 传递request信息

时间:2020-02-13 10:24:18      阅读:1246      评论:0      收藏:0      [点我收藏+]

基础实现

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信息

原文:https://www.cnblogs.com/ztwBlog/p/12302133.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!