Dubbo上下文信息傳遞、隱式參數傳遞總結


上下文信息

上下文中存放的是當前調用過程中所需的環境信息。首先RpcContext是線程級的,每個線程一份。
RpcContext 是一個 ThreadLocal 的臨時狀態記錄器,當接收到 RPC 請求,或發起 RPC 請求時,RpcContext 的狀態都會變化。比如:A 調 B,B 再調 C,則 B 機器上,在 B 調 C 之前,RpcContext 記錄的是 A 調 B 的信息,在 B 調 C 之后,RpcContext 記錄的是 B 調 C 的信息。

服務消費方

 1 // 遠程調用
 2 xxxService.xxx();  3 // 本端是否為消費端,這里會返回true
 4 boolean isConsumerSide = RpcContext.getContext().isConsumerSide();  5 // 獲取最后一次調用的提供方IP地址
 6 String serverIP = RpcContext.getContext().getRemoteHost();  7 // 獲取當前服務配置信息,所有配置信息都將轉換為URL的參數
 8 String application = RpcContext.getContext().getUrl().getParameter("application");  9 // 注意:每發起RPC調用,上下文狀態會變化
10 yyyService.yyy();

服務提供方

 1 public class XxxServiceImpl implements XxxService {  2 
 3     public void xxx() {  4         // 本端是否為提供端,這里會返回true
 5         boolean isProviderSide = RpcContext.getContext().isProviderSide();  6         // 獲取調用方IP地址
 7         String clientIP = RpcContext.getContext().getRemoteHost();  8         // 獲取當前服務配置信息,所有配置信息都將轉換為URL的參數
 9         String application = RpcContext.getContext().getUrl().getParameter("application"); 10         // 注意:每發起RPC調用,上下文狀態會變化
11  yyyService.yyy(); 12         // 此時本端變成消費端,這里會返回false
13         boolean isProviderSide = RpcContext.getContext().isProviderSide(); 14  } 15 }

隱式參數傳遞

可以通過 RpcContext 上的 setAttachment 和 getAttachment 在服務消費方和提供方之間進行參數的隱式傳遞。

在服務消費方端設置隱式參數

setAttachment 設置的 KV 對,在完成下面一次遠程調用會被清空,即多次遠程調用要多次設置。

RpcContext.getContext().setAttachment("index", "1"); // 隱式傳參,后面的遠程調用都會隱式將這些參數發送到服務器端,類似cookie,用於框架集成,不建議常規業務使用
xxxService.xxx(); // 遠程調用 // ...

在服務提供方端獲取隱式參數

public class XxxServiceImpl implements XxxService { public void xxx() { // 獲取客戶端隱式傳入的參數,用於框架集成,不建議常規業務使用
        String index = RpcContext.getContext().getAttachment("index"); } }

 總結:可以通過dubbo上下游調用獲取上下文參數信息,一般可以結合過濾器等一起使用,傳遞用戶id、租戶id、cookie等信息。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM