日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

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

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

  有很內容是重復的,給位看官自行過濾。

  英文資料

  API

  使用介紹

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

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

  thrift的wiki(優缺點)

  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是為了實現跨語言服務訪問的一個框架

?

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

?

Thrift定義了數據和服務的描述方式,是一種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客戶端和服務端程序框架。你只需要考慮如何實現你的服務就可以了。并且它支持很多種語言。

?

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

?

為什么還需要Thrift

?

thrift-20070401.pdf中有解釋。

?

1、多語言開發的需要

?

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

?

2、性能問題

?

web service也可以實現多語言互訪問的功能,但xml文件太大,性能不行。Thrift可以使用二進值的格式。


安裝部署

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

  • 下載 thrift 源文件(http://svn.apache.org/repos/asf/thrift/tags/thrift-0.6.1/)
  • 將 thrift 源文件導入 eclipse,進入 /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 導入 eclipse 開發環境
  • 下載 thrift 編譯工具,該工具可將 thrift 腳本文件編譯成 java 文件,下載地址:http://apache.etoak.com//thrift/0.6.0/thrift-0.6.1.exe
  • 創建 Hello.thrift 腳本文件,具體代碼如上一章節所述,進入 thrift-0.6.1.exe 所在目錄,執行命令"thrift-0.6.1.exe -gen java x:\Hello.thrift",在當前運行盤符下,可看見 gen-java 目錄,進入目錄可看到生成的 Java 代碼。更多 thrift 的命令內容,請參考 thrift 自帶的 help 命令
  • 編寫服務端和客戶端代碼,完成 thrift 的安裝和部署?
  • 幾個tips:

  • 結構體不能繼承
  • 異常在service中方法拋出之前必須先定義
  • required和optional的區別:規范的struct定義中的每個域均會使用required或者optional關鍵字進行標識。如果required標識的域沒有賦值,thrift將給予提示。如果optional標識的域沒有賦值,該域將不會被序列化傳輸。如果某個optional標識域有缺省值而用戶沒有重新賦值,則該域的值一直為缺省值。
  • 不同于protocal buffer,thrift不支持枚舉類嵌套,枚舉常量必須是32位的正整數。
  • 客戶端和server端通道的選擇要一致。
  • 0.8和0.6版本的差異主要在初始化server端,構造函數變了:?TServer server = new TSimpleServer(new Args(serverTransport).processor(processor).protocolFactory(new TBinaryProtocol.Factory()));
  • 應用中發現一個問題,就是3中開始struct中字段都是required的,在C#調用java端方法時,對象未賦值,導致異常;后改為optional,正常工作。
  • 高手分析的問題(轉載):

    Thrift是一個非常棒的工具,是Facebook的開源項目,目前的開發非常的活躍,由Apache管理,所以用的是Apache Software License,這非常重要,因為可以放心的對其修改并用到自己的項目中。

    談到修改Thrift,這非常重要。因為我覺得如果要嚴肅的使用Thrift,不可避免的要深入了解它,并幾乎都要修改Thrift的代碼。一個通信框架,它不可能幫你做到所有的事情,也不可能在不了解的情況下就貿然的使用。

    1.Thrift 的Java Server/Client有個較為嚴重的bug(https://issues.apache.org/jira/browse/THRIFT-601 ),隨機向thrift? sever的監聽端口發些數據,可能會導致Server OutOfMemory,細細看看代碼,這個bug有點土。

    2.Thrift Client線程不安全,多線程下使用可能導致Server和客戶端程序崩潰。Client的每次調用遠程方法其實是有多次Socket寫操作,因此每個線程中使用的Client要保證獨立,如果多個線程混用同一個Client(其實是用同一個Socket),可能會導致傳輸的字節順序混亂,使得Server OutOfMemory(參考1)

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

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

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

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

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

    8.用valgrind看,thrift cpp似乎有一些內存問題。沒細看。

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

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

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

    thrift文件.zip

    若失效可以留下郵箱。

    ?

    ?

    轉載于:https://www.cnblogs.com/biGpython/archive/2012/02/03/2337198.html

    總結

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

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。