在我們的微服務中, 用戶查詢本命信息, 過了網關再過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 了