一次工作中使用fegin远程异步调用遇到的问题

本文探讨了在微服务中使用Feign进行远程调用时可能遇到的问题,包括请求头丢失和异步调用时的上下文丢失。针对这些问题,提出了两种解决方案:在拦截器中补充请求头,以及在异步线程中手动设置上下文。通过理解Spring的RequestContextHolder和ThreadLocal的工作原理,可以有效地解决这些问题。
摘要由CSDN通过智能技术生成

在工作中使用微服务分布式技术,就避免不了远程调用其他服务的接口。那么在使用fegin远程调用的时候会发生哪些意想不到的情况呢!

1、fegin远程调用丢失请求头的问题

用一个例子说明, 如图所示:
在这里插入图片描述
我在课程服务中使用fegin远程调用订单服务的一个查询接口,查询该用户是否购买过此课程,却发生了异常,丢失了请求头,通过debug如图所示:

1、先走feigin远程调用的拦截器。在这里插入图片描述
经过拦截器后发现请求未携带。
在这里插入图片描述
在这里插入图片描述
通过这个流程图发现fegin的远程调用,会经过拦截器,如果发现请求中未携带请求头,那么它调用订单服务时会发现没有被认证,导致远程调用失败。那么遇到这个问题怎么处理呢!
第一种:在自己服务编写的拦截器中把请求头携带上
第二种:在订单拦截器中,识别为微服务间的调用,不需要额外认证。
我们这里使用第一种方式,第二种方式,其实就是在拦截器时,把微服务之间的调用放行。

如图所示:
在这里插入图片描述
那么我们解决了第一个问题,如果我们为这个远程调用加上异步请求,会发生啥呢?
代码如图所示:
在这里插入图片描述

2、fegin远程异步调用丢失上下文问题:

在spring中,有一个关于上下文管理的类RequestContextHolder.java
通过源码观看,我们可以发现上下文对象是保存在ThreadLocal中的。
在这里插入图片描述

通过源码分析,我们得出这样的一张图:
在这里插入图片描述
因为上下文保存在ThreadLocal中,我们开启异步线程的话,线程之间的上下文就不再共享了,因为都和主线程不是同一个线程了,那么怎么样解决这个问题呢?
我们只需要在开启异步线程时把主线程的上下文set进异步线程就可以了。
代码如下:
在这里插入图片描述
只需要在把主线程的上下文获取到,在放入到异步线程中,就可以了。

写在最后:线程池的使用及其原理可以我的另外一篇文章:了解线程池
关于fegin的远程调用原理我这里只简单的描述了一下,更多的知识还需要自己去了解,这里主要是记录一下工作中遇到的问题,以及自己是怎么去解决的。
最后,希望大家一起努力,有不足的指点出来,欢迎指正,over。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值