請求上下文包括一次調用相關的屬性,例如調用的地址,調用方的應用程式名稱,逾時時間等屬性和使用者在介面定義的參數之外傳遞自訂的資料。
設定和擷取本次調用上下文
com.taobao.hsf.util.RequestCtxUtil提供設定和擷取調用內容相關的靜態方法,基於ThreadLocal工作, getxxx操作會將xxx屬性從當前ThreadLocal變數中remove,僅作用於當前線程的單次調用。
具體屬性的設定和擷取如下:
- 用戶端
方法 說明 setRequestTimeout() 設定單次調用的逾時時間。 setUserId() 設定本次調用的單元化服務的User ID(泛化調用中需要通過此方法配置)。 getProviderIp() 擷取最近一次調用的服務端的IP。 setTargetServerIp(String ip) 設定當前線程下一次調用的目標伺服器IP(此IP必須包含在記憶體已提供服務的地址清單裡)。 setDirectTargetServerIp(String targetIp) 設定當前線程下一次調用的目標伺服器IP(繞過註冊中心,忽略記憶體裡的地址清單)。 - 服務端
方法 說明 getClientIp() 服務端擷取調用方IP。 getAppNameOfClient() 服務端擷取調用方的應用程式名稱。 isHttpRequest() 是否是HTTP調用。 getHttpHeader(String key) 擷取HTTP請求的Header屬性。
傳遞自訂請求上下文
RpcContext 提供一種不修改介面,向服務端額外傳遞資料的方式。參數可以是自訂的DO或者基本類型。要保證對端也有該對應的類型,並且可以能夠被序列化。
- 用戶端發起調用前,設定上下文。
//setup context before rpc call RPCContext rpcContext = RPCContext.getClientContext(); rpcContext.putAttachment("tetantId", "123"); //rpc call,context 也會傳到遠端 orderService.queryOrder(1L);
- 服務端業務方法內,擷取上下文。
//get context data RPCContext rpcContext = RPCContext.getServerContext(); String myContext = (String)rpcContext.getAttachment("tetantId");