1. 程式人生 > >Thrift入門初探(2)--thrift基礎知識詳解

Thrift入門初探(2)--thrift基礎知識詳解

  Thrift使用一種中間語言IDL,來進行介面的定義,下面來具體講一下IDL可定義的幾種常用資料型別和關鍵字.

常用資料型別及關鍵字

  基本型別

    thrift不支援無符號的型別,無符號型別可以簡單理解為不能表示負數,只能表示正數的型別,像java的基本資料型別都是有符號的型別.

  • byte:有符號位元組
  • i32:32位有符號整數,此外還有i16,i64
  • 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):

    service:對應服務的介面,內部可定義各種方法,相當於java中建立interface一樣,建立的service經過程式碼生成命令會生成客戶端,服務端的框架程式碼

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;

}

  容器型別

    集合中的元素可以是除了service之外的任意型別

   list<T>:有序列表,元素可重複

   set<T>:無需集合,元素不可重複

   map<K,V>:鍵值對集合

  列舉型別

  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封裝了一層傳輸層來支援底層的網路通訊,在Thrift中稱為Transport,不僅提供open,close,flush等方法,還有一些read/write方法.

  •   TSocket:阻塞式IO的Transport實現,用在客戶端.
  •   TServerSocket:非阻塞式Socket,用於伺服器端,用於監聽TSocket.
  •   TNonblockingSocket:非阻塞式IO的實現
  •   TMemoryInputTransport: 封裝了一個位元組陣列byte[]來做輸入流的封裝
  •   TFramedTransport- 同樣使用非阻塞方式,按塊的大小進行傳輸,輸入流封裝了TMemoryInputTransport  

Thrift支援的服務模型

  TSimpleServer:

    這種工作模式只有一個執行緒,迴圈監聽傳過來的請求並對其進行處理,處理完才能接受下一個請求,是一種阻塞式IO的實現,因為效率比較低,實際線上環境一般用不到.一般用於開發時候演示工作流程時使用.  

  TNonblockingServer:

這種模式與TsimpleServer最大的區別就是使用NIO,也就是非阻塞是IO的方式實現IO的多路複用,它可以同時監聽多個socket的變化,但因為業務處理上還是單執行緒模式,所以在一些業務處理比較複雜耗時的時候效率還是不高,因為多個請求任務依然需要排隊一個一個進行處理.

  TThreadPoolServer:

這種模式引入了執行緒池,主執行緒只負責accept,即監聽Socket,當有新的請求(客戶端Socket)來時,就會線上程池裡起一個執行緒來處理業務邏輯,這樣在併發量比較大的時候(但不超過執行緒池的數量)每個請求都能及時被處理,效率比較高,但一旦併發量很大的時候(超過執行緒池數量),後面來的請求也只能排隊等待.

  TThreadedSelectorServer:

    這是一種多執行緒半同步半非同步的服務模型,是Thrift提供的最複雜最高階的服務模型,內部有一個專門負責處理監聽Socket的執行緒,有多個專門處理業務中網路IO的執行緒,有一個專門負責決定將新Socket連線分配給哪一個執行緒處理的起負載均衡作用的執行緒,還有一個工作執行緒池.這種模型既可以響應大量併發連線的請求又可以快速對wangluoIO進行讀寫,能適配很多場景,因此是一種使用比較高頻的服務模型.

Thrift服務層編碼

