如何在微服務中獲取的本命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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章