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

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

相关推荐
apocelipes1 小时前
golang unique包和字符串内部化
java·python·性能优化·golang
Full Stack Developme2 小时前
java.text 包详解
java·开发语言·python
fruge2 小时前
Ubuntu服务器已下载Nginx安装包的安装指南
服务器·nginx·ubuntu
刘梦凡呀3 小时前
C#获取钉钉平台考勤记录
java·c#·钉钉
best_virtuoso3 小时前
PostgreSQL 常见数组操作函数语法、功能
java·数据结构·postgresql
yudiandian20143 小时前
02 Oracle JDK 下载及配置(解压缩版)
java·开发语言
孤独得猿3 小时前
聊天室项目开发——etcd的安装和使用
linux·服务器·c++·etcd
楚韵天工4 小时前
宠物服务平台(程序+文档)
java·网络·数据库·spring cloud·编辑器·intellij-idea·宠物
helloworddm4 小时前
Orleans Stream SubscriptionId 生成机制详解
java·系统架构·c#
失散134 小时前
分布式专题——43 ElasticSearch概述
java·分布式·elasticsearch·架构