目录

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

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

本文是转载文章,点击查看原文
如有侵权,请联系 xyy@jishuzhan.net 删除
相关推荐
Tracy-222 小时前
啥是Spring,有什么用,既然收费,如何免费创建SpringBoot项目,依赖下载不下来的解决方法,解决99%问题!
java·spring
未定义.2212 小时前
Java设计模式实战:策略模式在SimUDuck问题中的应用
java·设计模式·策略模式
码熔burning4 小时前
【NIO番外篇】之组件 Channel
java·nio·channel
rainFFrain4 小时前
网络基础2
服务器·网络
小南家的青蛙5 小时前
Linux的网络配置的资料
linux·运维·网络
卡尔曼的BD SLAMer5 小时前
问题 | 针对SSM(Spring + Spring MVC + MyBatis)框架的去Spring MVC强化版学习路线
java·spring·mvc·mybatis
春生野草5 小时前
0413-多态、Object类方法、访问权限修饰符、装箱拆箱、128陷阱
java·开发语言
烁3475 小时前
每日一题(小白)暴力娱乐篇25
java·数据结构·算法·娱乐
烁3475 小时前
每日一题(小白)暴力娱乐篇26
java·开发语言·算法·娱乐
兴达易控6 小时前
Profibus DP主站转ModbusTCP网关通讯秘籍
网络