日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

Thrift 教程 开发 笔记 原理 资料 使用 范例 示例 应用

發(fā)布時間:2025/3/15 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Thrift 教程 开发 笔记 原理 资料 使用 范例 示例 应用 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

  在這里匯總一下:thrift版本差異和源碼及jar包下載。文檔,示例(腳本、代碼、),白皮書,常見問題。

  有很內(nèi)容是重復(fù)的,給位看官自行過濾。

  英文資料

  API

  使用介紹

  原理簡介(推薦閱讀)?和 簡單范例

  IBM developerWorks 詳細(xì)教程以及很多資料(可惜版本是0.6.0的,推薦觀看)

  thrift的wiki(優(yōu)缺點(diǎn))

  0.8下載

  各版本SVN?http://svn.apache.org/repos/asf/thrift/tags/


?

Thrift是個啥東東?

?

來自wiki.apache.org/thrift/FrontPage的定義

?

Thrift?is a software framework for scalable cross-language services development.?

?

Thrift是為了實(shí)現(xiàn)跨語言服務(wù)訪問的一個框架

?

Thrift allows you to define data types and service interfaces in a simple definition file.

?

Thrift定義了數(shù)據(jù)和服務(wù)的描述方式,是一種IDL

?

Taking that file as input, the compiler generates code to be used to easily build RPC clients and servers that communicate seamlessly across programming languages.

?

寫一個定義文件,就可以使用thrift來生成某種語言RPC客戶端和服務(wù)端程序框架。你只需要考慮如何實(shí)現(xiàn)你的服務(wù)就可以了。并且它支持很多種語言。

?

這有點(diǎn)像web service, 定義好一個web service服務(wù)描述文件后,可以使用如axis等工具生成服務(wù)器端或客戶端的框架程序。

?

為什么還需要Thrift

?

thrift-20070401.pdf中有解釋。

?

1、多語言開發(fā)的需要

?

比如其中提到的搜索服務(wù),LAMP本身沒有這個功能,開發(fā)者可能使用C++開發(fā),php如何訪問這個服務(wù)呢?于是需要有一種高效的跨語言訪問的方法。

?

2、性能問題

?

web service也可以實(shí)現(xiàn)多語言互訪問的功能,但xml文件太大,性能不行。Thrift可以使用二進(jìn)值的格式。


安裝部署

