Thrift の概要
1. Thrift とは何ですか?
Thrift は初期に Facebook の内部チームによって開発されました。これは、リモート メソッド呼び出しの一種です。オープンソース化され、Apache に組み込まれ、Apache Thrift プロジェクトになりました。
thrift を使用すると、入力ファイルとして単純な定義ファイルでデータ型とサービス インターフェイスを定義でき、コンパイラーはシームレスなクロスプログラミング言語用の RPC クライアントとサーバーの通信を簡単に生成するコードを生成します。
2. RPC とは何ですか?
RPC (Remote Procedure Call Protocol)、リモート プロシージャ コール プロトコル。
簡単に言うと、RPC は、あるマシン (クライアント) からパラメータを渡して別のマシン (サーバー) 上の関数やメソッドを呼び出し、返された結果を取得することです。
RPC は基礎となる通信の詳細を隠します (ソケット通信や HTTP 通信を直接処理する必要はありません) RPC はリクエスト応答モデルです。
クライアントがリクエストを開始し、サーバーがレスポンスを返します (HTTP の動作と同様) は、ローカル関数 (またはメソッド) を呼び出すのと同じように、RPC を使用してリモート関数 (またはメソッド) を呼び出します。
Thriftスタック構造
Thriftデータ型
基本型:
bool: Javaのbooleanに対応するブール値、trueまたはfalse
byte: Javaのバイトに対応する8ビット符号付き整数
i16: 16 ビットの符号付き整数、Java の short に対応
i32: 32 ビットの符号付き整数、Java の int に対応
i64: 64 ビットの符号付き整数、Java の long に対応
double: 64 ビットの浮動小数点数、に対応Java の double
string: Java の String
構造型に対応する、不明なエンコードされたテキストまたはバイナリ文字列:
struct: C 言語の構造定義と同様に、パブリック オブジェクトを定義します。Java では、JavaBean
コンテナ型です。 :
list: Java の ArrayList に対応
set: Java の HashSet に対応
map: Java の HashMap に対応
Exception の種類 :
Exception: Java の Exception に対応
Service type :
service: に対応サービスクラス
thrift Java コードを生成する
http://thrift.apache.org/download
namespace java service.demo service Hello{ string helloString(1:string para) i32 helloInt(1:i32 para) bool helloBoolean(1:bool para) void helloVoid() string helloNull() }
Hello.java content
(1) 非同期クライアントクラス AsyncClient と asy同期インターフェイス AsyncIface
(2) 同期クライアント クラス Client と同期インターフェイス Iface。Client クラスは TServiceClient を継承し、Thrift ファイルで定義されたインターフェイス関数に基づいて生成され、Client クラスが使用されます。クライアント プログラムでは、Client クラスは Iface のクライアント スタブ実装です。Thrift サーバー プログラムはインターフェイス Iface を実装する必要があります。
(3) プロセッサ クラス。このクラスは主に Thrift サーバー プログラムを開発するときに使用されます。このクラスは内部でマップを定義し、関数呼び出しリクエストを受信すると、関数オブジェクトへのすべての関数名のマッピングを保存します。マップ内の関数名に従って関数のオブジェクトを取得し、それを実行します
(4) パラメーター クラス、各インターフェイス関数のパラメーター クラスを定義します。たとえば、インターフェイス helloInt: helloInt_args のパラメーター クラスを生成します。インターフェース関数のパラメータクラスの命名方法は次のとおりです: インターフェース関数名_args; (5) 各インターフェース関数は戻り値クラスを定義します。例: helloInt: helloInt_result に対して戻り値クラスが生成されます。インターフェイス関数の戻り値クラスの命名方法は次のとおりです。
パラメータクラスと戻り値クラスには、呼び出される関数名とパラメータのデータの読み取りと書き込みの操作が行われます。プロトコル クラスに従って、戻り値クラスでデータがプロトコルに従って読み取られます。
クライアント
Iface
HelloServiceImpl
呼び出しプロセス
Thriftの呼び出しプロセスでは、主にトランスポート層クラス、プロトコル層クラス、処理クラスの3つの主要なクラスがThriftクライアントとサーバー間で使用され、これら3つのクラスの連携によりrpc全体が完成します。呼び出し処理
(1) クライアントプログラムから呼び出された関数名とパラメータをプロトコル層(TProtocol)に渡します。プロトコル層は関数名とパラメータをプロトコル形式に従ってカプセル化し、カプセル化した結果を下位に渡します。トランスポート層。ここで注意してください: Thrift サーバー プログラムで使用されるプロトコル タイプは同じでなければなりません。そうしないと、Thrift サーバー プログラムはプロトコル層でデータを解析できなくなります。
(2) トランスポート層 (TTransport) は、たとえば、トランスポート層の実装クラス TframedTransport は、データを「データ長 + データの内容」というフレームにカプセル化し、処理されたデータをネットワーク経由で Thrift サーバーに送信することも重要です。ここで注意してください: Thrift サーバー プログラムと一致している必要があります。使用されるトランスポート層の実装クラスは一致していなければ、Thrift のトランスポート層はデータを逆処理できません。 (3) Thrift サーバーは、例えば、トランスポート層の実装クラスTframedTransportは、ネットワークデータを「データ長+データ内容」の形式に変換します。データ内容のみを抽出し、Thrift サーバーのプロトコル クラス (TProtocol) に渡します。
( 4) Thrift サーバーのプロトコル クラス (TProtocol) は、プロトコルに従ってトランスポート層で処理されたデータをカプセル化し、ハンドリングします。カプセル化解除されたデータを Processor クラスに渡して処理します
(6) Thrift サーバーは、渡されたパラメーターを使用して、見つかった関数オブジェクトを呼び出します。
(7) Thrift サーバーが関数オブジェクトを実行した結果を、プロトコル層に渡します。 Thrift サーバー側は、関数の実行結果をプロトコルでカプセル化します。
(9) Thrift サーバー側のトランスポート層は、プロトコル層のカプセル化の結果をフレームにカプセル化するなどして処理し、Thrift クライアントに送信します。プログラム;
(10) Thrift クライアント プログラムのトランスポート層は、受信したネットワーク結果を逆処理して実際のプロトコル データを取得します。
(11) Thrift クライアントのプロトコル層は、プロトコル形式に従ってデータをカプセル化し、取得します。特定の関数の実行結果を呼び出し関数
クライアント
に出力します。
プロトコルと送信方法
Thrift を使用すると、ユーザーはクライアントとサーバー間の送信通信プロトコルの種類を選択でき、帯域幅を節約して、一般にテキスト (テキスト) 送信プロトコルとバイナリ (バイナリ) 送信プロトコルに分かれます。伝送効率の向上のため、通常はバイナリ タイプの伝送プロトコルが使用されますが、場合によってはテキスト ベースのプロトコルも使用されます。これは、プロジェクト/製品の実際のニーズに基づく必要があります。一般的に使用されるプロトコルは次のとおりです: TBinaryProtocol: Thrift のデフォルトのプロトコルであり、データ送信にバイナリ エンコード形式を使用し、基本的に生データを直接送信します TCompactProtocol: 可変長量のジグザグ エンコードに基づく、圧縮された高密度データ送信プロトコル形式
TJSONProtocol: JSON (JavaScript Object Notation) データ エンコーディング プロトコルを使用したデータ送信TDebugProtocol: コーダーによるテストによく使用され、読みやすいテキスト形式で表示されます
一般的に使用されるトランスポート層には次のものがあります:
TSocket — — 使用送信のための I/O のブロックが最も一般的なモードです。 TFrameTransport — 非ブロッキング モードを使用し、Java の NIO と同様に、ブロック サイズによって送信します。 TOnblockingTransport — 非同期クライアントの構築に使用されます。
TServerSocket: なし。 -ブロッキングソケット、サーバー側で使用されます。 accecpt によって受信されるソケットタイプはすべて TSocket (つまり、ブロッキングソケット) です。以上がThrift フレームワークのクイック スタート方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。