当前位置: 首页 > wzjs >正文

石家庄医疗网站建设网站里的活动专题栏怎么做

石家庄医疗网站建设,网站里的活动专题栏怎么做,线下推广方案,设计网页时分辨率是多少深入探讨:异步调用和MQ消费者场景下请求上下文缺失问题及解决方案 在微服务开发过程中,我们常常会遇到各种复杂的场景,其中异步调用和MQ消费者场景下的请求上下文缺失问题,是一个值得深入探讨的技术点。本文将结合具体的代码示例…

深入探讨:异步调用和MQ消费者场景下请求上下文缺失问题及解决方案

在微服务开发过程中,我们常常会遇到各种复杂的场景,其中异步调用和MQ消费者场景下的请求上下文缺失问题,是一个值得深入探讨的技术点。本文将结合具体的代码示例,详细分析这两个场景下问题产生的原因,并给出相应的解决方案。

一、背景引入

在微服务架构中,我们使用OpenFeign实现服务间的HTTP通信。为了确保服务间通信的安全性,通常需要在请求头中携带诸如token等认证信息。以下是一个用于在Feign请求中添加token的拦截器配置类代码:

import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;/*** @author : 胡浩* @version 1.0* @description: Feign 配置类,用于在请求头中添加 Token* @date 2022/11/15 18:37*/
@Configuration
public class FeignConfig implements RequestInterceptor {@Overridepublic void apply(RequestTemplate requestTemplate) {ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();HttpServletRequest request = attributes.getRequest();requestTemplate.header("token", request.getHeader("token"));}
}

该代码通过RequestContextHolder获取当前请求的上下文,进而从HttpServletRequest对象中提取token,并添加到Feign的请求头中。然而,在异步调用和MQ消费者场景下,RequestContextHolder.getRequestAttributes()却会返回null,这就导致Feign调用无法携带必要的认证信息。

二、异步调用场景下的问题剖析

(一)问题原因

在异步编排过程中,RequestAttributes存储在ThreadLocal中。由于主线程的ThreadLocal变量不会自动传递给子线程,所以当我们在子线程中执行异步任务并调用Feign客户端时,拦截器无法获取到主线程的请求上下文,也就无法获取到原有的请求头信息,例如token。这就导致Feign调用缺失必要的认证信息,可能引发服务调用失败或权限不足等问题。

(二)解决方案

  1. 启用异步支持:在Spring Boot应用中,首先需要在配置类上添加@EnableAsync注解来启用异步支持。
  2. 手动传递上下文:由于Spring的@Async异步处理默认不会传递线程本地变量,所以我们需要手动将父线程的上下文传递给子线程。可以通过以下代码实现:
ServletRequestAttributes sra = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
RequestContextHolder.setRequestAttributes(sra, true);

这里的第二个参数true表示该属性是可继承的,这样设置后,子线程就能够访问到父线程的请求属性,从而在Feign调用时可以正确携带token等信息。

三、MQ消费者场景下的问题剖析

(一)问题原因

当消息队列的消费者处理消息时,通常是在一个独立的线程中执行的。这个线程并非由HTTP请求触发,因此不存在与HTTP请求关联的RequestAttributes。所以,RequestContextHolder无法获取到原有的请求上下文,导致Feign调用时无法携带token等信息。这就使得MQ消费者在调用其他服务时,可能因为缺少认证信息而无法正常访问受保护的接口。

(二)解决方案

  1. 手动设置请求上下文:在消费者处理消息的逻辑中,手动设置请求上下文。可以从消息体中提取必要的信息,构建一个模拟的请求上下文,并将其设置到RequestContextHolder中。
  2. 在消息体中包含认证信息:在发送消息时,将必要的认证信息,如token,包含在消息体中。这样在消费者处理消息并进行Feign调用时,可以直接从消息体中获取认证信息,并添加到Feign请求头中。

四、总结

无论是异步调用还是MQ消费者场景,出现请求上下文缺失问题的根本原因在于ThreadLocal的线程隔离特性。这一特性使得在跨线程或非HTTP请求触发的场景下,无法自动获取上下文。为了解决这一问题,我们需要在这些场景中手动处理上下文的传递或设置,确保Feign调用能够正确携带所需的请求头信息,从而保证微服务间通信的安全性和稳定性。通过对这些问题的深入理解和有效解决,我们能够更好地构建健壮的微服务架构应用。

http://www.dtcms.com/wzjs/554989.html

相关文章:

  • 企业门户网站特征开源php表单系统
  • 房屋中介网站模板怎样做校园网站
  • 银川网站建设哪家优婚纱网站制作
  • 网上做效果图网站如何在手机上做自己的网站6
  • 深圳网站开发设计公司排名郑州设计公司有哪些
  • 南昌网站建设公司网站建设公司哪家好一站式做网站公司
  • php中网站搜索功能实现如何自己做淘宝网站
  • 做外国网站自媒体动漫做暧视频在线观看网站
  • 开发网站过程随州做网站的公司
  • 做百度推广得用网站是吗wordpress文章筛选
  • 网站开发架构分类网站数据丢失
  • 带表情的wordpress留言seo网站建设时文章频率
  • 酒店如何做团购网站个人网站主页怎么做
  • 移动商城 网站建设方法方式网络营销的机遇和挑战
  • 公司 网站 苏州wordpress slider使用
  • 北京网站设计十年乐云seo怎么做网站自己当站长
  • 怎样建设一个网站wordpress 众筹模板
  • 如果建立网站广州网络广告推广公司
  • 一个网站怎么做app有没有做网站的团队
  • 建设银行网站看不到e商百度电话怎么转人工
  • 阿里云建站后台wordpress火车头采集软件发布接口
  • 网站seo诊断湖南岚鸿诊断icp备案查询
  • 网页设计需要做什么东莞网站优化方法有哪些
  • 免费建立网站论坛企业网站打包下载
  • 开发网站合作协议天元建设集团有限公司设计研究院赵纪峰联系方式
  • 湖州专业做网站线上设计师接单
  • linux主机做网站网站模版化配置
  • 燃气公司网站建设方案网站商品展示设计
  • 中国建设银行官企业网站官方网站app
  • 内网穿透做网站个人网站能百度推广吗