亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

[轉(zhuǎn)] Apache Thrift入門

系統(tǒng) 1716 0

作者: H.E

來源: http://www.javabloger.com/article/apache-thrift-architecture.html

Apache Thrift入門1-架構(gòu)&介紹

Thrift 是什么?
Thrift源于大名鼎鼎的facebook之手,在2007年facebook提交Apache基金會(huì)將Thrift作為一個(gè)開源項(xiàng)目,對(duì)于當(dāng)時(shí)的facebook來說創(chuàng)造thrift是為了解決facebook系統(tǒng)中各系統(tǒng)間大數(shù)據(jù)量的傳 輸通信以及系統(tǒng)之間語言環(huán)境不同需要跨平臺(tái)的特性。所以thrift可以支持多種程序語言,例如: C++, C#, Cocoa, Erlang, Haskell, Java, Ocami, Perl, PHP, Python, Ruby, Smalltalk. 在多種不同的語言之間通信thrift可以作為二進(jìn)制的高性能的通訊中間件,支持?jǐn)?shù)據(jù)(對(duì)象)序列化和多種類型的RPC服務(wù)。Thrift適用于程序?qū)Τ?序靜態(tài)的數(shù)據(jù)交換,需要先確定好他的數(shù)據(jù)結(jié)構(gòu),他是完全靜態(tài)化的,當(dāng)數(shù)據(jù)結(jié)構(gòu)發(fā)生變化時(shí),必須重新編輯IDL文件,代碼生成,再編譯載入的流程,跟其他IDL工具相比較可以視為是Thrift的弱項(xiàng),Thrift適用于搭建大型數(shù)據(jù)交換及存儲(chǔ)的通用工具,對(duì)于大型系統(tǒng)中的內(nèi)部數(shù)據(jù)傳輸相對(duì)于JSON和xml無論在性能、傳輸大小上有明顯的優(yōu)勢(shì)。

Thrift是IDL(interface definition language)描述性語言的一個(gè)具體實(shí)現(xiàn),關(guān)于IDL的話題我們可以追溯到CORBA盛行1999-2001年(Common Object Request Broker Architecture/公用對(duì)象請(qǐng)求代理體系結(jié)構(gòu)),在 IDL 中我們似乎不會(huì)忘記到這幾個(gè)關(guān)鍵字:module、interface、string、long 和 int,我還記得IDL利用module來創(chuàng)建名稱空間,并且準(zhǔn)確地映射為 Java 的 package,這些特性幾乎和現(xiàn)在thrift的特性完全相同,所以thrift的設(shè)計(jì)思想和理念絕不是什么從火星來的new idea,看看在那個(gè)CORBA盛行的年代人們提出的概念,如圖所示CORBA 請(qǐng)求的各個(gè)部分,回頭我們?cè)倥cthrift進(jìn)行對(duì)比一下:

Thrift 基礎(chǔ)架構(gòu)
Thrift是一個(gè)服務(wù)端和客戶端的架構(gòu)體系,從我個(gè)人的感官上來看Thrift是一個(gè)類似XML-RPC+Java-to- IDL+Serialization Tools=Thrift 的東東,Thrift 具有自己內(nèi)部定義的傳輸協(xié)議規(guī)范(TProtocol)和傳輸數(shù)據(jù)標(biāo)準(zhǔn)(TTransports),通過IDL腳本對(duì)傳輸數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)(struct) 和傳輸數(shù)據(jù)的業(yè)務(wù)邏輯(service)根據(jù)不同的運(yùn)行環(huán)境快速的構(gòu)建相應(yīng)的代碼,并且通過自己內(nèi)部的序列化機(jī)制對(duì)傳輸?shù)臄?shù)據(jù)進(jìn)行簡(jiǎn)化和壓縮提高高并發(fā)、 大型系統(tǒng)中數(shù)據(jù)交互的成本,下圖描繪了Thrift的整體架構(gòu),分為6個(gè)部分:1.你的業(yè)務(wù)邏輯實(shí)現(xiàn)(You Code) 2.客戶端和服務(wù)端對(duì)應(yīng)的Service 3.執(zhí)行讀寫操作的計(jì)算結(jié)果4.TProtocol 5.TTransports 6.底層I/O通信

