thrift介紹及應用(一)—介紹

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

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

一、概述

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

二、Thrift應用場景

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

從上圖,要生成一個Thrift應用,需用以下文件:

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

三、Linux下安裝

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

四、Windows下Thrift的使用

??????? 將Windows環境單獨拿出來討論是因為以前的Thrift版本(0.8以前)是不支持Windows的,雖然有些人做了補丁,但看其文檔,相當麻煩。0.8開始支持windows,目前官方文檔的描述中還是需要Cygwin這樣的東西。其實0.9.1已經能很好的支持windows了。

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

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

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

五、Thrift基本概念與應用

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

1.Thrift有以下幾個概念:

類型系統(typesystem)

Thrift定義了一套數據傳輸描述語言(有點類似IDL),它是“語言中性”的,這個就是它的類型系統。它分為五種類型(數據類型表達3種,預定義類/結構1種,接口表達1種):

基本類型(basictype),也就是bool、byte、i16、i32、i64、double、string,任何語言都有這些基本類型,比較有意思的是string,它即表達text,也表達binary bytes。另一個特點是整型沒有unsigned,原因比較簡單,因為有些語言不支持。

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

傳輸(transport)

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

?

協議(protocol)

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

?

版本(versioning)

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

四種情況:

  1. 添加了數據域, 舊客戶端,新服務器端:客戶端發送的數據中沒有該域,服務器端能檢測出來,可按缺省值處理。
  2. 刪除了數據域, 舊客戶端,新服務器端:客戶端發送的數據中有該域,服務器端忽略該域。
  3. 添加了數據域, 新客戶端,舊服務器端:客戶端發送的數據中有該域,服務器端忽略該域。
  4. 刪除了數據域, 新客戶端,舊服務器端:客戶端發送的數據中沒有該域,服務器端可能不知道如何處理這種情況。

?處理器(processor)

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

下圖是thrift生成代碼的基本結構(C++)。


圖中,ServiceIf是根據接口文件(.thrift)生成的虛接口類,用戶的具體實現在ServiceHandler中。各種調用方式在TServer中實現。【詳細的描述見實例】

?

2.Thrift實現上的幾個考慮

目標語言

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


生成的結構體

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

RPC方法標識:實現RPC時,建立函數名與函數指針之間的映射,大致如下(不同的語言表達方式不同,C++,map):

std::map<std::string,函數指針> processMap_;

這樣加快函數調用。


多線程

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


ThreadManager和TimerManager

線程管理類用來管理線程池,定時器管理類可以定時觸發Runnable的對象,開啟一件事情(可以放到或不放到一個單獨線程)。


NonblockingOperation

這個東西需要libevent的支持。


Compiler(代碼生成器)

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


TFileTransport

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



(未完)


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/539275.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/539275.shtml
英文地址,請注明出處:http://en.pswp.cn/news/539275.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

matlab雙目相機標定校正_基于雙目視覺的無人機避障算法(一)

講述在10月到12月所做的所有工作對于一個無人機自主避障來說&#xff0c;存在著以下流程&#xff1a;感知&#xff1a;障礙物檢測、行人檢測、目標檢測SLAM&#xff1a;為無人機提供位置估計&#xff0c;構建稀疏環境地圖路徑規劃&#xff1a;規劃一條從當前位置到目標位置的移…

計算機無法播放,如果無法播放計算機mp4文件怎么辦?

FireStar365接受1. 下載并安裝最新版本的視頻播放器(例如: Storm Video).2. 在硬盤中找到MP4視頻文件.3. 右鍵單擊該文件&#xff0c;然后選擇打開方法“ Storm Video”.4. 可以雙擊打開頁面.zxc942128835將mp4鏈接到計算機&#xff0c;打開磁盤&#xff0c;單擊菜單欄上的工具…

thrift介紹及應用(二)—簡單應用

原文&#xff1a;http://blog.csdn.net/guxch/article/details/12162131 ----------------------------------------------------------------------------------- 【接上文“thrift介紹及應用&#xff08;一&#xff09;—介紹”】 六、一個最簡單的實例 Thrift文件&#xf…

打游戲的教育意義

夜色已深&#xff0c;一個男孩子還在打游戲。門忽然開了&#xff0c;媽媽走了進來&#xff0c;她把一碗陽春面擺在桌子上。說&#xff1a;"歇息一會兒&#xff0c;趁熱把這碗面吃了吧。"孩子嗯了一聲&#xff0c;眼睛沒有離開屏幕。媽媽生怕打攪孩子&#xff0c;悄悄…

python快速編程入門課本第六章_python編程快速上手第六章實踐項目參考code

代碼如下&#xff1a; 題目的意思是通過一個函數將列表的列表顯示在組織良好的表格中&#xff0c;每列右對齊 tableData [[apples, oranges, cherries, banana], [Alice, Bob, Carol, David], [dogs, cats, moose, goose]]apples Alice dogs oranges Bob cats cherries Carol …

計算機硬件配置組件,配置vcenter server的硬件(默認指windows版本的)

