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.分布式