黄色网页视频 I 影音先锋日日狠狠久久 I 秋霞午夜毛片 I 秋霞一二三区 I 国产成人片无码视频 I 国产 精品 自在自线 I av免费观看网站 I 日本精品久久久久中文字幕5 I 91看视频 I 看全色黄大色黄女片18 I 精品不卡一区 I 亚洲最新精品 I 欧美 激情 在线 I 人妻少妇精品久久 I 国产99视频精品免费专区 I 欧美影院 I 欧美精品在欧美一区二区少妇 I av大片网站 I 国产精品黄色片 I 888久久 I 狠狠干最新 I 看看黄色一级片 I 黄色精品久久 I 三级av在线 I 69色综合 I 国产日韩欧美91 I 亚洲精品偷拍 I 激情小说亚洲图片 I 久久国产视频精品 I 国产综合精品一区二区三区 I 色婷婷国产 I 最新成人av在线 I 国产私拍精品 I 日韩成人影音 I 日日夜夜天天综合

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

系統(tǒng) 2124 0

作者: H.E

來(lái)源: http://www.javabloger.com/article/apache-thrift-architecture.html

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

Thrift 是什么?
Thrift源于大名鼎鼎的facebook之手,在2007年facebook提交Apache基金會(huì)將Thrift作為一個(gè)開(kāi)源項(xiàng)目,對(duì)于當(dāng)時(shí)的facebook來(lái)說(shuō)創(chuàng)造thrift是為了解決facebook系統(tǒng)中各系統(tǒng)間大數(shù)據(jù)量的傳 輸通信以及系統(tǒng)之間語(yǔ)言環(huán)境不同需要跨平臺(tái)的特性。所以thrift可以支持多種程序語(yǔ)言,例如: C++, C#, Cocoa, Erlang, Haskell, Java, Ocami, Perl, PHP, Python, Ruby, Smalltalk. 在多種不同的語(yǔ)言之間通信thrift可以作為二進(jìn)制的高性能的通訊中間件,支持?jǐn)?shù)據(jù)(對(duì)象)序列化和多種類(lèi)型的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無(wú)論在性能、傳輸大小上有明顯的優(yōu)勢(shì)。

Thrift是IDL(interface definition language)描述性語(yǔ)言的一個(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來(lái)創(chuàng)建名稱空間,并且準(zhǔn)確地映射為 Java 的 package,這些特性幾乎和現(xiàn)在thrift的特性完全相同,所以thrift的設(shè)計(jì)思想和理念絕不是什么從火星來(lái)的new idea,看看在那個(gè)CORBA盛行的年代人們提出的概念,如圖所示CORBA 請(qǐng)求的各個(gè)部分,回頭我們?cè)倥cthrift進(jìn)行對(duì)比一下:

Thrift 基礎(chǔ)架構(gòu)
Thrift是一個(gè)服務(wù)端和客戶端的架構(gòu)體系,從我個(gè)人的感官上來(lái)看Thrift是一個(gè)類(lèi)似XML-RPC+Java-to- IDL+Serialization Tools=Thrift 的東東,Thrift 具有自己內(nèi)部定義的傳輸協(xié)議規(guī)范(TProtocol)和傳輸數(shù)據(jù)標(biāo)準(zhǔn)(TTransports),通過(guò)IDL腳本對(duì)傳輸數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)(struct) 和傳輸數(shù)據(jù)的業(yè)務(wù)邏輯(service)根據(jù)不同的運(yùn)行環(huán)境快速的構(gòu)建相應(yīng)的代碼,并且通過(guò)自己內(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í)行讀寫(xiě)操作的計(jì)算結(jié)果4.TProtocol 5.TTransports 6.底層I/O通信

圖 中前面3個(gè)部分是1.你通過(guò)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容器無(wú)縫的結(jié)合。

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