圖 中前面3個(gè)部分是1.你通過Thrift腳本文件生成的代碼,2.圖中的褐色框部分是你根據(jù)生成代碼構(gòu)建的客戶端和處理器的代碼,3.圖中紅色的部分是2 端產(chǎn)生的計(jì)算結(jié)果。從TProtocol下面3個(gè)部分是Thrift的傳輸體系和傳輸協(xié)議以及底層I/O通信,Thrift并且提供 堵塞、非阻塞,單線程、多線程的模式運(yùn)行在服務(wù)器上,還可以配合服務(wù)器/容器一起運(yùn)行,可以和現(xiàn)有JEE服務(wù)器/Web容器無縫的結(jié)合。

數(shù)據(jù)類型
* Base Types:基本類型
* Struct:結(jié)構(gòu)體類型
* Container:容器類型,即List、Set、Map
* Exception:異常類型
* Service: 定義對(duì)象的接口,和一系列方法

協(xié)議
Thrift可以讓你選擇客戶端與服務(wù)端之間傳輸通信協(xié)議的類別,在傳輸協(xié)議上總體上劃分為文本(text)和二進(jìn)制(binary)傳輸協(xié)議, 為節(jié)約帶寬,提供傳輸效率,一般情況下使用二進(jìn)制類型的傳輸協(xié)議為多數(shù),但有時(shí)會(huì)還是會(huì)使用基于文本類型的協(xié)議,這需要根據(jù)項(xiàng)目/產(chǎn)品中的實(shí)際需求:
* TBinaryProtocol – 二進(jìn)制編碼格式進(jìn)行數(shù)據(jù)傳輸。
* TCompactProtocol – 這種協(xié)議非常有效的,使用Variable-Length Quantity (VLQ) 編碼對(duì)數(shù)據(jù)進(jìn)行壓縮。
* TJSONProtocol – 使用JSON的數(shù)據(jù)編碼協(xié)議進(jìn)行數(shù)據(jù)傳輸。
* TSimpleJSONProtocol – 這種節(jié)約只提供JSON只寫的協(xié)議,適用于通過腳本語言解析
* TDebugProtocol – 在開發(fā)的過程中幫助開發(fā)人員調(diào)試用的,以文本的形式展現(xiàn)方便閱讀。

傳輸層
* TSocket- 使用堵塞式I/O進(jìn)行傳輸,也是最常見的模式。
* TFramedTransport- 使用非阻塞方式,按塊的大小,進(jìn)行傳輸,類似于Java中的NIO。
* TFileTransport- 顧名思義按照文件的方式進(jìn)程傳輸,雖然這種方式不提供Java的實(shí)現(xiàn),但是實(shí)現(xiàn)起來非常簡(jiǎn)單。
* TMemoryTransport- 使用內(nèi)存I/O,就好比Java中的ByteArrayOutputStream實(shí)現(xiàn)。
* TZlibTransport- 使用執(zhí)行zlib壓縮,不提供Java的實(shí)現(xiàn)。

服務(wù)端類型
* TSimpleServer - 單線程服務(wù)器端使用標(biāo)準(zhǔn)的堵塞式I/O。
* TThreadPoolServer - 多線程服務(wù)器端使用標(biāo)準(zhǔn)的堵塞式I/O。
* TNonblockingServer – 多線程服務(wù)器端使用非堵塞式I/O,并且實(shí)現(xiàn)了Java中的NIO通道。

誰在用thrift ?


Thrift用于Quara系統(tǒng)后端數(shù)據(jù)的通信,服務(wù)端是用C++來實(shí)現(xiàn)的,客戶端則是python。
Quara背景: Quara是在線問答服務(wù)公司,類似新浪微博和百度知道的合體,消息靈通人士透露,去年Quara獲得了1400萬美元投資,目前他們只有9名員工。
原文: http://www.philwhln.com/quoras-technology-examined#thrift


Thrift用于在多種Evernote API平臺(tái)開發(fā)的客戶端與Evernote服務(wù)器之間的通信與數(shù)據(jù)傳輸,Evernote API定義了自己的Evernote Data Access and Management (EDAM) 協(xié)議規(guī)范,讓客戶端使用更小的網(wǎng)絡(luò)帶寬上傳、下載文件和在線即時(shí)搜索服務(wù)。
Evernote 背景: EverNote是一款非常著名的免費(fèi)軟件,它最大的特點(diǎn)就是支持多平臺(tái),而且數(shù)據(jù)能通過網(wǎng)絡(luò)互相同步。譬如說,你可以隨時(shí)在手機(jī)上的Evernote新增筆記,回家后在電腦上也能看到它了!
原文: http://www.evernote.com/about/developer/api/evernote-api.htm

