zoukankan      html  css  js  c++  java
  • 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()
            )
        }
    }
    

    结束。

  • 相关阅读:
    Network Flows(借助ortools)
    【转】一张图看懂IaaS, PaaS和SaaS的区别
    论文中的一些符号 O(big-Oh) Ω(big-omega) Θ(big-theta)
    最大流问题
    4 Mininet测量路径的损耗率
    3 Mininet命令延伸实验拓展
    2 Mininet可视化应用
    快速定位问题
    软中断与软中断的排查
    系统出现大量不可中断进程与僵尸进程
  • 原文地址:https://www.cnblogs.com/ztwBlog/p/12302133.html
Copyright © 2011-2022 走看看