Thrift

要使用的時候首先應(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
}
  1. 基本類型(括號內(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編碼的字符串
  2. 除了上面提到的基本數(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市那婉,隨后出現(xiàn)的幾起案子板甘,更是在濱河造成了極大的恐慌,老刑警劉巖详炬,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件盐类,死亡現(xiàn)場離奇詭異,居然都是意外死亡呛谜,警方通過查閱死者的電腦和手機在跳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來呻率,“玉大人硬毕,你說我怎么就攤上這事±裾蹋” “怎么了吐咳?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵逻悠,是天一觀的道長。 經(jīng)常有香客問我韭脊,道長童谒,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任沪羔,我火速辦了婚禮饥伊,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蔫饰。我一直安慰自己琅豆,他們只是感情好,可當我...
    茶點故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布篓吁。 她就那樣靜靜地躺著茫因,像睡著了一般。 火紅的嫁衣襯著肌膚如雪杖剪。 梳的紋絲不亂的頭發(fā)上冻押,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天,我揣著相機與錄音盛嘿,去河邊找鬼洛巢。 笑死,一個胖子當著我的面吹牛次兆,可吹牛的內(nèi)容都是我干的稿茉。 我是一名探鬼主播,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼类垦,長吁一口氣:“原來是場噩夢啊……” “哼狈邑!你這毒婦竟也來了城须?” 一聲冷哼從身側(cè)響起蚤认,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎糕伐,沒想到半個月后砰琢,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡良瞧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年陪汽,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片褥蚯。...
    茶點故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡挚冤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出赞庶,到底是詐尸還是另有隱情训挡,我是刑警寧澤澳骤,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站澜薄,受9級特大地震影響为肮,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜肤京,卻給世界環(huán)境...
    茶點故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一颊艳、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧忘分,春花似錦棋枕、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至舟山,卻和暖如春绸狐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背累盗。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工寒矿, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人若债。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓符相,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蠢琳。 傳聞我的和親對象是個殘疾皇子啊终,可洞房花燭夜當晚...
    茶點故事閱讀 44,884評論 2 354

推薦閱讀更多精彩內(nèi)容