HBase 中的Thrift
Thrift用于HBase中是為了提供跨平臺(tái)的服務(wù)接口,在HBase 中可以使用[hbase-root]/bin/hbase thrift start 命令啟動(dòng)涵蓋Thrift的HBase服務(wù)端,客戶端通過thrift的命令生成不同版本的客戶端代碼,根據(jù)定義的數(shù)據(jù)格式,對(duì)遠(yuǎn)程HBase服務(wù)端進(jìn)行 操作,是除了REST遠(yuǎn)程方法調(diào)用的另一種途徑。
參見:http://wiki.apache.org/hadoop/Hbase/ThriftApi

更多資料請(qǐng)閱讀: http://wiki.apache.org/thrift/PoweredBy

Thrift與其他傳輸方式的比較
xml與JSON相比體積太大,但是xml傳統(tǒng),也不算復(fù)雜。
json 體積較小,新穎,但不夠完善。
thrift 體積超小,使用起來比較麻煩,不如前兩者輕便,但是對(duì)于1.高并發(fā)、2.數(shù)據(jù)傳輸量大、3.多語言環(huán)境, 滿足其中2點(diǎn)使用 thrift還是值得的。

假定需要傳輸相同的內(nèi)容,但使用不同的方式從 1、傳輸內(nèi)容所產(chǎn)生的大小 2、傳輸過程中服務(wù)端和客戶端所產(chǎn)生的開銷,這2個(gè)方便進(jìn)行比較。使用Thrift和其他方式的所產(chǎn)生的內(nèi)容大小比較結(jié)果如下:

在上圖中我們能明顯看出,最臃腫的是RMI,其次是xml,使用Thrift的TCompactProtocol協(xié)議和Google 的 Protocol Buffers 相差的不算太多,相比而言還是Google 的 Protocol Buffers效果最佳。

使用Thrift 中的協(xié)議和其他方式的所產(chǎn)生的 運(yùn)行開銷 比較結(jié)果如下:

在上圖中我們能明顯看出,最占資源是REST2中協(xié)議,使用Thrift的TCompactProtocol協(xié)議和Google 的 Protocol Buffers 相差的不算太多,相比而言Thrift的TCompactProtocol協(xié)議效果最佳。

接下來請(qǐng)繼續(xù)閱讀, 邁向Thrift的第一步,Thrift示例

Apache Thrift入門2-Java代碼實(shí)現(xiàn)例子

在上一篇文章中提到了Thrift的架構(gòu)、傳輸協(xié)議( Ref ),本篇文章將對(duì)Thrift的入門實(shí)例進(jìn)行介紹。 分為如下5個(gè)部分: 運(yùn)行環(huán)境、安裝/配置、腳本文件、創(chuàng)建代碼、運(yùn)行程序。

一、開發(fā)環(huán)境(清單1)
1.操作系統(tǒng)
Server-Linux / Client-WinXP
2.SDK
Sun JDK1.5+

3.需要的jar依賴包
libthrift.jar
slf4j-api-1.5.8.jar
slf4j-log4j12-1.5.8.jar
log4j-1.2.15.jar

4.編譯工具
Apache Ant & Apache ivy

二、安裝/配置 (清單2)
1.下載thrift源文件
http://labs.renren.com/apache-mirror//incubator/thrift/0.5.0-incubating/thrift-0.5.0.tar.gz

2.編譯thrift源文件
1)解壓 thrift-0.5.0.tar.gz
2)用ant編譯源代碼,進(jìn)入x:/thrift-0.5.0/lib/java目錄,執(zhí)行ant,通過ant中的ivy工具會(huì)自動(dòng)從站點(diǎn)下載所需要的依賴包,編譯完成后如圖所示:

3)編譯過程中下載的依賴包在x:/thrift-0.5.0/lib/java/build/ivy/lib 目錄下可以看見下載的jar依賴包,將編譯成功以后的jar包加入Eclipse的開發(fā)環(huán)境中。

三、腳本文件(清單3)
1.創(chuàng)建腳本
創(chuàng)建腳本文件 testJava.thrift ,腳本文件內(nèi)容如下:
namespace java com.javabloger.gen.code # 注釋1 定義生成代碼的命名空間,與你需要定義的package相對(duì)應(yīng)。

