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言語のフォーマットを使用することができます.namespace java com.wang.projectオプションパラメータや必須パラメータ、requiredやoptional、定数constの定義、ファイルincludeの導入など、言語の特性やキーワードは一つ一つ紹介されていません.
    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サービス層符号化
    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入門チュートリアル