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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

thrift介绍及应用(一)—介绍

發(fā)布時(shí)間:2025/3/11 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 thrift介绍及应用(一)—介绍 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

原文:http://blog.csdn.net/guxch/article/details/12157151

------------------------------------------------------------------------------------

一、概述

? ? ? ? Thrift是Apache下的一個(gè)子項(xiàng)目,最早是Facebook的項(xiàng)目,后來Facebook提供給Apache作為開源項(xiàng)目,在官網(wǎng)上,Thrift被描述為“Scalable Cross-Language Services Implementation”,說的通俗一些,Thrift具有以下特征:
  • 它有自己的跨機(jī)器的通信框架,并提供一套庫。
  • 它是一個(gè)代碼生成器,按照它的規(guī)則,可以生成多種編程語言的通訊過程代碼。
  • ??????? 一般情況下的跨機(jī)器的通信框架都是跨軟件平臺(tái)的(Linux,windows), 而Thrift最特別之處在于它是跨語言的:例如,你可以用幾乎所有流行語言(C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript等等)來實(shí)現(xiàn)通訊過程,這樣做的好處就是你不用為編程語言發(fā)愁,如果服務(wù)器端與客戶端都需要編寫,選擇你最拿手或項(xiàng)目規(guī)定的語言,就可以生成一個(gè)通訊框架;如果編寫一個(gè)服務(wù)器端程序,定義好通訊規(guī)則(在Thrift中是.thrift文件)后,你所采用的服務(wù)器端實(shí)現(xiàn)語言不會(huì)影響到客戶端,以后使用的人可以采用其他編程語言來實(shí)現(xiàn)客戶端。真是件美好的事情!
    ??????? 與Thrift相類似的開源項(xiàng)目是Google的Protocol Buffer(Protobuf),Protobuf目前提供了 C++、Java、Python 三種語言的 API,比Thrift簡單一些,應(yīng)用也不如Thrift廣泛,有評(píng)論說Protobuf寫復(fù)雜的應(yīng)用比較困難。
    ?? ? ?? 目前thrift的版本是0.9.1,以下的討論均以該版為基準(zhǔn),代碼語言以C++為基準(zhǔn)。

    二、Thrift應(yīng)用場(chǎng)景

    ??????? Thrift其實(shí)應(yīng)分成三個(gè)部分,一個(gè)叫做Thrift代碼生成器,一個(gè)叫做Thrift應(yīng)用框架(庫),最后一個(gè)是它生成的代碼。Thrift應(yīng)用的基本流程如下圖所示。

    從上圖,要生成一個(gè)Thrift應(yīng)用,需用以下文件:

  • 一個(gè).thrift文件:該文件是通信接口的定義,最主要的是信息流的格式。
  • 編程語言:這個(gè)無需解釋。
  • Thrift代碼生成器(Thrift compiler,翻譯成代碼生成器似乎更合適):這個(gè)東西是安裝thrift過程中生成的,它可以產(chǎn)生若干符合你約定通信格式的代碼。
  • Thrift應(yīng)用框架庫:這個(gè)東西也是在安裝過程中產(chǎn)生的。
  • 其他第三方支撐庫:對(duì)C++來說,最主要是boost.thread、libevent,log4cxx等,按照運(yùn)行的模式,生成的代碼中可能需用調(diào)用這些庫。
  • 三、Linux下安裝

    ??????? Thrift的安裝包括上面提到生成代碼生成器和應(yīng)用框架庫,網(wǎng)頁(http://thrift.apache.org/docs/install/)描述了安裝依賴項(xiàng),除了gcc及其編譯工具本身外,編譯Thrift最大的依賴就是boost。安裝過程并不復(fù)雜,請(qǐng)參閱相關(guān)網(wǎng)上文章。

    四、Windows下Thrift的使用

    ??????? 將Windows環(huán)境單獨(dú)拿出來討論是因?yàn)橐郧暗腡hrift版本(0.8以前)是不支持Windows的,雖然有些人做了補(bǔ)丁,但看其文檔,相當(dāng)麻煩。0.8開始支持windows,目前官方文檔的描述中還是需要Cygwin這樣的東西。其實(shí)0.9.1已經(jīng)能很好的支持windows了。

    ??????? Thrift compiler的編譯:在\compiler\cpp下有一個(gè)compiler.sln的VS2010的解決方案,它有一個(gè)叫做compiler的VC項(xiàng)目。可惜的是,要編譯compiler,必須flex和bison的支持,這個(gè)可以到http://sourceforge.net/projects/winflexbison/?source=dlp下載,在VC的項(xiàng)目屬性中,修改“生成事件->預(yù)先生成事件”中的命令行為(注意win_flex和win_bison的路徑):

    [plain]?view plaincopy
  • win_flex?-o?"src\\thriftl.cc"src/thriftl.ll??
  • ??
  • win_bison?-y?-o?"src\thrifty.cc"--defines="src/thrifty.hh"?src/thrifty.yy??
  • 再將inttypes.h(網(wǎng)上下載)和thrifty.h(在上級(jí)目錄)拷到src目錄下,編譯即可。上面的步驟也可手工完成,這樣更保險(xiǎn)些(可以參考compiler\cpp\README_Windows.txt,但其中有點(diǎn)小錯(cuò)誤)。

    ??????? Thrift庫的編譯:在“\lib\cpp”目錄,有一個(gè)叫thrift.sln的VS2010的解決方案文件,它包含兩個(gè)VC項(xiàng)目:libthriftnb和libthrift,libthrift依賴于boost,libthriftnb依賴于boost和libevent,在正確設(shè)置好引用庫后(先要編譯生成boost和libevent),可以編譯這兩個(gè)工程,得到兩個(gè)dll,即thrift的應(yīng)用框架庫,在thrift應(yīng)用中,需要使用這個(gè)框架庫。

    五、Thrift基本概念與應(yīng)用

    這一部分很多文章已經(jīng)涉及,本文只是從Thrift的White Paper角度加一些個(gè)人理解與注釋。

    1.Thrift有以下幾個(gè)概念:

    類型系統(tǒng)(typesystem)

    Thrift定義了一套數(shù)據(jù)傳輸描述語言(有點(diǎn)類似IDL),它是“語言中性”的,這個(gè)就是它的類型系統(tǒng)。它分為五種類型(數(shù)據(jù)類型表達(dá)3種,預(yù)定義類/結(jié)構(gòu)1種,接口表達(dá)1種):

    基本類型(basictype),也就是bool、byte、i16、i32、i64、double、string,任何語言都有這些基本類型,比較有意思的是string,它即表達(dá)text,也表達(dá)binary bytes。另一個(gè)特點(diǎn)是整型沒有unsigned,原因比較簡單,因?yàn)橛行┱Z言不支持。

    • 結(jié)構(gòu)類型(struct):就是C語言中的struct,將基本類型組合起來。
    • 容器類型(container):就是集合類型(list/set/map),其中的元素是任何Thrift可識(shí)別的基本、結(jié)構(gòu)、容器類型。【不知道是否有不支持list/set/map的語言,那么Thrift如何處理呢?】
    • 異常類型(exception):從數(shù)據(jù)結(jié)構(gòu)講就是結(jié)構(gòu)類型,可以認(rèn)為是便于異常的處理而單獨(dú)拿出來的、預(yù)定義的、有特殊意義的結(jié)構(gòu)類型。
    • 服務(wù)定義類型(service):這個(gè)類型實(shí)際是用來定義接口的,Thrift代碼生成器會(huì)根據(jù)這個(gè)定義,生成代碼框架。

    傳輸(transport)

    也就是信息的傳輸渠道以及讀寫方式,例如,介質(zhì)可以是socket、shared memory或file,Thrift規(guī)定了一些基本的操作(open/close/isOpen/read/write/flush,對(duì)server,再加上listen/accept)。特別的,針對(duì)Socket方式,有TScoket類,對(duì)file方式,有TFileTransport類,上面類比較底層,還有幾個(gè)實(shí)用的類:TBufferedTransport,TFramedTransport,TMemoryBuffer等。

    ?

    協(xié)議(protocol)

    是對(duì)傳輸協(xié)議的封裝,也就是傳輸采用二進(jìn)制、XML或者text來表示信息,它的功能有兩個(gè):1.雙向的消息隊(duì)列;2.信息的編碼和解碼(也就是對(duì)上面類型的讀/寫)。關(guān)于流式格式,thrift數(shù)據(jù)類型是自我分割的,意思是說,thrift會(huì)自己在數(shù)據(jù)域的分割處插入標(biāo)志,在解碼的時(shí)候,即使沒有數(shù)據(jù)域定義,thrift也能成功分割出各數(shù)據(jù)域。在若干篇文章中,都提到thrift的二進(jìn)制流式編碼有相當(dāng)?shù)男?#xff08;可以配合壓縮),因此首選的協(xié)議應(yīng)該是binary協(xié)議。

    ?

    版本(versioning)

    如果一個(gè)程序分開來開發(fā),那版本問題就是繞不過去的問題。Thrift的版本是通過“field identifiers”來實(shí)現(xiàn)的,每個(gè)結(jié)構(gòu)由其標(biāo)識(shí),結(jié)構(gòu)中的每個(gè)域有其標(biāo)識(shí),這兩個(gè)標(biāo)識(shí)唯一決定了一個(gè)數(shù)據(jù)域。在解碼的時(shí)候,數(shù)據(jù)域的標(biāo)識(shí)被檢查,如果不能識(shí)別,則該數(shù)據(jù)域被拋棄。Thrift也可以通過”Isset”機(jī)制來明確某些域的設(shè)置與否(發(fā)送端用來指明是否設(shè)置,接收端用來檢測(cè)是否設(shè)置)。

    四種情況:

  • 添加了數(shù)據(jù)域, 舊客戶端,新服務(wù)器端:客戶端發(fā)送的數(shù)據(jù)中沒有該域,服務(wù)器端能檢測(cè)出來,可按缺省值處理。
  • 刪除了數(shù)據(jù)域, 舊客戶端,新服務(wù)器端:客戶端發(fā)送的數(shù)據(jù)中有該域,服務(wù)器端忽略該域。
  • 添加了數(shù)據(jù)域, 新客戶端,舊服務(wù)器端:客戶端發(fā)送的數(shù)據(jù)中有該域,服務(wù)器端忽略該域。
  • 刪除了數(shù)據(jù)域, 新客戶端,舊服務(wù)器端:客戶端發(fā)送的數(shù)據(jù)中沒有該域,服務(wù)器端可能不知道如何處理這種情況。
  • ?處理器(processor)

    就是如何將各部分協(xié)調(diào)起來,形成代碼(或用戶代碼的框架)。它有兩個(gè)重要的類:TProcessor和TServer。TProcessor用來實(shí)現(xiàn)RPC調(diào)用,TServer是所有Server類的基類,TServer類主要處理連接和線程,而不管諸如傳輸、編碼等。用戶代碼主要關(guān)注的一是.thrift文件,二就是這個(gè)接口。Thrift為此實(shí)現(xiàn)了TSimpleServer(單線程), TThreadedServer(每連接一個(gè)線程)和 TThreadPoolServer(線程池)等類。

    下圖是thrift生成代碼的基本結(jié)構(gòu)(C++)。


    圖中,ServiceIf是根據(jù)接口文件(.thrift)生成的虛接口類,用戶的具體實(shí)現(xiàn)在ServiceHandler中。各種調(diào)用方式在TServer中實(shí)現(xiàn)。【詳細(xì)的描述見實(shí)例】

    ?

    2.Thrift實(shí)現(xiàn)上的幾個(gè)考慮

    目標(biāo)語言

    雖然有多種選擇,但最常用的(可能也是支持最好的)是C++, Java, and Python。


    生成的結(jié)構(gòu)體

    數(shù)據(jù)域成員都是公有的,沒有set,get之類的東西,雖然建議采用isset,但也可以不用,系統(tǒng)足夠強(qiáng)健來處理類似“FieldNotSetException”之類的問題,因而也沒有涉及該異常。Read和write方面也是公有的,這樣用戶可以在固有的RPC之外來使用它們。

    RPC方法標(biāo)識(shí):實(shí)現(xiàn)RPC時(shí),建立函數(shù)名與函數(shù)指針之間的映射,大致如下(不同的語言表達(dá)方式不同,C++,map):

    std::map<std::string,函數(shù)指針> processMap_;

    這樣加快函數(shù)調(diào)用。


    多線程

    對(duì)C++實(shí)現(xiàn),在開發(fā)過程中,thrift開發(fā)人員研究過boost,ACE中與thread,timer相關(guān)的東西,開發(fā)人員不想引入過多的第三方依賴,因此thrift中只有對(duì)boost::shared_ptr的引用是必須的,但為了跨平臺(tái)或獲得更多的功能,一般情況下,boost中thread,timer及其依賴庫也是需要的。


    ThreadManager和TimerManager

    線程管理類用來管理線程池,定時(shí)器管理類可以定時(shí)觸發(fā)Runnable的對(duì)象,開啟一件事情(可以放到或不放到一個(gè)單獨(dú)線程)。


    NonblockingOperation

    這個(gè)東西需要libevent的支持。


    Compiler(代碼生成器)

    這個(gè)東西是用C++寫的,依賴于lex/yacc。代碼生成分兩步:第一,檢查包含的文件和類型定義文件,生成“解析樹”(the parse tree);第二,將各類型放到解析樹中,根據(jù)解析樹生成代碼。


    TFileTransport

    這個(gè)類(及其繼承類)可以將request消息記入文件,為提高性能,它先緩存記錄,并存入磁盤。記錄文件是分塊的(文件固定大小),采用padding,記錄不能跨塊。



    (未完)


    總結(jié)

    以上是生活随笔為你收集整理的thrift介绍及应用(一)—介绍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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

    主站蜘蛛池模板: 婷婷狠狠爱 | 三级全黄做爰在线观看 | 免费看91视频 | 成人免费毛片网站 | 天天干天天操心 | 岛国色图 | 碰碰色| 欧洲一区二区三区四区 | 久久人人爽人人人人片 | 黄色一级大片免费看 | 99热免费在线观看 | 成人私密视频 | av影院在线 | 日本白嫩的bbw | 日韩不卡毛片 | 日本特级黄色大片 | 亚洲欧洲久久久 | 久久久久久久久久久久久久免费看 | 波多野结衣高清视频 | 一区二区三区不卡在线 | 狠狠操在线播放 | 青青草久久久 | 国产女人18毛片水真多18精品 | 韩国三级久久 | 偷偷操av | 四虎影酷 | 中国av一区二区 | 亚洲视频1 | 午夜精品久久久久久久久久久久久蜜桃 | 婷婷九月| 午夜激情男女 | 国产在线视频不卡 | 9l视频自拍蝌蚪9l视频 | 91精品人妻一区二区三区蜜桃欧美 | 国产又好看的毛片 | 97色吧| 女人扒开双腿让男人捅 | 黄色片女人 | 一区二区三区四区国产 | 国产寡妇亲子伦一区二区三区四区 | 白丝美女被草 | 亚州精品视频 | 极品女神无套呻吟啪啪 | 日韩欧美电影一区二区三区 | 综合天天色| 九九亚洲| 国产美女久久 | 久久久久亚洲av无码专区桃色 | 久久婷婷五月综合色国产香蕉 | 在线看的免费网站 | 成人免费毛片xxx | 日韩麻豆视频 | 精品国产一二三四区 | 亚欧在线 | 日韩欧美三级在线 | 国产一级黄色片子 | 欧美日韩亚洲在线观看 | 97精品一区二区三区 | 真实乱视频国产免费观看 | 亚洲av男人的天堂在线观看 | 成人国产精品久久 | 日韩国产91 | 天天躁日日躁狠狠躁伊人 | 久久久久久国产视频 | 狠狠鲁影院| 肥臀av | 啪啪激情网 | 亚洲美女视频 | 国产精品v亚洲精品v日韩精品 | 中国美女黄色 | 免费在线小视频 | 亚洲视频免费在线 | 精品91久久久久久 | 日韩一区二区三免费高清在线观看 | 亚洲第二色 | 国产91免费在线观看 | 日本网站在线免费观看 | 美女污污网站 | 91在线看黄| 污视频网址在线观看 | 国外av在线| 天海翼中文字幕 | 毛片高清| 中国爆后菊女人的视频 | 美女张开腿让男人操 | 欧美日韩一区二区三区不卡 | 久久久999视频 | 三上悠亚一区二区在线观看 | aa片在线观看视频在线播放 | 国产精品卡一卡二 | 日本a区| 免费的污网站 | 成人无遮挡 | v天堂中文在线 | 久久精品伊人 | av导航在线观看 | 一本久久综合亚洲鲁鲁五月天 | 国产欧美视频在线播放 | 欧美日韩精品在线观看视频 |