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

    结束。

  • 相关阅读:
    随笔javascript/html5裁剪初试
    javascript开发随笔1,preventDefault的必要
    uploadify/swfupload HTTP_ERROR 406、302
    Python中__init__方法注意点
    ehcache.xsd No grammar constraints (DTD or XML Schema).
    Eclipse Organize Import 批量导包
    eclipse thymeleaf 插件安装
    windows 下 查看某个端口是否已经使用
    找符号网
    杀毒软件
  • 原文地址:https://www.cnblogs.com/ztwBlog/p/12302133.html
Copyright © 2011-2022 走看看