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()
            )
        }
    }
    

    结束。

  • 相关阅读:
    如何编写优雅的代码:05. 设计模式(下)
    ArcGIS之Cartogram地图变形记
    GIS规划应用——基于哈夫模型的GIS服务区分析
    基于GIS的旅游辐射区人口统计
    图斑整理之字段计算器使用技巧
    ArcGIS制作放射状流向地图(Radial Flow Map)
    SQL Server时间粒度系列
    (原)SQL Server 代理作业执行持续时间简述
    (原)SQL Server 系统提供功能的三个疑惑
    sql server实现自定义分割月功能
  • 原文地址:https://www.cnblogs.com/ztwBlog/p/12302133.html
Copyright © 2011-2022 走看看