Thrift小試牛刀——在Windows中通過(guò)Thrift實(shí)現(xiàn)簡(jiǎn)單服務(wù)

成功的秘訣乃正,在永不改變既定的目的票堵。 —— 盧梭

Thrift簡(jiǎn)介

The Apache Thrift software framework, for scalable cross-language services development, combines a software stack with a code generation engine to build services that work efficiently and seamlessly between C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, OCaml and Delphi and other languages.

通過(guò)官方介紹攘宙,我們可以了解到Thrift是一個(gè)軟件框架坦弟,可以提供跨語(yǔ)言的服務(wù)開(kāi)發(fā)蜗细。Thrift框架包含一個(gè)軟件棧裆操,包含生成各種語(yǔ)言的引擎,我們通過(guò)Thrift提供的接口定義語(yǔ)言(IDL)來(lái)定義接口鳄乏,然后引擎會(huì)自動(dòng)生成各種語(yǔ)言的代碼跷车。


Thrift架構(gòu)圖.jpg

Windows平臺(tái)下Thrift安裝與使用

下載與安裝

下載文件.png

下載地址:點(diǎn)我下載Thrift

建議:修改名稱(chēng)為T(mén)hrift.exe,方便使用

建議:配置環(huán)境變量
在系統(tǒng)變量Path中添加Thrift路徑到環(huán)境變量中

win10添加環(huán)境變量.png

使用

定義helloServer.thrift文件
在本例中橱野,定義了一個(gè)用戶(hù)對(duì)象User朽缴,包含兩個(gè)字段,用戶(hù)姓名username水援,用戶(hù)年齡age密强,定義了一個(gè)接口sayHello(User user),返回用戶(hù)姓名和年齡蜗元。

namespace java cn.ac.ict.software.thrift

struct User {
        1: string username,
        2: i32 age,
    }

service HelloWorldService {
    
    string sayHello(1:User user)
}

定義完成helloServer.thrift文件之后我們使用命令thrift -r --gen java helloServer.thrift生成代碼或渤,如下圖所示。

生成文件.png

可以看到生成的代碼包含兩個(gè)類(lèi)奕扣,HelloWorldService.java和User.java類(lèi)薪鹦,如下圖所示。

引擎自動(dòng)生成代碼.png

隨后惯豆,把自動(dòng)生成的代碼添加到項(xiàng)目中去池磁,如下圖所示。

將自動(dòng)生成代碼添加到項(xiàng)目中.png

添加完代碼發(fā)現(xiàn)build會(huì)報(bào)錯(cuò)楷兽,查看日志發(fā)現(xiàn)是因?yàn)闆](méi)有添加Thrift依賴(lài)的庫(kù)文件地熄,我使用的是gradle來(lái)開(kāi)發(fā),添加Thrift的依賴(lài)就可以了芯杀,在build.gradlezhong 添加如下代碼

 // https://mvnrepository.com/artifact/org.apache.thrift/libthrift
 compile group: 'org.apache.thrift', name: 'libthrift', version: '0.10.0'

如果你使用的是mawen來(lái)添加依賴(lài)的話(huà)端考,可以添加如下代碼

<!-- https://mvnrepository.com/artifact/org.apache.thrift/libthrift -->
<dependency>
    <groupId>org.apache.thrift</groupId>
    <artifactId>libthrift</artifactId>
    <version>0.10.0</version>
</dependency>

更多的添加方式雅潭,大家可以參考http://mvnrepository.com/artifact/org.apache.thrift/libthrift

客戶(hù)端代碼
客戶(hù)端主要是將User對(duì)象發(fā)送給服務(wù)端,首先却特,實(shí)例化TTransport 扶供,設(shè)置IP地址、服務(wù)端口port核偿、超時(shí)時(shí)間timeout等诚欠。然后設(shè)置協(xié)議TProtocol ,注意要和服務(wù)端保持一致漾岳。接著調(diào)用接口sayHello把User對(duì)象傳遞過(guò)去。

public class HelloClient {

    private static final String SERVER_IP = "localhost";
    private static final int SERVER_PORT = 8090;
    private static final int TIMEOUT = 30000;

