Thrift(一):快速入門

什么是 Thrift润脸?

  • Thrift 是 Facebook 開源的一款跨語言 RPC 框架,它通過 IDL(接口描述語言) 來定義 RPC 數(shù)據(jù)類型和接口成福,這些內(nèi)容被寫在以 .thrift 結(jié)尾的文件中敌蚜,然后通過編譯器來生成不同語言的代碼,以滿足跨語言的需要

Thrift 安裝

Mac系統(tǒng)

  1. 使用 brew 快速安裝
brew install thrift

Window 系統(tǒng)

  1. 下載 Thrift.exe:http://www.apache.org/dyn/closer.cgi?path=/thrift/0.11.0/thrift-0.11.0.exe
  2. 將下載的 exe 程序重命名為 thrift.exe摆碉,并放入一個文件夾(我這放入 D 盤 Thrift 文件夾下)
  3. 配置環(huán)境變量 Path,在最后加上 D:\Thrift;
  4. 執(zhí)行命令查看是否安裝成功
thrift -version

如何使用 IDL 描述接口

  • 在使用 Thrift 之前脓豪,需要提供一個 .thrift 文件巷帝,其內(nèi)容是使用 IDL 描述的服務(wù)接口信息
struct User{
    1: i32 id
    2: string name
}

service UserService{
    User getUser(1:i32 uid)
}
  • 上面 user.thrift 定義了了一個數(shù)據(jù)類型 User 與業(yè)務(wù)接口 UserService。然后執(zhí)行下面命令使用 Thrift 編譯器生成 Java 文件
thrift -r -gen java user.thrift

可用數(shù)據(jù)類型

  • bool:布爾值扫夜,對應(yīng) Java 的 boolean
  • byte:8 位有符號整數(shù)楞泼,對應(yīng) Java 的 byte
  • i16:16 位有符號整數(shù),對應(yīng) Java 的 short
  • i32:32 位有符號整數(shù)笤闯,對應(yīng) Java 的 int
  • i64:64 位有符號整數(shù)堕阔,對應(yīng) Java 的 long
  • double:64 位浮點(diǎn)數(shù),對應(yīng) Java 的 double
  • string:文本或二進(jìn)制字符串颗味,對應(yīng) Java 的 String
  • struct:定義公共的對象超陆,在 Java 中是一個 JavaBean
  • list:對應(yīng) Java 的 ArrayList
  • set:對應(yīng) Java 的 HashSet
  • map:對應(yīng) Java 的 HashMap
  • exception:對應(yīng) Java 的 Exception
  • service:service 類型可以被繼承
  • enum:枚舉類型

Thrift 網(wǎng)絡(luò)棧

  • 下圖為 Thrift 的網(wǎng)絡(luò)棧,包含了 Transport浦马、Protocol时呀、Processor 層和 Server/Client 層
Thrift 網(wǎng)絡(luò)棧

Transport

  • Transport 為底層網(wǎng)絡(luò)數(shù)據(jù)讀寫傳輸數(shù)據(jù)的抽象層张漂,Thrift 提供了如下幾個常用的 Transport 實(shí)現(xiàn):
    • TSocket:該 Transport 使用阻塞 Sockert 來收發(fā)數(shù)據(jù)
    • TFramedTransport:以幀形式發(fā)送數(shù)據(jù),如果服務(wù)器使用 NIO 時就必須使用該 Transport
    • TMemoryTransp:使用內(nèi)存 I/O谨娜,內(nèi)部使用了 ByteArrayOutputStream
    • TZlibTransport: 使用 Zlib 壓縮傳輸?shù)臄?shù)據(jù)鹃锈,但 Java 中未實(shí)現(xiàn)

Protocol

  • Protocol 為數(shù)據(jù)傳輸協(xié)議層,即對傳輸后的數(shù)據(jù)序列化和反序列化瞧预,常用的協(xié)議有:
    • TBinaryProtocol:二進(jìn)制格式
    • TCompactProtocol:壓縮格式
    • TJSONProtocol:JSON 格式
    • TSimpleJSONProtocol:提供 JSON 只寫協(xié)議,生成的文件很容易通過腳本語言解析
    • TDebugProtocoal:生成 Text 格式仅政,常用語調(diào)試

Processor

  • Processor 層對象由 Thrift 根據(jù)用戶 IDL 文件生成垢油,我們通常不能指定,該層主要有兩個功能:
    • 從 Protocol 層讀取數(shù)據(jù)然后交給對應(yīng) Handler 處理
    • 將 Handler 處理的結(jié)果發(fā)送給 Protocol 層

Server

  • Thrift 提供的 Server 實(shí)現(xiàn)有:
    • TNonblockingServer:基于多線程圆丹,非阻塞 IO 的 Server 層實(shí)現(xiàn)滩愁,專用于處理大量并發(fā)請求
    • THsHaServer:半同步/半異步的服務(wù)器模型
    • TThreadPoolServer:基于多線程阻塞 IO 的 Server 層實(shí)現(xiàn),它消耗的系統(tǒng)資源比 TNonblockingServer 高辫封,但可以提供更高的吞吐量
    • TSimpleServer: 該實(shí)現(xiàn)主要是用于測試. 它只有一個線程,并且是阻塞 IO, 因此在同一時間只能處理一個連接

