要使用的時候首先應(yīng)該先編輯一個thrift文件,其中包括結(jié)構(gòu)體和服務(wù)的定義失乾。
結(jié)構(gòu)的定義
struct User{
1:required string userId
2:required i64 balance
3:optinal string name
}
如果變量有默認值常熙,可以直接寫在定義文件里:
struct User {
1: strubg uid
2: i64 balance = 0
3: map<i16,string> map
}
-
基本類型(括號內(nèi)為對應(yīng)的Java類型):
- bool(boolean): 布爾類型(TRUE or FALSE)
- byte(byte): 8位帶符號整數(shù)
- i16(short): 16位帶符號整數(shù)
- i32(int): 32位帶符號整數(shù)
- i64(long): 64位帶符號整數(shù)
- double(double): 64位浮點數(shù)
- string(String): 采用UTF-8編碼的字符串
-
除了上面提到的基本數(shù)據(jù)類型,Thrift還支持以下容器類型:
- list(java.util.ArrayList)
- set(java.util.HashSet)
- map(java.util.HashMap)
服務(wù)的定義
include "helloworld.thrift"
namespace java com.core
service Base{
string helloworld()
}
service Core{
string transfer(1:string fromId,2:string toId, 3:i64 amount)
int64 add(1:i64 number1,2:i64 number2)
}
在這個core.thrift文件里定義的Core這個service繼承了Base這個service碱茁,其中namespace決定了生成的java文件將會放在哪個包內(nèi)裸卫。
服務(wù)的實現(xiàn)
如果要單獨生成某個thrift文件的指定語言版本代碼,輸入以下命令
thrift --gen <language> <Thrift filename>
如果要遞歸地將其include的thrift文件也生成纽竣,則使用如下命令
thrift -r --gen <language> <Thrift filename>
對于上面所示的文件墓贿,使用的命令為 thrift --gen java core.thrift
則會生成一個文件名為Core的文件茧泪,此文件中有一個為Iface的接口,實現(xiàn)此接口必須實現(xiàn)thrift文件里定義的方法聋袋。其他內(nèi)容是為了thrift能正常調(diào)用的邏輯队伟,這個文件不能進行修改。
在實際使用中幽勒,新建一個類名為CoreImpl實現(xiàn)Core.Iface缰泡,在這里我們將實現(xiàn)transfer和add兩個方法的具體邏輯。這樣就已經(jīng)寫完了thrift調(diào)用服務(wù)的準備工作代嗤,下面涉及到如何啟動服務(wù)和調(diào)用服務(wù)棘钞。
服務(wù)的啟動
傳輸通信協(xié)議
Thrift 可以讓用戶選擇客戶端與服務(wù)端之間傳輸通信協(xié)議的類別,在傳輸協(xié)議上總體劃分為文本 (text) 和二進制 (binary) 傳輸協(xié)議干毅,為節(jié)約帶寬宜猜,提高傳輸效率,一般情況下使用二進制類型的傳輸協(xié)議為多數(shù)硝逢,有時還會使用基于文本類型的協(xié)議姨拥,這需要根據(jù)項目 / 產(chǎn)品中的實際需求。常用協(xié)議有以下幾種:
- TBinaryProtocol —— 二進制編碼格式進行數(shù)據(jù)傳輸
- TCompactProtocol —— 高效率的渠鸽、密集的二進制編碼格式進行數(shù)據(jù)傳輸
- TJSONProtocol —— 使用 JSON 的數(shù)據(jù)編碼協(xié)議進行數(shù)據(jù)傳輸
- TSimpleJSONProtocol —— 只提供 JSON 只寫的協(xié)議叫乌,適用于通過腳本語言解析
服務(wù)端和客戶端必須使用同一種傳輸通信協(xié)議
傳輸層
常用的傳輸層有以下幾種:
- TSocket —— 使用阻塞式 I/O 進行傳輸,是最常見的模式徽缚,使用TServerSocket
- TFramedTransport —— 使用非阻塞方式憨奸,按塊的大小進行傳輸,類似于 Java 中的 NIO凿试,使用TNonblockingServerTransport
- TNonblockingTransport —— 使用非阻塞方式排宰,用于構(gòu)建異步客戶端
服務(wù)端類型
常見的服務(wù)端類型有以下幾種:
- TSimpleServer —— 單線程服務(wù)器端使用標準的阻塞式 I/O
- TThreadPoolServer —— 多線程服務(wù)器端使用標準的阻塞式 I/O
- TNonblockingServer —— 多線程服務(wù)器端使用非阻塞式 I/O
Server與Client
下面是簡單的使用TBinaryProtocol通信和使用Tsocket以及服務(wù)端類型為TThreadPoolServer的情況:
Core的Server
public static void main(String[] args) {
try {
TServerSocket serverTransport = new TServerSocket(9999); //設(shè)置服務(wù)端口
Factory proFactory = new TBinaryProtocol.Factory(); //設(shè)置通信協(xié)議
TProcessor processor = new Core.Processor<Core.Iface>(CoreImpl); //關(guān)聯(lián)處理器服務(wù)
TThreadPoolServer.Args serverArgs = (new TThreadPoolServer.Args(serverTransport)).processor(processor);
serverArgs.protocolFactory(proFactory);//填充啟動參數(shù)
TServer server = new TThreadPoolServer(serverArgs);
server.serve();
} catch (TTransportException e) {
e.printStackTrace();
}
}
Core的Client
public static void main(String[] args) {
try {
TTransport transport = new TSocket("localhost", 9999);
transport.open();
TProtocol protocol = new TBinaryProtocol(transport);//設(shè)置傳輸協(xié)議
Core.Client client = new Core.Client(protocol);
client.transfer("1","2",1);
transport.close();
} catch (TTransportException e) {
e.printStackTrace();
} catch (TException e) {
e.printStackTrace();
}
}
非阻塞式異步
to be continue