一般來說vcenter的硬件需求與它管理的主機和VM有直接關系1. vcenter server的最低硬件配置Two 64-bit CPUs or a single dual-core 64-bit CPU.2 GHz processor or faster.4 GB of RAM or more.4 GB of free disk space.A network adapter (Gigabit Ethernet strongly recommen…

標準評分卡分數計算原理_評分卡的形式、刻度及應用場景

&#xfeff; 看到有伙伴提問&#xff1a;①我們的評分卡做好后&#xff0c;后續的使用策略是什么呀&#xff0c;都有哪些方向&#xff1f; ②評分卡分數切割點如何定&#xff0c;制定的業務邏輯是什么&#xff1f;其實&#xff0c;這個問題不好回答&#xff0c;也好回答。一方…

hexeditor 復制二進制值_MySQL復制全解析 Part 6 MySQL GTID 生命周期

實驗環境此次實驗的環境如下MySQL 5.7.25Redhat 6.10操作系統賬號:mysql數據庫復制賬號:repl復制格式:基于行的復制通過前面的介紹我們知道MySQL的復制有兩種方法基于二進制日志文件位置基于GTID上一節的內容為GTID的格式和存儲&#xff0c;這節根據官方文檔我們說GTID的生命周…

Thrift介紹與應用(三)—hbase的thrift接口

原文&#xff1a;http://blog.csdn.net/guxch/article/details/12163047 ----------------------------------------------------------------------------------- 一、概述 Hbase是目前比較火的列存儲數據庫&#xff0c;由于Hbase是用Java寫的&#xff0c;因此它原生地提供了…

Linux/Unix 新手和專家教程

你正在找一些高質量的Linux 和 UNIX 的教程嗎&#xff1f;如果是&#xff0c;這篇文章會告訴你到哪去找到這些教程。這里我們將給出超過30個相當的不錯的 Linux 和 UNIX 在線的教程。 需要大家注意的是&#xff0c;他們都是英文的&#xff0c;也許有一些也經被翻譯到了中文社區…

自動ip的計算機共享打印,局域網內自動獲取ip地址怎么設置打印機共享文件夾...

在局域網環境中,為了盡可能地節省辦公成本,很多用戶都會選擇在局域網中架設、部署共享打印機,以便在單位的任何角落處都能方便、自如地進行打印操作。下面是學習啦小編為大家整理的關于局域網內自動獲取ip地址怎么設置打印機共享文件夾&#xff0c;一起來看看吧!局域網內自動獲…

高級數據分析1代碼_用Python進行數據分析,讓你一看就會

本書詳細介紹利用Python進行操作、處理、清洗和規整數據等方面的具體細節和基本要點。雖然本書的標題是“數據分析”&#xff0c;重點卻是Python編程、庫&#xff0c;以及用于數據分析的工具。第1章 準備工作第2章 Python語法基礎&#xff0c;IPython和Jupyter Notebooks第3章 …

工期日歷天計算器_天津實地告訴你:房建項目是怎樣保節點,搶工期的?

工程概況天津實地薔薇花園住宅地塊項目共計由24棟單體住宅、2棟配建及地下人防車庫組成&#xff0c;其中12層小高層4棟、13層小高層1棟、19棟7層洋房。總建建筑面積為139348.62㎡&#xff0c;地上99348㎡&#xff0c;地下40000㎡&#xff0c;人防面積為14236㎡。工期目標項目施…

thrift介紹及應用(四)—hadoop的thrift接口

原文&#xff1a;http://blog.csdn.net/guxch/article/details/12163519 ----------------------------------------------------------------------------------- 一、概述 hadoop是目前使用比較多的分布式文件系統&#xff0c;由于hadoop是用Java寫的&#xff0c;對非Java程…

遲到的年度總結,我們應該收放自如

現在已經2018年3月了&#xff0c;這篇2017的年度總結顯得晚了一點&#xff0c;但意義非凡&#xff0c;讓我有了更多的反省和思考&#xff0c;我相信大家讀完一定會有收獲。好了&#xff0c;廢話不多說進入主題。別用學習來逃避成長這話說的簡直是屁話&#xff0c;不是學習才會成…

測試fps游戲反應速度軟件,FPS反應速度提速

靜謐無聲&#xff0c;生死一瞬&#xff0c;說的就是FPS游戲&#xff0c;沒有哪一個種類的游戲可以比擬我們FPS玩家對于反應速度的追求&#xff0c;更快更準哪怕提速只是1毫秒&#xff0c;無數高手之所以為高手就是因為他們可以打出我們看起來不可能完成的擊殺&#xff0c;特別是…

html5中單選框被選中把值傳給后臺_HTML5的表單設計

使用過Delphi的程序員&#xff0c;對Form這個詞應該比較熟悉。在Delphi中&#xff0c;Form被翻譯為“界面、窗口”&#xff0c;作用是&#xff1a;為用戶提供界面&#xff0c;供用戶輸入信息&#xff0c;向用戶展示處理結果。HTML5中也有Form&#xff0c;功能與Delphi中的Form差…

python科赫曲線繪制正方形_Python數據處理從零開始----第四章(可視化)(14)使用seaborn繪制熱圖...

目錄 Python數據處理從零開始----第四章&#xff08;可視化&#xff09;①③多變量繪圖 Python數據處理從零開始----第四章&#xff08;可視化&#xff09;&#xff08;14&#xff09;使用seaborn繪制熱圖 seaborn.heatmapHeat maps顯示數字表格數據&#xff0c;其中單元格根據…

Hive的系統架構

一、架構圖 二、各組件 用戶接口&#xff1a;包括 CLI&#xff08;控制臺命令&#xff09;&#xff0c;JDBC/ODBC&#xff0c;WebUI。 CLI&#xff0c;即Shell命令行 JDBC/ODBC 是 Hive 的Java&#xff0c;與使用傳統數據庫JDBC的方式類似 WebGUI是通過瀏覽器訪問 Hive --…

8266獲取網絡時間

8266獲取網絡時間 今天第一次用阿里的博客寫點東西感受一下....sntp.sync("ntp1.aliyun.com",function()print("sync succeeded")end,function(index)print("failed : "..index)end)用的SNTP 然后打印時間 time rtctime.epoch2cal(rtctime.get(…