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

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

相关推荐
小雅痞4 分钟前
[Java][Leetcode middle] 12. 整数转罗马数字
java·linux·leetcode
多多*12 分钟前
Spring之Bean的初始化 Bean的生命周期 全站式解析
java·开发语言·前端·数据库·后端·spring·servlet
Johny_Zhao16 分钟前
Vmware workstation安装部署微软WSUS服务应用系统
网络·人工智能·网络安全·信息安全·云计算·系统运维·wsus
末央&23 分钟前
【Linux】进程的基本概念
linux·运维·服务器
悄悄地努力38 分钟前
IDEA 新建 SpringBoot 项目时,没有高版本 SpringBoot 可选
java·spring boot·intellij-idea
DjangoJason1 小时前
计算机网络 : Socket编程
linux·服务器·开发语言·笔记·计算机网络
眠りたいです1 小时前
从数据包到可靠性:UDP/TCP协议的工作原理分析
linux·网络·网络协议·tcp/ip·udp·传输层
救救孩子把1 小时前
Mac 环境下 JDK 版本切换全指南
java·开发语言·macos
路飞雪吖~1 小时前
【Linux】共享内存
java·linux·服务器
每次的天空2 小时前
Android第三次面试总结之网络篇补充
android·网络·面试