如何在微服务中获取的本命userId

在我们的微服务中, 用户查询本命信息, 过了网关再过API服务,过了API 还有 service服务,经历重重劫难,突然发现用户本命id没有了,如何能在如此错中复杂的服务中保持自我,传递userid呢

首先, 我们要知道,请求是如何运作的。

  1. Client 用户用浏览器 调用请求,或者swagger调用,用户把认证信息放在了请求头, 突破网关,来到了第一个 AAPI服务。网关在处理时,增加header 存放 userid

请注意此时强大的RequestContextHolder 中,保存着线程内的request信息,
在这里插入图片描述

此时请调用 LoginContext.getUser 方法获取你的本命userId;

  1. AAPI服务经过一系列蹂躏之后,准确后数据库找数据了,此时就准备给 Aservice服务发起请求,feign 此时出来了,做了第二道请求的服务发起者,根据你指定的service-name 和 url、参数,发起http请求
    但是此时,fegin并不知道你还有 userId 需要传递,当然你可以在接口上之地 @RequestHeader 添加 消息头 user,放入本命userid,
    但是这些操作多了,这么错乱的服务都觉得恶心了,那该怎么办呢
    Feign给我们提供了一个拦截器,统一处理restTemplate

在client 增加一个 configuration
在这里插入图片描述

在configuration的类中,增加一个如下代码

在这里插入图片描述

  1. 恭喜你,当你通过 feign调用 AService服务的时候,在Aservice中也可以通过 LoginContext.getUser 获取用户ID 了(前提是如果用户登录了,通过了网关之后)

经过了一系列的讲解, 你该怎么办呢

  1. 当你浏览器 被调用的服务 api ,需要获取用户id ,请添加 LoginContext.java (它在哪? 请到代码分支中去找吧,相信你总会找到!)
  2. 当你使用 FeignClient 去调用别的服务时候,同时你还希望你被调用的服务中也能优雅的获取到 userId, 请在你的FeignClient中增加 如上的 RequestInterceptor(当然,代码中有例子), 同时在你被调用的服务中增加 LoginContext.java,此时你将如此优雅的获取本命userid 了
发布了17 篇原创文章 · 获赞 9 · 访问量 8991
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章