try {
            System.out.println("服務端開啟....");
            //1.建立TProcessor
            TProcessor tprocessor = new Hello.Processor<Hello.Iface>(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是ServerTransport的阻塞式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入門初探(2)--thrift基礎知識

  Thrift使用一種中間語言IDL,來進行介面的定義,下面來具體講一下IDL可定義的幾種常用資料型別和關鍵字. 常用資料型別及關鍵字   基本型別     thrift不支援無符號的型別,無符號型別可以簡單理解為不能表示負數,只能表示正數的型別,像java的基本資料型別都是有符號的型別. byte:

SQL與NoSQL資料庫入門基礎知識

SQL與NoSQL資料庫入門基礎知識詳解 這幾年的大資料熱潮帶動了一激活了一大批hadoop學習愛好者。有自學hadoop的,有報名培訓班學習的。所有接觸過hadoop的人都知道,單獨搭建hadoop裡每個組建都需要執行環境、修改配置檔案測試等過程。對於我們這些入門級新手來說簡直每個都是坑。

Hibernate基礎知識

seq 每次 事務 name rep cfg 默認 poj 產生 一、Hibernate框架 Hibernate是一個開放源代碼的對象關系映射框架,它對 JDBC進行了非常輕量級的對象封裝,它將POJO類與數據庫表建立映射關系,是一個 全自動的ORM框架

JAVA 類和對象基礎知識

默認 抽象 實現 面向對象 nbsp 分組 sed fcc closed /*文章中用到的代碼只是一部分,需要源碼的可通過郵箱聯系我 [email protected]*/ 和C++一樣,JAVA也是一門面向對象的語言,其基礎和核心是類和對象。而面向對象的思想是來源與顯示生

HTTP服務相關基礎知識

gen 註冊表 關閉 return 我們 不同ip地址 跳轉 http請求 mime類型 1 HTTP服務 1.1 IP/PV/UV UV、PV=1:5關系 UV 每天訪問人數PV page view 頁面瀏覽量 通過nginx日誌統計UV PV 或通過代碼統計 ?

動態路由協議RIP,OSPF基礎知識,以及配置實驗驗證

多個 shadow star 下一跳 tle water 外交 協議 使用 動態路由:不需要手工寫路由,將各自的直連網段宣告出去,路由器之間就可以相互學習,如果路由表有變化則及時更新宣告給相鄰的路由器靜態路由 優點:精確轉發,由管理員手動控制 缺點:靈活性差動態路由特點

RabbitMQ基礎知識

bmc vhost 完成 rdquo 限流 接收消息 服務器 廣播 lazy 什麽是MQ? MQ全稱為Message Queue, 消息隊列(MQ)是一種應用程序對應用程序的通信方法。MQ是消費-生產者模型的一個典型的代表,一端往消息隊列中不斷寫入消息,而另

JSP基礎知識

一、JSP基礎語法     1、JSP簡介        JSP(Java Server Pages),其根本是一個簡化的Servlet設計,它實現了在Java中使用HTML標籤。JSP是一種動態網頁技術標準,也是JavaEE的標準。JSP和Servlet一樣,是在伺

[Linux][入門系列]CentOS 的基礎命令-磁碟基礎操作

[Linux][入門系列]CentOS 的基礎命令詳解-磁碟基礎操作 前言 繼上次我們安裝完CentOS之後,我們就要在CentOS進行一波操作了。OS,顧名思義,就是作業系統。既然是作業系統,那它就是可以進行一系列基礎操作的。作業系統的操作我們可以簡單的分為幾類: 1. 磁碟

Oracle 基礎知識

DDL : 資料庫模式定義語言,關鍵字:createDML : 資料操縱語言,關鍵字:Insert、delete、updateDCL : 資料庫控制語言 ,關鍵字:grant、removeDQL : 資料庫查詢語言,關鍵字:select結構化查詢語言 (Structured

Unity3D開發基礎知識

本文簡介 物體操作 例項化 網路相關 網路協議 TCP UDP 程式碼怎麼寫 本文簡介        本文旨在總結之前的部落格,因為之前的部落格比較零散,對於各個模組之間劃分不夠清晰,在此部落格進行總結歸納,並且附上最新遇到

Oracle 11g RAC 基礎知識

    Infiniband常被用來實現遠端記憶體直接訪問(RDMA remote direct memory access architecture)。這是一個高速互聯,常與高效能運算(HPC)環境聯絡在一起。RDMA可以在叢集的節點間使用並行、直接、記憶體到記憶體的傳輸,它需要專門的RDMA介面卡、交換

奧塔線上:基於token認證的基礎知識

一、    什麼是TokenToken原始的意思是“令牌”,是服務端生成的一個自定義字串,作為客戶端進行資料請求的一個標識。在區塊鏈興起後,Token被賦予“代幣”或“通證”的含義,意思是一種可流通的加密數字權益證明。二、    Token的起源早在計算機網路剛興起時,Tok

Stored Procedure儲存過程基礎知識

儲存過程是做專案的必備技術,只要你面試找工作,資料庫及儲存過程也是必考的,下面一起來了解儲存過程的簡單基本技術知識:一、儲存過程基本概念?儲存過程就是作為可執行物件存放在資料庫中的一個或多個SQL命令。通俗來講:儲存過程其實就是能完成一定操作的一組SQL語句,它是由一些T-

路由器基礎知識

第一章  網路互聯           網路的根本目的非常簡單:方便人們交換所獲得的資訊。但是網路的應用需求非常複雜:有的使用者希望高頻寬,但並不要求很長的傳輸距離;有的使用者要求很長的距離,但對頻寬要求很低;有的對網路的可靠性要求較高,而另外一些則要求較低,等等。這些都導

Thrift入門初探--thrift安裝及java入門例項

  公司的一些平臺服務框架底層封裝了thrift提供服務,最近專案不是很緊,於是研究了一下,剛剛入門,理解得不深,寫這篇博文來整理一下思路. 什麼是thrift?   簡單來說,是Facebook公佈的一款開源跨語言的RPC框架.   那麼問題來了.   什麼是RPC框架?

dlmalloc 2.8.6 原始碼—[0]基礎知識

前述 Dlmalloc是一個著名的記憶體分配器,最早由Doug Lea在1980s年代編寫.由於早期C庫的內建分配器在某種程度上的缺陷,因此dlmalloc出現後立即獲得了廣泛應用,足見其出色的表現.儘管時至今日, dlmalloc中的技術在一些地方已

初探LINUX之--基礎知識

解釋 post why 不能 mman shells 運用 車間 ech 一 Linux哲學思想 1 一切都是一個文件(包含硬件) 2 小型,單一用途的程序 3 鏈接程序,共同完成復雜的任務 4 避免令人困惑的用戶界面 5 配置數據存儲在文本中 二 Linux重要概念

《solidity學習筆記》chapter 2-solidity基礎知識

solidity映射映射本質上是存儲和查找數據所用的鍵-值對。mapping (uint => string) intToStr;地址以太坊區塊鏈由 account (賬戶)組成,你可以把它想象成銀行賬戶。一個帳戶的余額是 以太 (在以太坊區塊鏈上使用的幣種),你可以和其他帳戶之間支付和接受以太幣,

Zookeeper之入門(原理、基礎知識

otto 執行 width delete 2.3 命名 類型 keep gin Zookeeper介紹 Zookeeper是分布式應用程序的協調服務框架,是Hadoop的重要組件。ZK要解決的問題: 1.分布式環境下的數據一致性。 2.分布式環境下的統一命名服務 3.分布式