Thrift入門初探(2)--thrift基礎知識詳細
8137 ワード
昨日はthriftのインストールと入門例をまとめ、Thrift入門初探--thriftインストールとjava入門例をまとめ、今日からthriftに関する基礎知識をまとめました.
Thriftは中間言語IDLを用いてインタフェースの定義を行うが、以下ではIDLが定義可能ないくつかの共通データ型とキーワードについて具体的に述べる.
共通データ型とキーワード
基本タイプ
thriftは符号のないタイプをサポートする、符号のないタイプは負の数を表すことができず、正の数しか表すことができず、javaのような基本データ型はすべて符号のあるタイプであると簡単に理解できる. byte:符号付きバイト i 32:32ビット符号付き整数、その他i 16,i 64 double:64ビット浮動小数点数 string:バイナリ文字列 boolブール値trueまたはfalse 構造体タイプ(struct):
c言語の構造体定義と同様にjavaではjavabeanクラスに変換されます
struct User { 1: i32 id; 2: string name; 3: double salary; 4: bool hasCar;}
サービスタイプ(service):
サービス:サービスに対応するインタフェースで、内部では様々な方法を定義することができ、javaでinterfaceを作成するのと同じように、作成したサービスはコード生成コマンドを経てクライアントを生成し、サービス側のフレームワークコード
service Hello{ string helloString(1:string s); i32 helloInt(1:i32 i); bool helloBoolean(1:bool b); void helloVoid(); string helloNull();}
例外タイプ(Exception):
exception RequestException {
1:i32 code;
2:string detail;
}
コンテナタイプ
コレクション内の要素はサービス以外の任意のタイプであってもよい
List:整列リスト、要素を繰り返す
set:集合を必要とせず、要素を繰り返すことはできません
map:キー値対集合
列挙タイプ
enum Color{
RED,
BLUE
}
ネーミングスペース(namespace)
Javaのpacketと理解できます.コードの衝突を避けるために使用されます.各言語には独自のネーミングスペースに属する方法があります.java言語など、java言語のフォーマットを使用することができます.
Thriftがサポートするトランスポートプロトコル
Thriftは多種の伝送プロトコルをサポートして、私達は自分の必要に応じて適当なタイプを選択することができて、全体的に言えば、テキスト伝送とバイナリ伝送に分けて、バイナリ伝送は伝送速度と帯域幅を節約する上で優位があるため、大部分の情況の下でバイナリ伝送を使うのは比較的に良い選択です. TbinaryProtocol:バイナリ符号化フォーマットで伝送され、thriftのデフォルト伝送プロトコル である. TCompactProtocol: を圧縮形式で転送 TJSOnProtocol:JSON形式で を転送 TDebugProtocol–debug を容易にするために、わかりやすいテキスト形式で転送されます. TSimpleJSOnProtocol–スクリプト言語による の解析に適したJSON書き込み専用プロトコルを提供
Thriftがサポートする伝送モード
Thriftは1層の伝送層をカプセル化して下層のネットワーク通信をサポートし、ThriftではTransportと呼ばれ、open、close、flushなどの方法だけでなく、read/write方法もある. TSocket:ブロックIOのTransport実装、クライアント用 TServerSocket:サーバ側、TSocket. を傍受する非ブロックSocket TnonblockingSocket:非ブロックIOの実装 TMemoryInputTransport:入力ストリームとしてバイト配列byte[]をカプセル化するパッケージ TFramedTransport-同様に非ブロック方式を用いてブロックサイズで伝送され、入力ストリームはTMemoryInputTransport をカプセル化する.
Thriftがサポートするサービスモデル
TSimpleServer:
このような動作モードは1つのスレッドのみで、受信要求を循環的に傍受して処理する、処理が完了してから次の要求を受け入れることができるブロック式IOの実現である、効率が比較的低いため、実際のオンライン環境では一般的に使用できない.開発時にワークフローを示す際に使用するのが一般的である.
TNonblockingServer:
このモードとTsimpleServerの最大の違いは、NIO、すなわち非ブロックIO方式を用いてIOの多重化を実現することであり、複数のsocketの変化を同時に傍受することができるが、業務処理上は単一スレッドモードであるため、一部の業務処理が複雑で時間がかかる場合でも効率は高くない.複数のリクエストタスクは依然として1つずつ並んで処理する必要があるためである.
TThreadPoolServer:
このモードはスレッドプールを導入し,プライマリスレッドはaccept,すなわちSocketの傍受のみを担当し,新しいリクエスト(クライアントSocket)が来ると,トラフィックロジックを処理するためにオンラインスレッドプールにスレッドを作成し,コンカレント量が大きい場合(スレッドプールの数を超えない)各リクエストがタイムリーに処理され,効率が高いが,コンカレント量が大きい場合には(スレッドプール数を超える)、後からのリクエストも並んで待つしかない.
TThreadedSelectorServer:
これはマルチスレッド半同期半非同期のサービスモデルであり、Thriftが提供する最も複雑で最高級のサービスモデルであり、内部にはSocketの傍受を専門とするスレッドがあり、業務中のネットワークIOを専門に処理するスレッドが複数あり、新しいSocket接続をどのスレッド処理に割り当てるかを決定する負荷等化の役割を果たすスレッドがあり、もう一つの仕事がある.スレッドプール.このモデルは大量の同時接続の要求に応答することができ、wangluoIOを迅速に読み書きすることができ、多くのシーンに適応できるため、比較的高周波のサービスモデルである.
Thriftサービス層符号化
0.サービス処理インタフェースimplを実現する、インタフェース方法を書き換える.
1.TProcessorの作成
Processorは、入力データストリームからデータを読み取る、データストリームにデータを書き込む操作をカプセル化する、サービスに関するProcessorは、コンパイラがIDLファイルをコンパイルすることによって生成され、その主な仕事は、接続からデータを読み出し、ユーザーに処理を渡すimplを実現し、最後に接続に結果を書くことである.
2.serverTransportの作成
TServerSocketはServer Transportのブロック式IOの実現である.ポートを傍受する役割を果たし,acceptからのSocketタイプはクライアントのTSocketタイプ(ブロック式Socket)である.
3.TProtocolの作成
TProtocolは、どのようなデータを伝送するか、どのように伝送するデータを解析するかを含む基本的なプロトコル情報を定義する.
4.serverの作成
必要に応じて異なるサービスモードを選択し、コードではプレゼンテーションのために最も簡単なTSimpleServerを使用しています.
5.サービスの開始
Thriftクライアントエンコーディング
関連ブログ
Thrift入門初探--thriftインストールおよびjava入門例
参考資料
Thriftソース分析(六)--Transport伝送層分析
スリフトとの美しい出会い
thrift入門チュートリアル
Thriftは中間言語IDLを用いてインタフェースの定義を行うが、以下ではIDLが定義可能ないくつかの共通データ型とキーワードについて具体的に述べる.
共通データ型とキーワード
基本タイプ
thriftは符号のないタイプをサポートする、符号のないタイプは負の数を表すことができず、正の数しか表すことができず、javaのような基本データ型はすべて符号のあるタイプであると簡単に理解できる.
c言語の構造体定義と同様にjavaではjavabeanクラスに変換されます
struct User { 1: i32 id; 2: string name; 3: double salary; 4: bool hasCar;}
サービスタイプ(service):
サービス:サービスに対応するインタフェースで、内部では様々な方法を定義することができ、javaでinterfaceを作成するのと同じように、作成したサービスはコード生成コマンドを経てクライアントを生成し、サービス側のフレームワークコード
service Hello{ string helloString(1:string s); i32 helloInt(1:i32 i); bool helloBoolean(1:bool b); void helloVoid(); string helloNull();}
例外タイプ(Exception):
exception RequestException {
1:i32 code;
2:string detail;
}
コンテナタイプ
コレクション内の要素はサービス以外の任意のタイプであってもよい
List:整列リスト、要素を繰り返す
set:集合を必要とせず、要素を繰り返すことはできません
map:キー値対集合
列挙タイプ
enum Color{
RED,
BLUE
}
ネーミングスペース(namespace)
Javaのpacketと理解できます.コードの衝突を避けるために使用されます.各言語には独自のネーミングスペースに属する方法があります.java言語など、java言語のフォーマットを使用することができます.
namespace
java com.wang.project
オプションパラメータや必須パラメータ、requiredやoptional、定数constの定義、ファイルincludeの導入など、言語の特性やキーワードは一つ一つ紹介されていません.Thriftがサポートするトランスポートプロトコル
Thriftは多種の伝送プロトコルをサポートして、私達は自分の必要に応じて適当なタイプを選択することができて、全体的に言えば、テキスト伝送とバイナリ伝送に分けて、バイナリ伝送は伝送速度と帯域幅を節約する上で優位があるため、大部分の情況の下でバイナリ伝送を使うのは比較的に良い選択です.
Thriftがサポートする伝送モード
Thriftは1層の伝送層をカプセル化して下層のネットワーク通信をサポートし、ThriftではTransportと呼ばれ、open、close、flushなどの方法だけでなく、read/write方法もある.
Thriftがサポートするサービスモデル
TSimpleServer:
このような動作モードは1つのスレッドのみで、受信要求を循環的に傍受して処理する、処理が完了してから次の要求を受け入れることができるブロック式IOの実現である、効率が比較的低いため、実際のオンライン環境では一般的に使用できない.開発時にワークフローを示す際に使用するのが一般的である.
TNonblockingServer:
このモードとTsimpleServerの最大の違いは、NIO、すなわち非ブロックIO方式を用いてIOの多重化を実現することであり、複数のsocketの変化を同時に傍受することができるが、業務処理上は単一スレッドモードであるため、一部の業務処理が複雑で時間がかかる場合でも効率は高くない.複数のリクエストタスクは依然として1つずつ並んで処理する必要があるためである.
TThreadPoolServer:
このモードはスレッドプールを導入し,プライマリスレッドはaccept,すなわちSocketの傍受のみを担当し,新しいリクエスト(クライアントSocket)が来ると,トラフィックロジックを処理するためにオンラインスレッドプールにスレッドを作成し,コンカレント量が大きい場合(スレッドプールの数を超えない)各リクエストがタイムリーに処理され,効率が高いが,コンカレント量が大きい場合には(スレッドプール数を超える)、後からのリクエストも並んで待つしかない.
TThreadedSelectorServer:
これはマルチスレッド半同期半非同期のサービスモデルであり、Thriftが提供する最も複雑で最高級のサービスモデルであり、内部にはSocketの傍受を専門とするスレッドがあり、業務中のネットワークIOを専門に処理するスレッドが複数あり、新しいSocket接続をどのスレッド処理に割り当てるかを決定する負荷等化の役割を果たすスレッドがあり、もう一つの仕事がある.スレッドプール.このモデルは大量の同時接続の要求に応答することができ、wangluoIOを迅速に読み書きすることができ、多くのシーンに適応できるため、比較的高周波のサービスモデルである.
Thriftサービス層符号化
try {
System.out.println(" ....");
//1. TProcessor
TProcessor tprocessor = new Hello.Processor(new HelloServiceImpl());
// 2. TserverTransport
TServerSocket serverTransport = new TServerSocket(9898);
//3. TProtocol
TBinaryProtocol.Factory factory = new TBinaryProtocol.Factory();
TServer.Args tArgs = new TServer.Args(serverTransport);
tArgs.processor(tprocessor);
tArgs.protocolFactory(factory);
//4. Tserver, ,server
TServer server = new TSimpleServer(tArgs);
//5. server
server.serve();
}catch (TTransportException e) {
e.printStackTrace();
}
コードに基づいて、サービス側符号化の基本フローが表示されます.0.サービス処理インタフェースimplを実現する、インタフェース方法を書き換える.
1.TProcessorの作成
Processorは、入力データストリームからデータを読み取る、データストリームにデータを書き込む操作をカプセル化する、サービスに関するProcessorは、コンパイラがIDLファイルをコンパイルすることによって生成され、その主な仕事は、接続からデータを読み出し、ユーザーに処理を渡すimplを実現し、最後に接続に結果を書くことである.
2.serverTransportの作成
TServerSocketはServer Transportのブロック式IOの実現である.ポートを傍受する役割を果たし,acceptからのSocketタイプはクライアントのTSocketタイプ(ブロック式Socket)である.
3.TProtocolの作成
TProtocolは、どのようなデータを伝送するか、どのように伝送するデータを解析するかを含む基本的なプロトコル情報を定義する.
4.serverの作成
必要に応じて異なるサービスモードを選択し、コードではプレゼンテーションのために最も簡単なTSimpleServerを使用しています.
5.サービスの開始
Thriftクライアントエンコーディング
System.out.println(" ....");
TTransport transport = null;
try {
//1. TTransport
transport = new TSocket("localhost", 9898, 30000);
// 2. TProtocol
TProtocol protocol = new TBinaryProtocol(transport);
//3. Client transport
Hello.Client client = new Hello.Client(protocol);
transport.open();
//4. Client
String result = client.helloString(" ");
System.out.println("Thrify client result =: " + result);
} catch (TTransportException e) {
e.printStackTrace();
} catch (TException e) {
e.printStackTrace();
} finally {
if (null != transport) {
transport.close();
}
}
初心者は入門して、自分の理解とネットユーザーたちの文章を拝読してまとめたのはどうしても不当なところがあって、軽く噴き出します.関連ブログ
Thrift入門初探--thriftインストールおよびjava入門例
参考資料
Thriftソース分析(六)--Transport伝送層分析
スリフトとの美しい出会い
thrift入門チュートリアル