实战!openFeign如何实现全链路JWT令牌信息不丢失?
大家好,我是不才陈某~
这是《Spring Cloud 进阶》第20篇文章,往期文章如下:
今天这篇文章介绍一下JWT令牌如何在微服务链路中保证信息不丢失?官方称为令牌中继。
什么是令牌中继?
令牌中继通俗的讲则是让令牌在微服务链路调用中传递下去,保证各个微服务能够获取令牌中的用户信息。
以下订单的例子来说,如下图:
客户端携带令牌请求网关,网关鉴权成功后会将令牌中的用户信息解析出来放在请求头中下发给订单服务,同样的,订单服务需要将用户信息传递给账户服务获取该用户的账户信息。
那么问题来了?如何保证网关服务->订单服务->账户服务这条链路中的用户信息传递下去是个痛点
解决方案
令牌在openFeign调用过程中是不能自动中继的,因此必须手动的将令牌信息传递下去。
注意:openFeign在开启熔断降级后内部调用开启了子线程,因此传统的方案直接在RequestInterceptor中设置是不可行的。
那么如何保证子线程也能获取请求头中的用户信息呢?
答案是:RequestContextHolder这个神器。
RequestContextHolder内部通过InheritableThreadLocal实现子线程共享信息。
在FeignCircuitBreakerInvocationHandler这个类中也是有如下一行代码:
RequestContextHolder.setRequestAttributes(requestAttributes);
正是使用RequestContextHolder将request的信息保存在其中,因此实现令牌中继只需要读取RequestContextHolder的信息即可。
详细代码如下:
* @author 公众号:码猿技术专栏 * 用于实现令牌信息中继 @Component public class FeignRequestInterceptor implements RequestInterceptor { @Override public void apply(RequestTemplate template) { //从RequestContextHolder中获取HttpServletRequest HttpServletRequest httpServletRequest = RequestContextUtils.getRequest(); //获取RequestContextHolder中的信息 Map<String, String> headers = getHeaders(httpServletRequest); //放入feign的RequestTemplate中 for (Map.Entry<String, String> entry : headers.entrySet()) { template.header(entry.getKey(), entry.getValue()); * 获取原请求头 private Map<String, String> getHeaders(HttpServletRequest request) { Map<String, String> map = new LinkedHashMap<>(); Enumeration<String> enumeration = request.getHeaderNames(); if (enumeration != null) { while (enumeration.hasMoreElements()) { String key = enumeration.nextElement(); String value = request.getHeader(key); map.put(key, value); return map;源码目录如下图:
“源码已经上传GitHub,关注公众号:码猿技术专栏,回复关键词:9529 获取!”
文章转自公众号:码猿技术专栏
-
Hi3861 NV操作—— 如何 保存数据到开发板,断电 不 丢失连志安 • 1.3w浏览 • 6回复
-
HarmonyOS 实战 | 贪吃蛇游戏 | JS 全 注释Anzia • 3.3w浏览 • 25回复
-
技术干货 | 应用性能提升 70%,探究 mPaaS 全 链 路 压测的 实现 原理mPaaS • 6001浏览 • 0回复
-
登录 令牌 JWT — JSON WEB TOKENjava厂长 • 2893浏览 • 0回复
-
OpenHarmony可以+区块 链 不 , 如何 能 实现 呢?小智物联 • 3325浏览 • 3回复
-
硬核 | Kafka 如何 解决消息 不 丢失 ?ltolll • 2907浏览 • 0回复
-
全 链 路 在线生产数据库压测利器:Apache ShardingSphere 影子库特iamwaiwai • 3261浏览 • 0回复
-
「SpringCloud」整合Skywalking 实现 链 路 追踪ponymar • 5857浏览 • 0回复
-
RocketMQ消息 丢失 如何 排查?hexiaox810 • 2074浏览 • 0回复
-
聊聊 Spring Cloud 全 链 路 灰度发布 方案~(一)love374 • 6146浏览 • 0回复
-
聊聊 Spring Cloud 全 链 路 灰度发布 方案~(二)love374 • 3395浏览 • 0回复
-
聊聊 Spring Cloud 全 链 路 灰度发布 方案~(三)love374 • 4397浏览 • 0回复
-
实战 !退出登录时 如何 借助外力使 JWT 令牌 失效?(一)love374 • 2539浏览 • 0回复
-
实战 !退出登录时 如何 借助外力使 JWT 令牌 失效?(二)love374 • 2503浏览 • 0回复
-
#夏日挑战赛# 【FFH】OpenHarmony与HarmonyOS 实现 信息 交流(一)龙眼Litchi • 7149浏览 • 7回复
-
lmc-autotest BSF 全 链 路 压测工具车江毅2022 • 1427浏览 • 0回复
-
如何 实现 OpenHarmony的OTA升级OpenHarmony开发者 • 3375浏览 • 6回复
-
OceanBase 4.0 解读: 全 链 路 追踪要解决什么问题?从一条慢SQL说起丶龙八夷 • 146浏览 • 0回复
-
深入理解 slab cache 内存分配 全 链 路 实现wg204wg • 210浏览 • 0回复
- 探索 Elasticsearch 8.X Terms Set 检索的应用与原理 2023-05-19 17:37:10发布
- 干货 | Elasticsearch 8.X 性能优化实战 2023-05-19 17:36:18发布