在我们的微服务中, 用户查询本命信息, 过了网关再过API服务,过了API 还有 service服务,经历重重劫难,突然发现用户本命id没有了,如何能在如此错中复杂的服务中保持自我,传递userid呢
首先, 我们要知道,请求是如何运作的。
- Client 用户用浏览器 调用请求,或者swagger调用,用户把认证信息放在了请求头, 突破网关,来到了第一个 AAPI服务。网关在处理时,增加header 存放 userid
请注意此时强大的RequestContextHolder 中,保存着线程内的request信息,
此时请调用 LoginContext.getUser 方法获取你的本命userId;
- AAPI服务经过一系列蹂躏之后,准确后数据库找数据了,此时就准备给 Aservice服务发起请求,feign 此时出来了,做了第二道请求的服务发起者,根据你指定的service-name 和 url、参数,发起http请求
但是此时,fegin并不知道你还有 userId 需要传递,当然你可以在接口上之地 @RequestHeader 添加 消息头 user,放入本命userid,
但是这些操作多了,这么错乱的服务都觉得恶心了,那该怎么办呢
Feign给我们提供了一个拦截器,统一处理restTemplate
在client 增加一个 configuration
在configuration的类中,增加一个如下代码
- 恭喜你,当你通过 feign调用 AService服务的时候,在Aservice中也可以通过 LoginContext.getUser 获取用户ID 了(前提是如果用户登录了,通过了网关之后)
经过了一系列的讲解, 你该怎么办呢
- 当你浏览器 被调用的服务 api ,需要获取用户id ,请添加 LoginContext.java (它在哪? 请到代码分支中去找吧,相信你总会找到!)
- 当你使用 FeignClient 去调用别的服务时候,同时你还希望你被调用的服务中也能优雅的获取到 userId, 请在你的FeignClient中增加 如上的 RequestInterceptor(当然,代码中有例子), 同时在你被调用的服务中增加 LoginContext.java,此时你将如此优雅的获取本命userid 了