上下文信息
上下文中存放的是當前調用過程中所需的環境信息。首先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等信息。