協(xié)議
Thrift可以讓你選擇客戶端與服務(wù)端之間傳輸通信協(xié)議的類(lèi)別,在傳輸協(xié)議上總體上劃分為文本(text)和二進(jìn)制(binary)傳輸協(xié)議, 為節(jié)約帶寬,提供傳輸效率,一般情況下使用二進(jìn)制類(lèi)型的傳輸協(xié)議為多數(shù),但有時(shí)會(huì)還是會(huì)使用基于文本類(lèi)型的協(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ě)的協(xié)議,適用于通過(guò)腳本語(yǔ)言解析
* TDebugProtocol – 在開(kāi)發(fā)的過(guò)程中幫助開(kāi)發(fā)人員調(diào)試用的,以文本的形式展現(xiàn)方便閱讀。

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

服務(wù)端類(lèi)型
* 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通道。

誰(shuí)在用thrift ?


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


Thrift用于在多種Evernote API平臺(tái)開(kā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ù)能通過(guò)網(wǎng)絡(luò)互相同步。譬如說(shuō),你可以隨時(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ù)端,客戶端通過(guò)thrift的命令生成不同版本的客戶端代碼,根據(jù)定義的數(shù)據(jù)格式,對(duì)遠(yuǎn)程HBase服務(wù)端進(jìn)行 操作,是除了REST遠(yuǎn)程方法調(diào)用的另一種途徑。
參見(jiàn):http://wiki.apache.org/hadoop/Hbase/ThriftApi

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

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

假定需要傳輸相同的內(nèi)容,但使用不同的方式從 1、傳輸內(nèi)容所產(chǎn)生的大小 2、傳輸過(guò)程中服務(wù)端和客戶端所產(chǎn)生的開(kāi)銷(xiāo),這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)行開(kāi)銷(xiāo) 比較結(jié)果如下:

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

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

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

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

一、開(kāi)發(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,通過(guò)ant中的ivy工具會(huì)自動(dòng)從站點(diǎn)下載所需要的依賴包,編譯完成后如圖所示:

3)編譯過(guò)程中下載的依賴包在x:/thrift-0.5.0/lib/java/build/ivy/lib 目錄下可以看見(jiàn)下載的jar依賴包,將編譯成功以后的jar包加入Eclipse的開(kāi)發(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),類(lèi)似你業(yè)務(wù)邏輯中的pojo get/set
1: string topic # 注釋2.2 參數(shù)類(lèi)型可以參見(jiàn) Thrift wiki
2: binary content
3: i64 createdTime
4: string id
5: string ipAddress
6: map<string,string> props
}
service ThriftCase { # 注釋3 代碼生成的類(lèi)名,你的業(yè)務(wù)邏輯代碼需要實(shí)現(xiàn)代碼生成的ThriftCase.Iface接口
i32 testCase1(1:i32 num1, 2:i32 num2, 3:string num3) # 注釋4.1 方法名稱和方法中的入?yún)?,入?yún)㈩?lèi)型參見(jiàn) wiki
list<string> testCase2(1:map<string,string> num1)
void testCase3()
void testCase4(1:list<Blog> blog) # 注釋4.2 list 是thrift中基本數(shù)據(jù)類(lèi)型中的一種,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)通過(guò)Thrift的腳本文件,運(yùn)行 thrift 命令創(chuàng)建生成的代碼,例如:執(zhí)行 thrift -gen java x:/testJava.thrift 命令,在當(dāng)前運(yùn)行的盤(pán)符下,可看見(jiàn)gen-java目錄,在這里目錄中可以看見(jiàn)生成的java代碼,更多thrift 命令內(nèi)容,請(qǐng)參見(jiàn)thrift命令自帶的help。

3.Thrift 中的基本數(shù)據(jù)類(lèi)型 (清單4)
類(lèi)型 描述
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 有序的元素列表,類(lèi)似于STL的vector
set 無(wú)序的不重復(fù)元素集,類(lèi)似于STL的 set
map key-value型的映射,類(lèi)似于STL的map
exception 是一個(gè)繼承于本地語(yǔ)言的exception基類(lèi)
service 服務(wù)。包含多個(gè)函數(shù)接口 ( 純虛函數(shù) )

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


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

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

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

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

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

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

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論