微服务之间调用,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发起请求的时候都会调用该方法,传递用户信息。

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

相关推荐
我命由我123457 分钟前
SEO 与 GEO 极简理解
java·linux·运维·开发语言·学习·算法·运维开发
我材不敲代码9 分钟前
Python基础:注释的写法(单行、多行、文档注释)
服务器·python·microsoft
dxxt_yy9 分钟前
鼎讯信通 TY-30H 光纤熔接机:铁路通信施工设备科普
网络
金銀銅鐵9 分钟前
[Java] 自己写程序,来解析方法的 descriptor
java·后端
红辣椒...16 分钟前
codex+第三方模型
java·服务器·前端
Web极客码25 分钟前
AI的下一个风口:智能助力超越ChatGPT
服务器·人工智能·ai编程
一个做软件开发的牛马26 分钟前
Java 继承与多态:从"是什么"到"能做什么"的设计思维
java·后端
不懂的浪漫36 分钟前
05|Netty ByteBuf 源码分析:为什么不用 Java ByteBuffer
java·netty
wapicn9942 分钟前
API接口调试笔记:从注册到第一个数据返回,全流程详解
java·开发语言·python·lua
2401_8685347843 分钟前
RTOS与Linux的区别对比解析
linux·运维·服务器