Thrift 快速入門

  • 以上面 user.thrift 為例硝枉,執(zhí)行下面命令生成兩個類 User、UserService 倦微,將其拷貝到項(xiàng)目中(可能需要修改類中的包路徑
thrift -r -gen java user.thrift
  • Maven 引入依賴
<dependency>
  <groupId>org.apache.thrift</groupId>
  <artifactId>libthrift</artifactId>
  <version>0.11.0</version>
</dependency>
  • 編寫 UserService 業(yè)務(wù)實(shí)現(xiàn)類
public class UserServiceImpl implements UserService.Iface {
    @Override
    public User getUser(int uid) throws TException {
        User user = new User(uid,"ly");
        return user;
    }
}
  • 編寫 Server
public class Server {
    public static void main(String[] args) throws Exception {
        // 業(yè)務(wù)處理器
        TProcessor processorr = new UserService.Processor<UserService.Iface>(new UserServiceImpl());
        // 設(shè)置服務(wù)器
        TServerSocket serverSocket = new TServerSocket(8181);
        // 傳輸協(xié)議為二進(jìn)制
        TBinaryProtocol.Factory protocolFactory = new TBinaryProtocol.Factory();
        // 使用單線程阻塞 I/O 模型
        TServer.Args simpleArgs = new TServer.Args(serverSocket).processor(processorr).protocolFactory(protocolFactory);
        TServer server = new TSimpleServer(simpleArgs);
        System.out.println("開啟Thrift服務(wù)器妻味,監(jiān)聽端口:8181");
        server.serve();
    }
}
  • 編寫 Client
public class Client {
    public static void main(String[] args) throws Exception {
        // 設(shè)置調(diào)用的服務(wù)地址-端口
        TTransport tTransport = new TSocket("localhost", 8181);
        // 使用二進(jìn)制協(xié)議
        TProtocol protocol = new TBinaryProtocol(tTransport);
        // 使用的接口
        UserService.Client client = new UserService.Client(protocol);
        // 打開 Socket
        tTransport.open();
        System.out.println(client.getUser(123));
        tTransport.close();
    }
}
  • 測試:先運(yùn)行 Server,在運(yùn)行 Client 可看到下面輸出
User(id:123, name:ly)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末欣福,一起剝皮案震驚了整個濱河市责球,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌拓劝,老刑警劉巖雏逾,帶你破解...
    沈念sama閱讀 211,376評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異郑临,居然都是意外死亡栖博,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評論 2 385
  • 文/潘曉璐 我一進(jìn)店門厢洞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來仇让,“玉大人,你說我怎么就攤上這事犀变∶盟铮” “怎么了?”我有些...
    開封第一講書人閱讀 156,966評論 0 347
  • 文/不壞的土叔 我叫張陵获枝,是天一觀的道長蠢正。 經(jīng)常有香客問我,道長省店,這世上最難降的妖魔是什么嚣崭? 我笑而不...
    開封第一講書人閱讀 56,432評論 1 283
  • 正文 為了忘掉前任笨触,我火速辦了婚禮,結(jié)果婚禮上雹舀,老公的妹妹穿的比我還像新娘芦劣。我一直安慰自己,他們只是感情好说榆,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,519評論 6 385
  • 文/花漫 我一把揭開白布虚吟。 她就那樣靜靜地躺著,像睡著了一般签财。 火紅的嫁衣襯著肌膚如雪串慰。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,792評論 1 290
  • 那天唱蒸,我揣著相機(jī)與錄音邦鲫,去河邊找鬼。 笑死神汹,一個胖子當(dāng)著我的面吹牛庆捺,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播屁魏,決...
    沈念sama閱讀 38,933評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼滔以,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蚁堤?” 一聲冷哼從身側(cè)響起醉者,我...
    開封第一講書人閱讀 37,701評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎披诗,沒想到半個月后撬即,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,143評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡呈队,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,488評論 2 327
  • 正文 我和宋清朗相戀三年剥槐,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宪摧。...
    茶點(diǎn)故事閱讀 38,626評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡粒竖,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出几于,到底是詐尸還是另有隱情蕊苗,我是刑警寧澤,帶...
    沈念sama閱讀 34,292評論 4 329
  • 正文 年R本政府宣布沿彭,位于F島的核電站朽砰,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜瞧柔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,896評論 3 313
  • 文/蒙蒙 一漆弄、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧造锅,春花似錦撼唾、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至糙箍,卻和暖如春恨锚,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背倍靡。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留课舍,地道東北人塌西。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像筝尾,于是被迫代替她去往敵國和親捡需。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,494評論 2 348

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