实战!openFeign怎么样完成全链路JWT令牌信息不遗失?

发布日期:2022-08-07 08:19    点击次数:93

​​

来日诰日这篇文章介绍一下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;     } } 

源码目录以下图:

​​



栏目分类



Powered by 手机欧冠体育游戏客户端首页 @2013-2022 RSS地图 HTML地图