    public void startClient() {
        TTransport transport = null;
        try {
            transport = new TSocket(SERVER_IP, SERVER_PORT, TIMEOUT);
            // 協(xié)議要和服務(wù)端一致
            TProtocol protocol = new TBinaryProtocol(transport);
            // TProtocol protocol = new TCompactProtocol(transport);
            // TProtocol protocol = new TJSONProtocol(transport);
            HelloWorldService.Client client = new HelloWorldService.Client(protocol);
            transport.open();
            User user = new User();
            user.username = "haiker";
            user.age = 26;
            String result = client.sayHello(user);
            System.out.println("Thrify client result =: " + result);
        } catch (TException e) {
            e.printStackTrace();
        } finally {
            if (null != transport) {
                transport.close();
            }
        }
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        HelloClient client = new HelloClient();
        client.startClient();

    }
}

HelloWorldImpl代碼
HelloWorldImpl代碼implents定義的接口sayHello,本例中只是簡(jiǎn)單的把姓名和年齡返回粉寞。

public class HelloWorldImpl implements HelloWorldService.Iface{
    @Override
    public String sayHello(User user) throws TException {
        return "Hi,My name is " + user.username + " and My age is " + user.age;
    }

}

服務(wù)端代碼
服務(wù)端代碼首先要實(shí)例化TProcessor尼荆,傳入我們具體的HelloWorldImpl類(lèi),本例中我們使用簡(jiǎn)單的單線程服務(wù)模型TSimpleServer來(lái)開(kāi)啟一個(gè)服務(wù)唧垦。

public class HelloServer {
    private static final int SERVER_PORT = 8090;

    public void startServer() {
        try {
            System.out.println("HelloWorld TSimpleServer start ....");

            TProcessor tprocessor = new HelloWorldService.Processor<>(new HelloWorldImpl()); 

            // 簡(jiǎn)單的單線程服務(wù)模型捅儒,一般用于測(cè)試
            TServerSocket serverTransport = new TServerSocket(SERVER_PORT);
            TServer.Args tArgs = new TServer.Args(serverTransport);
            tArgs.processor(tprocessor);
            tArgs.protocolFactory(new TBinaryProtocol.Factory());
            TServer server = new TSimpleServer(tArgs);
            server.serve();

        } catch (Exception e) {
            System.out.println("Server start error!!!");
            e.printStackTrace();
        }
    }


    /**
     * @param args
     */
    public static void main(String[] args) {
        HelloServer server = new HelloServer();
        server.startServer();
    }
}

總結(jié)

本文主要探討了Thrift在Windows中的安裝和簡(jiǎn)單使用,以后會(huì)繼續(xù)深入探討Thrift在Linux中的安裝與使用振亮、Thrift的原理等巧还。

源碼地址

https://github.com/haiker2011/ThriftDemo

參考文獻(xiàn)

  1. http://thrift.apache.org/
  2. https://github.com/apache/thrift/
  3. http://dengqsintyt.iteye.com/blog/2005307
  4. http://www.cnblogs.com/cyfonly/p/6059374.html
  5. http://shiyanjun.cn/archives/107.html
  6. http://www.micmiu.com/soa/rpc/thrift-sample/
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市坊秸,隨后出現(xiàn)的幾起案子麸祷,更是在濱河造成了極大的恐慌,老刑警劉巖褒搔,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件阶牍,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)放棒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)矛物,“玉大人,你說(shuō)我怎么就攤上這事腥椒。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵困食,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我肮柜,道長(zhǎng)陷舅,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任审洞,我火速辦了婚禮莱睁,結(jié)果婚禮上待讳,老公的妹妹穿的比我還像新娘。我一直安慰自己仰剿,他們只是感情好创淡,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著南吮,像睡著了一般琳彩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上部凑,一...
    開(kāi)封第一講書(shū)人閱讀 51,688評(píng)論 1 305
  • 那天露乏,我揣著相機(jī)與錄音,去河邊找鬼涂邀。 笑死瘟仿,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的比勉。 我是一名探鬼主播劳较,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼浩聋!你這毒婦竟也來(lái)了观蜗?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤衣洁,失蹤者是張志新(化名)和其女友劉穎墓捻,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體闸与,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡毙替,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了践樱。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片厂画。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖拷邢,靈堂內(nèi)的尸體忽然破棺而出袱院,到底是詐尸還是另有隱情,我是刑警寧澤瞭稼,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布忽洛,位于F島的核電站,受9級(jí)特大地震影響环肘,放射性物質(zhì)發(fā)生泄漏欲虚。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一悔雹、第九天 我趴在偏房一處隱蔽的房頂上張望复哆。 院中可真熱鬧欣喧,春花似錦、人聲如沸梯找。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)锈锤。三九已至驯鳖,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間久免,已是汗流浹背浅辙。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留阎姥,地道東北人摔握。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像丁寄,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子泊愧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

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