呼び出しコンテキストは、インターフェイス固有のパラメーター以外の呼び出しプロパティおよびカスタムデータを伝送します。呼び出しプロパティには、呼び出し元の IP アドレス、アプリケーション名、タイムアウト期間が含まれます。また、サービスインターフェイスを変更することなく、コンシューマーとプロバイダー間でカスタムのキーと値のペアを伝送できます。
HSF では、呼び出しコンテキストを操作するための以下の 2 つのクラスが提供されています。
| クラス | 用途 |
|---|---|
com.taobao.hsf.util.RequestCtxUtil | タイムアウト、IP ルーティング、呼び出し元情報などの組み込み呼び出しプロパティの取得および設定 |
RPCContext | コンシューマーとプロバイダー間でカスタムのキーと値のペアを伝送 |
RequestCtxUtil の動作仕組み
RequestCtxUtil は、呼び出しプロパティを ThreadLocal 変数に格納します。各プロパティは現在のスレッドにバインドされ、単一の RPC 呼び出しが完了後にクリアされます。
getXxx メソッドを呼び出すたびに、対応するプロパティが ThreadLocal から削除されます。
コンシューマー側のメソッド
RPC 呼び出しの前後で、コンシューマー側でこれらのメソッドを呼び出します。
| メソッド | 説明 |
|---|---|
setRequestTimeout() | 次回の呼び出しに対するタイムアウトを設定します。 |
setUserId() | ユニットサービスルーティング用のユーザー ID を設定します。汎用呼び出しでは必須です。 |
getProviderIp() | 直前の呼び出しを処理したプロバイダーの IP アドレスを取得します。 |
setTargetServerIp(String ip) | 次回の呼び出しを特定のプロバイダーにルーティングします。指定する IP アドレスは、レジストリから取得したインメモリのプロバイダーリストに存在している必要があります。 |
setDirectTargetServerIp(String targetIp) | 次回の呼び出しを特定のプロバイダーに直接ルーティングし、レジストリをバイパスします。指定する IP アドレスは、インメモリのプロバイダーリストに存在していなくても構いません。 |
プロバイダー側のメソッド
着信リクエストを検査するために、プロバイダー側でこれらのメソッドを呼び出します。
| メソッド | 説明 |
|---|---|
getClientIp() | 呼び出し元の IP アドレスを取得します。 |
getAppNameOfClient() | 呼び出し元のアプリケーション名を取得します。 |
isHttpRequest() | 呼び出しが HTTP 経由で到着したかどうかを確認します。 |
getHttpHeader(String key) | 特定の HTTP リクエストヘッダーの値を取得します。 |
RPCContext を使用したカスタムデータの伝送
RPCContext を使用すると、サービスインターフェイスを変更せずに任意のキーと値のペアを RPC 呼び出しにアタッチできます。
値には、カスタムドメインオブジェクト(DO)型または基本型を指定できます。コンシューマーおよびプロバイダーの両方で、その型のシリアル化が可能である必要があります。
添付データの設定(コンシューマー側)
RPC 呼び出しの前に添付データを設定します。コンテキストはリクエストとともに自動的に伝送されます。
// RPC 呼び出しの前にカスタムコンテキストを設定
RPCContext rpcContext = RPCContext.getClientContext();
rpcContext.putAttachment("tetantId", "123");
// RPC 呼び出しを実行。コンテキストはリクエストとともに送信されます。
orderService.queryOrder(1L);添付データの読み取り(プロバイダー側)
プロバイダーのメソッド実装内で添付データを読み取ります。
// 着信リクエストからカスタムコンテキストを読み取り
RPCContext rpcContext = RPCContext.getServerContext();
String myContext = (String) rpcContext.getAttachment("tetantId");ThreadLocal のライフサイクル
RequestCtxUtil は、呼び出しプロパティを ThreadLocal 変数に格納します。コンテキストデータは、現在のスレッドにおける単一の呼び出しに限定され、呼び出しが完了後にクリアされます。