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

微服务之间调用,OpenFeign传递用户(RequestInterceptor接口)

场景:微服务之黑马商城项目-登录拦截器在网关完成用户的校验,并将用户信息(用户id)存入请求头,假设将购物车里面的商品进行结算就会生成订单并清空购物车,这里涉及到了交易服务模块远程调用购物车模块,网关将用户信息存入请求头,公共模块(common)将用户信息存入threadlocal中,然后交易服务模块能正常访问到这个线程里面的用户信息,但是交易服务发起远程调用的购物车服务需要完成清空购物车就需要获取当前用户的信息,然而购物车服务并不能之间获取threadlocal线程里面的用户信息,因为请求的从交易服务发起的,而不是从网关发起的,所以这里需要用到一个oppenfeign提供的拦截器,这个拦截器作用:每次服务之间发起远程调用的时候,都可以去修改请求头中的信息,这里我们利用这个来传用户信息,下面看如何使用。

前端发起的请求都会经过网关再到微服务,由于我们之前编写的过滤器和拦截器功能,微服务可以轻松获取登录用户信息。

但有些业务是比较复杂的,请求到达微服务后还需要调用其它多个微服务。比如下单业务,流程如下:

下单的过程中,需要调用商品服务扣减库存,调用购物车服务清理用户购物车。而清理购物车时必须知道当前登录的用户身份。但是,订单服务调用购物车时并没有传递用户信息,购物车服务无法知道当前用户是谁!

由于微服务获取用户信息是通过拦截器在请求头中读取,因此要想实现微服务之间的用户信息传递,就必须在微服务发起调用时把用户信息存入请求头

微服务之间调用是基于OpenFeign来实现的,并不是我们自己发送的请求。我们如何才能让每一个由OpenFeign发起的请求自动携带登录用户信息呢?

这里要借助Feign中提供的一个拦截器接口:feign.RequestInterceptor

 
public interface RequestInterceptor {


 /** 
 * Called for every request.
 * Add data using methods on the supplied {@link RequestTemplate}. 
 */ 

void apply(RequestTemplate template); 



}

我们只需要实现这个接口,然后实现apply方法,利用RequestTemplate类来添加请求头,将用户信息保存到请求头中。这样以来,每次OpenFeign发起请求的时候都会调用该方法,传递用户信息。

然后在交易服务配置一下让这个配置类生效


http://www.kler.cn/a/369614.html

相关文章:

  • 【文献及模型、制图分享】基于投入品减量增效视角的长江经济带农业生产绿色化演进研究
  • RHCE的学习(8)
  • 大数据-193 Apache Tez - DAG 作业计算框架 核心解释 工作原理 配置集成
  • 新华三H3CNE网络工程师认证—OSPF路由协议
  • 基于vue、VantUI、django的程序设计
  • TikTok视频上传失败:原因与解决方案
  • JavaSet集合
  • [332]基于springboot的养老院管理系统
  • 基于SpringBoot的洗浴管理系统【附源码】
  • 400行程序写一个实时操作系统(十七):调度算法的实现
  • Sqoop的安装配置及使用
  • 梧桐数据库锁处理过程
  • Cesium基础-(Entity)-(point)
  • (STM32笔记)十二、DMA的基础知识与用法
  • OBOO鸥柏丨液晶拼接大屏KVM分布式输入输出节点控制系统技术
  • C/C++每日一练:实现冒泡排序
  • Spring Boot 3项目创建与示例(Web+JPA)
  • 厨艺爱好者的在线聚集地:Spring Boot实现
  • 2022 icpc南京(I,G,A,D,M,B)
  • GATK Funcotator 详解
  • [论文阅读]Large Language Model guided Protocol Fuzzing
  • MinIO服务部署指南
  • 线程的理解及基本操作
  • 如何使用 Vite 创建一个项目(Vue 或者 React)
  • Linux常用命令 yum 命令介绍
  • Eslint检查报错-关闭vue项目中的eslint