Apache Thrift 的官方網(wǎng)站為:http://thrift.apache.org/,具體安裝步驟如下:

  • 下載 thrift 源文件(http://svn.apache.org/repos/asf/thrift/tags/thrift-0.6.1/)
  • 將 thrift 源文件導(dǎo)入 eclipse,進(jìn)入 /lib/java 目錄,使用 ant 編譯 build.xml 獲得 libthrift-0.6.1-snapshot.jar (其他版本類似)
  • 將 libthrift-0.6.1-snapshot.jar、slf4j-api-1.5.8.jar、slf4j-log4j12-1.5.8.jar 和 log4j-1.2.14.jar 導(dǎo)入 eclipse 開發(fā)環(huán)境
  • 下載 thrift 編譯工具,該工具可將 thrift 腳本文件編譯成 java 文件,下載地址:http://apache.etoak.com//thrift/0.6.0/thrift-0.6.1.exe
  • 創(chuàng)建 Hello.thrift 腳本文件,具體代碼如上一章節(jié)所述,進(jìn)入 thrift-0.6.1.exe 所在目錄,執(zhí)行命令"thrift-0.6.1.exe -gen java x:\Hello.thrift",在當(dāng)前運(yùn)行盤符下,可看見 gen-java 目錄,進(jìn)入目錄可看到生成的 Java 代碼。更多 thrift 的命令內(nèi)容,請參考 thrift 自帶的 help 命令
  • 編寫服務(wù)端和客戶端代碼,完成 thrift 的安裝和部署?
  • 幾個tips:

  • 結(jié)構(gòu)體不能繼承
  • 異常在service中方法拋出之前必須先定義
  • required和optional的區(qū)別:規(guī)范的struct定義中的每個域均會使用required或者optional關(guān)鍵字進(jìn)行標(biāo)識。如果required標(biāo)識的域沒有賦值,thrift將給予提示。如果optional標(biāo)識的域沒有賦值,該域?qū)⒉粫恍蛄谢瘋鬏敗H绻硞€optional標(biāo)識域有缺省值而用戶沒有重新賦值,則該域的值一直為缺省值。
  • 不同于protocal buffer,thrift不支持枚舉類嵌套,枚舉常量必須是32位的正整數(shù)。
  • 客戶端和server端通道的選擇要一致。
  • 0.8和0.6版本的差異主要在初始化server端,構(gòu)造函數(shù)變了:?TServer server = new TSimpleServer(new Args(serverTransport).processor(processor).protocolFactory(new TBinaryProtocol.Factory()));
  • 應(yīng)用中發(fā)現(xiàn)一個問題,就是3中開始struct中字段都是required的,在C#調(diào)用java端方法時,對象未賦值,導(dǎo)致異常;后改為optional,正常工作。
  • 高手分析的問題(轉(zhuǎn)載):

    Thrift是一個非常棒的工具,是Facebook的開源項目,目前的開發(fā)非常的活躍,由Apache管理,所以用的是Apache Software License,這非常重要,因?yàn)榭梢苑判牡膶ζ湫薷牟⒂玫阶约旱捻椖恐小?/p>

    談到修改Thrift,這非常重要。因?yàn)槲矣X得如果要嚴(yán)肅的使用Thrift,不可避免的要深入了解它,并幾乎都要修改Thrift的代碼。一個通信框架,它不可能幫你做到所有的事情,也不可能在不了解的情況下就貿(mào)然的使用。

    1.Thrift 的Java Server/Client有個較為嚴(yán)重的bug(https://issues.apache.org/jira/browse/THRIFT-601 ),隨機(jī)向thrift? sever的監(jiān)聽端口發(fā)些數(shù)據(jù),可能會導(dǎo)致Server OutOfMemory,細(xì)細(xì)看看代碼,這個bug有點(diǎn)土。

    2.Thrift Client線程不安全,多線程下使用可能導(dǎo)致Server和客戶端程序崩潰。Client的每次調(diào)用遠(yuǎn)程方法其實(shí)是有多次Socket寫操作,因此每個線程中使用的Client要保證獨(dú)立,如果多個線程混用同一個Client(其實(shí)是用同一個Socket),可能會導(dǎo)致傳輸?shù)淖止?jié)順序混亂,使得Server OutOfMemory(參考1)

    3.Thrift定義數(shù)據(jù)結(jié)構(gòu)時,盡量避免用map, 或者set。在cpp下, map被對應(yīng)為std::map(rb tree)和std::set,thrift生成的類不會重載”<”,因此需要手動修改生成類,否則link沒法通過。較為麻煩。

    4.如果Client端基于效率考慮,要緩存Socket,需要重新實(shí)現(xiàn)其TTransport類,以支持 Socket緩存池。當(dāng)然,這個實(shí)現(xiàn)其實(shí)跟thrift沒多大關(guān)系,算是2次開發(fā)。但一般都要這么做的吧?

    5.如果Client基于效率考慮,緩存了Socket,那么thrift Server端的模式選擇就較為重要了。如果使用同步的TThreadPoolServer,那么無可避免的,客戶端緩存1個Socket,Server端就會有一個線程一直處于Server狀態(tài),等待peek這個Socket上的數(shù)據(jù)。這個線程就不能用于其它請求了。所以,及時清理Client端的Socket及控制Socket池的大小是非常必要的。

    6.聽同事說CPP Thrift Server的Epoll NonBlocking模式有效率問題。其實(shí),并發(fā)要求不高的Server用LT模式的EPoll其實(shí)很方便的,當(dāng)然,這個要自己給Thrfit Server做patch了,不過也不麻煩。開發(fā)起來也是很方便的。我想給我們的Server加個EPOLLONESHOT的同步EPoll實(shí)現(xiàn)。

    7.CPP下的 TThreadPoolServer和TThreadServer由一個有趣的問題,如果有客戶端維護(hù)長連接,那么對這個Server實(shí)例做析構(gòu)的時候會堵塞(前面說過了,在peek中…)。

    8.用valgrind看,thrift cpp似乎有一些內(nèi)存問題。沒細(xì)看。

    9.無論是Java,還是CPP,Server端都無法通過合法的方式獲取Client的ip, port。可以通過編寫ThriftServerEventHandler可以處理這件事情。如果想要獲取Client ip, port的話,可以看看這個東西。

    ?上面文章的作者還有兩篇帖子 是 TCP通道關(guān)閉時發(fā)生了什么 ?和 這個

    最后,我整理了一個0.8版本的包,包括了java和c#的調(diào)用示例,java源碼,白皮書的中文版,一個復(fù)雜的腳本示例(wiki上下載的),所以依賴的jar包等

    thrift文件.zip

    若失效可以留下郵箱。

    ?

    ?

    轉(zhuǎn)載于:https://www.cnblogs.com/biGpython/archive/2012/02/03/2337198.html

    總結(jié)

    以上是生活随笔為你收集整理的Thrift 教程 开发 笔记 原理 资料 使用 范例 示例 应用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。