今天这篇文章介绍一下JWT令牌如何在微服务链路中保证信息不丢失?实战实现失官方称为令牌中继。
令牌中继通俗的讲则是让令牌在微服务链路调用中传递下去,保证各个微服务能够获取令牌中的令牌用户信息。
以下订单的信息例子来说,如下图:
下单流程
客户端携带令牌请求网关,不丢网关鉴权成功后会将令牌中的实战实现失用户信息解析出来放在请求头中下发给订单服务,同样的全链,亿华云订单服务需要将用户信息传递给账户服务获取该用户的令牌账户信息。
那么问题来了?信息如何保证网关服务->订单服务->账户服务这条链路中的用户信息传递下去是个痛点
令牌在openFeign调用过程中是不能自动中继的,因此必须手动的不丢将令牌信息传递下去。
注意:openFeign在开启熔断降级后内部调用开启了子线程,实战实现失因此传统的全链方案直接在RequestInterceptor中设置是不可行的云南idc服务商。
那么如何保证子线程也能获取请求头中的令牌用户信息呢?
答案是: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
源码目录如下图:
(责任编辑:数据库)