精华内容
下载资源
问答
  • 多线程调用时,会丢失原请求的请求头。需要使用一下代码将原请求头的信息带入, RequestContextHolder.setRequestAttributes(RequestContextHolder.getRequestAttributes(), true);

    多线程调用时,会丢失原请求的请求头。需要使用一下代码将原请求头的信息带入,

    在这里插入图片描述
    在这里插入图片描述

    RequestContextHolder.setRequestAttributes(RequestContextHolder.getRequestAttributes(), true);

    展开全文
  • 多线程feign调用异常

    在主线程中调用feign可以正常调用,但是重新开一个子线程发起调用就报错

    Error creating bean with name 'scopedTarget.oauth2ClientContext': Scope 'request' is not active for the current thread; consider defining a scoped proxy for this bean if you intend to refer to it from a singleton; nested exception is java.lang.IllegalStateException: No thread-bound request found: Are you referring to request attributes outside of an actual web request, or processing a request outside of the originally receiving thread? If you are actually operating within a web request and still receive this message, your code is probably running outside of DispatcherServlet: In this case, use RequestContextListener or RequestContextFilter to expose the current request

    有没有大佬知道解决方法!!!

    展开全文
  • 在微服务中,多线程异步+Feign调用会出现请求头丢失 解决 在主线程中先获取请求头参数 传入子线程中 由子线程将请求头参数设置到上下文中 最后在Feign转发处理中拿到子线程设置的上下文的请求头数据,转发到下游。 ...
    问题

    在微服务中,多线程异步+Feign调用会出现请求头丢失

    解决
    1. 在主线程中先获取请求头参数
    2. 传入子线程中
    3. 由子线程将请求头参数设置到上下文中
    4. 最后在Feign转发处理中拿到子线程设置的上下文的请求头数据,转发到下游。

    获取上下文请求参数工具类

    @Slf4j
    public class RequestContextUtil {
    
        /**
         * 获取请求头数据
         *
         * @return key->请求头名称 value->请求头值
         * @author zhengqingya
         * @date 2021/6/30 9:39 下午
         */
        public static Map<String, String> getHeaderMap() {
            Map<String, String> headerMap = Maps.newLinkedHashMap();
            try {
                ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
                if (requestAttributes == null) {
                    return headerMap;
                }
                HttpServletRequest request = requestAttributes.getRequest();
                Enumeration<String> enumeration = request.getHeaderNames();
                while (enumeration.hasMoreElements()) {
                    String key = enumeration.nextElement();
                    String value = request.getHeader(key);
                    headerMap.put(key, value);
                }
            } catch (Exception e) {
                log.error("《RequestContextUtil》 获取请求头参数失败:", e);
            }
            return headerMap;
        }
    
    }
    

    请求头上下文

    @Slf4j
    public class RequestHeaderHandler {
    
        public static final ThreadLocal<Map<String, String>> THREAD_LOCAL = new ThreadLocal<>();
    
        public static void setHeaderMap(Map<String, String> headerMap) {
            THREAD_LOCAL.set(headerMap);
        }
    
        public static Map<String, String> getHeaderMap() {
            return THREAD_LOCAL.get();
        }
    
        public static void remove() {
            THREAD_LOCAL.remove();
        }
    
    }
    

    Feign转发处理rpc调用传参

     */
    @Slf4j
    @Configuration
    public class FeignRequestInterceptor implements RequestInterceptor {
    
        @Override
        @SneakyThrows
        public void apply(RequestTemplate requestTemplate) {
            log.debug("========================== ↓↓↓↓↓↓ 《FeignRequestInterceptor》 Start... ↓↓↓↓↓↓ ==========================");
            Map<String, String> threadHeaderNameMap = RequestHeaderHandler.getHeaderMap();
            if (!CollectionUtils.isEmpty(threadHeaderNameMap)) {
                threadHeaderNameMap.forEach((headerName, headerValue) -> {
                    log.debug("《FeignRequestInterceptor》 多线程 headerName:【{}】 headerValue:【{}】", headerName, headerValue);
                    requestTemplate.header(headerName, headerValue);
                });
            }
            Map<String, String> headerMap = RequestContextUtil.getHeaderMap();
            headerMap.forEach((headerName, headerValue) -> {
                log.debug("《FeignRequestInterceptor》 headerName:【{}】 headerValue:【{}】", headerName, headerValue);
                requestTemplate.header(headerName, headerValue);
            });
            log.debug("========================== ↑↑↑↑↑↑ 《FeignRequestInterceptor》 End... ↑↑↑↑↑↑ ==========================");
        }
    
    }
    

    使用案例

    @Slf4j
    @RestController
    @RequestMapping("/web/api/demo/test")
    @Api(tags = "测试api")
    @AllArgsConstructor
    public class RpcController extends BaseController {
    
        private SystemTaskThread systemTaskThread;
    
        @GetMapping("getContextUserId")
        @ApiOperation("rpc调用测试 - Async")
        public void getContextUserId() {
            Map<String, String> headerMap = RequestContextUtil.getHeaderMap();
            log.info("主线程请求头值: {}", headerMap.get("userId"));
            this.systemTaskThread.getRequestHeaderUserId(RequestContextUtil.getHeaderMap());
        }
    
    }
    
    @Slf4j
    @Component
    @AllArgsConstructor
    public class SystemTaskThread {
    
        private ISystemClient systemClient;
    
        @SneakyThrows
        @Async(ThreadPoolConstant.SMALL_TOOLS_THREAD_POOL)
        public void getRequestHeaderUserId(Map<String, String> headerMap) {
            RequestHeaderHandler.setHeaderMap(headerMap);
            log.info("子线程请求头值: {}", this.systemClient.getRequestHeaderUserId());
        }
    
    }
    

    注:网上也有资料提到在主线程获取请求参数RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();传到子线程中,再重新赋值RequestContextHolder.setRequestAttributes(requestAttributes); 但是这种方式小编尝试无效,顺便记录在这里吧~

    本文案例demo源码

    https://gitee.com/zhengqingya/small-tools


    今日分享语句:
    在你失落时,千万不好失去对生活的信心;
    在你受挫折时,千万不好埋怨上天的不公;
    当你失败时,千万不好失去对成功的追求;
    人,总要经受住各种考验。

    展开全文
  • 微服务中尝试使用多线程访问其他服务,通过服务接口调用失败, 通过Debug模式,跟随子线程调用链,发现处理服务发送时的请求头设置中, ServletRequestAttributes attributes = (ServletRequestAttributes) ...

    微服务中尝试使用多线程访问其他服务,通过服务接口调用失败,

    通过Debug模式,跟随子线程调用链,发现处理服务发送时的请求头设置中,

    ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder
            .getRequestAttributes();
    
    HttpServletRequest request = attributes.getRequest();

    获取的request为null,

    通过度娘几番查找,找到一篇文章解决request为null的问题,

    https://blog.csdn.net/schcilin/article/details/92403362

    通过文章发现,在Spring cloud微服务中,feign开启了熔断器(hystrix):feign.hystrix.enabled=ture,并且使用默认的信号隔离级别,、HttpServletRequest对象在父线程与子线程是相互独立的,不共享的。所以子线程中使用父线程的HttpServletRequest数据为null。

    在我的测试代码中使用feign API接口前调用

    RequestContextHolder.setRequestAttributes(RequestContextHolder.getRequestAttributes(), true);

    来设置将父线程的HttpServletRequest对象设置共享,

     

    展开全文
  • 记一次多线程调用Feign接口失败问题及其优化 自从学会用CompletableFuture来快速构建一个异步方法,就开始到处装逼,到处优化,但是在一次线上环境中反馈短信和消息没有发出去,我赶紧排查问题,前面说下我的发短信...
  • 主线程里创建子线程调用feign接口,通过header消息头带token信息方式,在子线程header里获取不到Authorization信息,以至于子线程用户校验出现问题。以下代码块可以解决子线程继承主线程的header信息以避免该问题。 ...
  • Feign接口 多线程问题

    2021-04-15 20:06:20
    Spring Cloud Feign传输Header,并保证多线程情况下也适用 一、现象 微服务在生产中,常遇到需要把 header 传递到下一子服务的情况(如服务A访问服务B的接口,需要传递header),网上大多数的方案是实现 ...
  • 场景:在Mq的监听中,去调用其他的微服务,在对Feign进行拦截的时候报错 在链路拦截日志的RequestInterceptor中,我们可以看到通过下面方法,没有取得request的信息 RequestContextHolder.currentRequestAttributes...
  • 多线程调用fegin接口失败的问题!

    千次阅读 2019-07-24 13:33:25
    我们开了10个线程,每个线程会循环执行50次方法,也就是每个线程会循环调用50次fegin接口。 程序在运行到中间的时候会抛出 java.util.concurrent.RejectedExecutionException: Task java.util.concurrent....
  • Feign远程调用出现的401报错

    千次阅读 2020-07-18 14:11:36
    Caused by: feign.FeignException$Unauthorized: [401 Unauthorized] during [GET] to [http://dcms-app-biz/cashpledgebatch/deposit/refund?startDate=20-7-15%20%E4%B8%8A%E5%8D%8812%3A00&endDate=20-7-15%...
  • 在微服务两个实例直接调用的时候会打印出一些日志但是发现这些日志的log_id变了,正常来说应该是保持一致的,实例A调用B的时候发现log_id是一致的,但是实例B调用A就不一致了,后来调试了一下发现问题出在断路器-...
  • 开场白生活是美好的,咱们无论什么时候得充满信心,对未来...-赫拉克利特问题描述有时候有这样的需求,客户端通过feign的client进行调用服务的接口,进行跑数据,但是这个跑数据是批量跑,需要耗费很长的时间进行返...
  • 该逻辑中涉及个子系统之间的调用,原本的调用方式为使用RestTemplate,走服务名调用,并没有问题。后来接口改造为了调用方便,引入feign,于是导致获取不到irequest上下文及无法传递header及cookie等问题。 问题...
  • Spring Cloud Feign传输Header,并保证多线程情况下也适用 一、现象 微服务在生产中,常遇到需要把 header 传递到下一子服务的情况(如服务A访问服务B的接口,需要传递header),网上大多数的方案是实现 ...
  • } } 在feign调用远程服务的过程中,会一层层调用过滤器,我们需要在requestInterceptor拦截器里面重新将前端传递过来的请求头里面的信息赋值到新的请求,所以这里添加一个配置类:这种方式能够解决只是一个feign...
  • 问题:Feign调用服务报错:Load balancer does not have available server for client:xxx 原因:这个xxx服务未找到 解决思路: 1、先看看注册中心是否有这个xxx服务,服务名称必须是xxx,我们用的注册中心是nacos,...
  • 下游服务可用,feign调用直接熔断 feign服务: 熔断调用fallback: 解决方法: 在熔断方法中抛出异常, 理由:hystrix线程池里的任务线程执行fallback,不用主调用方所抛出的,所以必须要try…catch 参考链接:...
  • 1、feign远程调用丢失头 解决:设置feign的求情拦截器 @Configuration public class MyFeignConfig { @Bean("requestInterceptor") public RequestInterceptor requestInterceptor(){ RequestInterceptor ...
  • 然后就可以提供Feign进行调用,正常显示数据和页面。关于负载均衡和对象传递,请继续看。第一步、创建一个项目Feign,添加依赖:org.springframework.cloudspring-cloud-starter-eureka-serverorg.springframework....
  • 使用springcloud的过程中,微服务间调用的情况是非常的,其中springcloud有提供feign调用的方式,来实现服务间的通信。 对于post请求大多都是使用RequestBody注解来表示请求参数,基本上不会存在什么问题,但是...
  • feign调用初始化问题

    2021-07-20 17:58:09
    1、制作初始化函数,项目刚启动时,就调用一下feign,次方案虽然能解决问题,但是需要编写的代码太,不推荐 2、使用 饿了模式启动加载服务,配置如下 #请求处理的超时时间 ribbon: eager-load: #饿了模式启动 ...
  • 在springboot项目中,有时会遇到多线程或parallelStream(并行流)通过feign调用远程接口,并且被调用的接口需要token验证,一般通过以下方式 @Component public class FeignClientInterceptor implements ...
  • } } } 而后在feign注册配置中实现一个全局的RequestInterceptor @Configuration public class FeginConfig { @Bean public RequestInterceptor requestInterceptor(){ return template -> { if (!...
  • 踩坑现场: 日志信息报错为空指针异常 排坑过程: 断点去查看源码: ...因此fegin调用服务时,response会返回null 解决方法: 去检查配置文件中的Eureka服务地址是否正确或者开启服务器
  • Feign 调用丢失Header的解决方案

    千次阅读 2019-11-20 14:21:26
    在 Spring Cloud 中 微服务之间的调用会用到Feign,但是在默认情况下,Feign 调用远程服务存在Header请求头丢失问题。 解决方案 首先需要写一个 Feign请求拦截器,通过实现RequestInterceptor接口,完成对所有的...
  • 背景 微服务调用的时候请求不会传递参数.比如调用方服务请求头中有cookie存放sessionId,而被调用方服务没有请求...本质是通过ThreadLocal线程共享变量实现. 代码实现 package com.kenai.gulimall.order.feign; i..
  •   由于SpringCloud并不像dubbo一样,在服务间调用的时候通过本身的线程变量去传输,但是SpringCloud肯定是有它自己的机制可以支持实现的,基于这种考虑,于是有了此篇博客。 实现思路 准备一个ThreadL...
  • 因为新的项目需要使用微服务的模式开发,所以需要学习REST接口调用,当学习Feign远程调用时,每次测试的结果都是null, 服务接口确认了好几遍也都没问题,百度的结果是启动类没有加入@EnableFeignClients注解,或者...
  • 实战项目的时候,直接向服务提供者请求资源时携带token请求头成功响应,紧接着通过服务消费者feign调用服务提供者发现提供者获取的请求头为空!!解决如下: 1. 实现Feign提供的一个接口RequestInterceptor @...
  • Spring Cloud提供了feign,能够轻松解决这个问题,feign能让我们调用远程服务方法就像调用本地方法一样,调用者完全感觉不到实在调用远程服务。其底层其实就是使用了RPC,对网络的请求和响应做了解析,在这里对RPC先...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 9,085
精华内容 3,634
关键字:

多线程feign调用

友情链接: siginfo.rar