struct Blog { # 注釋2.1 定義實(shí)體名稱和數(shù)據(jù)結(jié)構(gòu),類似你業(yè)務(wù)邏輯中的pojo get/set
1: string topic # 注釋2.2 參數(shù)類型可以參見 Thrift wiki
2: binary content
3: i64 createdTime
4: string id
5: string ipAddress
6: map<string,string> props
}
service ThriftCase { # 注釋3 代碼生成的類名,你的業(yè)務(wù)邏輯代碼需要實(shí)現(xiàn)代碼生成的ThriftCase.Iface接口
i32 testCase1(1:i32 num1, 2:i32 num2, 3:string num3) # 注釋4.1 方法名稱和方法中的入?yún)ⅲ雲(yún)㈩愋蛥⒁? wiki
list<string> testCase2(1:map<string,string> num1)
void testCase3()
void testCase4(1:list<Blog> blog) # 注釋4.2 list 是thrift中基本數(shù)據(jù)類型中的一種,list中包含的Blog對(duì)象是上面struct中定義的
}

2.運(yùn)行腳本
1)從 thrift 站點(diǎn)下載windows版本的編譯工具,下載地址:http://labs.renren.com/apache-mirror//incubator/thrift/0.5.0-incubating/thrift-0.5.0.exe
2)通過Thrift的腳本文件,運(yùn)行 thrift 命令創(chuàng)建生成的代碼,例如:執(zhí)行 thrift -gen java x:/testJava.thrift 命令,在當(dāng)前運(yùn)行的盤符下,可看見gen-java目錄,在這里目錄中可以看見生成的java代碼,更多thrift 命令內(nèi)容,請(qǐng)參見thrift命令自帶的help。

3.Thrift 中的基本數(shù)據(jù)類型 (清單4)
類型 描述
bool true , false
byte 8 位的有符號(hào)整數(shù)
i16 16 位的有符號(hào)整數(shù)
i32 32 位的有符號(hào)整數(shù)
i64 64 位的有符號(hào)整數(shù)
double 64 位的浮點(diǎn)數(shù)
string UTF- 8 編碼的字符串
binary 字符數(shù)組
struct 結(jié)構(gòu)體
list 有序的元素列表,類似于STL的vector
set 無序的不重復(fù)元素集,類似于STL的 set
map key-value型的映射,類似于STL的map
exception 是一個(gè)繼承于本地語言的exception基類
service 服務(wù)。包含多個(gè)函數(shù)接口 ( 純虛函數(shù) )

四、創(chuàng)建代碼(清單5)
我將示例工程分了4個(gè)包,如下所示:
/com/javabloger
/client # 1.客戶端測(cè)試代碼
/gen/code # 2.通過腳本生成的class
/layer/transport # 3.服務(wù)器端代碼和定義的傳輸協(xié)議
/layer/business # 4.具體的業(yè)務(wù)邏輯代碼
具體代碼內(nèi)容這里就不闡述了,重點(diǎn)是要明白代碼的結(jié)構(gòu)和層次關(guān)系,其次是里面主要的幾個(gè)類的含義,至于代碼是怎么寫的并不是非常重要,僅僅是我個(gè)人觀點(diǎn),僅供參考,謝謝。

代碼示例的下載地址: http://javabloger-mini-books.googlecode.com/files/Thritf.zip

五、運(yùn)行程序
先運(yùn)行server,再運(yùn)行client ,客戶端向服務(wù)器端發(fā)送數(shù)據(jù)調(diào)用服務(wù)器端的4個(gè)方法,服務(wù)器端被傳入客戶端數(shù)據(jù),運(yùn)行效果如圖所示:

[轉(zhuǎn)] Apache Thrift入門


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 久久九九亚洲精品 | 亚洲最新视频在线观看 | 99免费精品| 久久这里只有精品66re99 | 狠狠色狠狠色综合系列 | 国产精品一区三区 | 日韩女同视频 | 免费高清成人啪啪网站 | 午夜一级精品免费毛片 | 特级做人爱c级特级aav毛片 | 亚洲第一激情 | 久久成人免费观看草草影院 | 国内精品久久久久影院嫩草 | 亚洲欧美在线综合一区二区三区 | 亚洲精品中文字幕乱码三区一二 | 一区在线观看 | 一男一女一级毛片 | 久久久久久久国产精品毛片 | 波多野结衣一区二区在线 | 欧美成人精品第一区二区三区 | 久久精品亚洲一区二区 | www.四虎影| 久久久久国产精品免费网站 | 久青草国产在线视频_久青草免 | 国产青草亚洲香蕉精品久久 | 国产精品成人观看视频国产奇米 | 欧美aaaaaaaa| 亚洲毛片网站 | 久久一级黄色片 | 在线一级视频 | 97免费在线观看 | www香蕉视频| 久久香蕉国产线看观看网站 | 天天爽夜夜爽人人爽 | 天天插夜夜 | 成人在线视频网址 | 九九国产| 色妇色综合久久夜夜 | 国产精品网站 夜色 | 欧美不卡影院 | 久久精品这里精品 |