问题描述
我们在使用基于SpringCloud微服务框架时,通常会使用到token,然后通过认证中心生产token后,所有的请求头携带该token,来验证当前请求的合法性,对于同步请求没有任何问题,当我们使用到了异步编程时,就有可能在子线程里获取不到这些请求头的参数。本篇文章针对异步+Feign调用遇见的一些问题做一个记录,避免其他人踩坑.文章目录
解决方案
以下解决方案主要是从目前主流的几种异步方式来提供各自的解决方案.一、常用的异步方式
- 手工创建线程(不推荐)
- 手工创建线程池
- @Async注解
二、请求头参数获取方式
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
// 获取当前线程的RequestAttribute,实际上是从一个ThreadLocal里获取的
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
// 转换为ServletRequest对象
HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest();
// 获取请求头参数
String authorization = request.getHeader("Authorization");
三、解决方案
1.手工创建线程
方式1:
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
public void newThread(){
// 获取主线程的requestAttribute对象
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
// 手工set到子线程里
RequestContextHolder.setRequestAttributes(requestAttributes,
本文介绍了在SpringCloud中遇到请求头参数在异步处理中丢失的问题及其解决方案。内容涉及手工创建线程、线程池、@Async注解、Feign调用等场景,并提出在异步线程中多次调用Feign接口时,如何确保请求头参数的传递,通过ThreadLocal和RequestContextHolder来保存和获取请求属性。
最低0.47元/天 解锁文章
1902

被折叠的 条评论
为什么被折叠?



