Apache Thrift(服務(wù)開發(fā)框架)提供跨語言服務(wù)開發(fā)功能,用戶可以在軟件上使用多種語言開發(fā)你的服務(wù)項(xiàng)目,結(jié)合編輯器就可以輸入代碼內(nèi)容,讓用戶可以設(shè)計(jì)各種編程語言支持的客戶端程序和服務(wù)端程序,有需要的用戶快來統(tǒng)一下載體驗(yàn)吧。
軟件提供很多數(shù)據(jù)類型,提供很多接口類型,滿足大部分程序接入需求,結(jié)合服務(wù)器功能就可以執(zhí)行數(shù)據(jù)傳輸,根據(jù)輸入/輸出協(xié)議創(chuàng)建處理器,特定于服務(wù)的處理器實(shí)現(xiàn)由編譯器生成,為用戶提供更方便的服務(wù)項(xiàng)目編譯方案;Apache Thrift支持的語言還是很多的,C ++,Java,Python等常用的語言都支持,為可擴(kuò)展的跨語言服務(wù)開發(fā)提供更多選擇!
軟件功能
Apache Thrift功能:
界面描述語言-一切都在IDL文件中指定,可以從該文件生成多種語言的綁定。
語言綁定-許多語言和環(huán)境都支持Thrift
C++
C#
Cocoa
D
Delphi
Erlang
Haskell
Java
OCaml
Perl
PHP
Python
Ruby
Smalltalk
~名稱空間-每個(gè)Thrift文件位于其自己的名稱空間中,允許您在多個(gè)Thrift文件中使用相同的標(biāo)識符
語言名稱空間-每個(gè)Thrift文件,您可以指定每種編程語言應(yīng)使用的名稱空間
基本類型-Thrift有少量的基本類型。
常量和枚舉-可以為常量值分配邏輯名稱
結(jié)構(gòu)-使用結(jié)構(gòu)對相關(guān)數(shù)據(jù)進(jìn)行分組。結(jié)構(gòu)可以具有任何類型的字段。
稀疏結(jié)構(gòu)-尚未設(shè)置的可選基本字段和為空的參考字段將不會通過電線發(fā)送
結(jié)構(gòu)演化-通過使用字段的整數(shù)標(biāo)識符來處理字段的添加和刪除,而不會破壞現(xiàn)有的客戶端
容器-您可以使用任何類型的集,列表和映射:基本類型,結(jié)構(gòu)和其他容器。
類型定義-可以給任何類型一個(gè)更好地描述它的名稱
服務(wù)-服務(wù)是一組功能
服務(wù)繼承-子服務(wù)實(shí)現(xiàn)其基本服務(wù)的所有功能,并且可以具有其他功能
異步調(diào)用-可以異步調(diào)用不返回結(jié)果的函數(shù),因此在服務(wù)器完成對請求的處理之前,不會阻塞客戶端。服務(wù)器可以并行/無序執(zhí)行同一客戶端的異步調(diào)用
異常-如果發(fā)生錯(cuò)誤,則函數(shù)可以引發(fā)標(biāo)準(zhǔn)或用戶定義的異常
循環(huán)結(jié)構(gòu)-從0.9.2版開始,Thrift支持包含自身的結(jié)構(gòu)或以后要聲明的其他結(jié)構(gòu)。
非功能
Apache Thrift不支持以下功能:
struct繼承-改用struct組合
多態(tài)-由于沒有繼承,因此也不支持多態(tài)
重載-服務(wù)中的所有方法都必須唯一地命名
異構(gòu)容器-容器中的所有物品都必須是同一類型
空返回-無法直接從函數(shù)返回空。使用包裝器結(jié)構(gòu)或標(biāo)記值代替
軟件特色
Apache Thrift是一個(gè)軟件項(xiàng)目,涉及多種編程語言和用例。我們的目標(biāo)是使跨語言的可靠,高性能的通信和數(shù)據(jù)序列化盡可能高效和無縫。Thrift最初由Facebook開發(fā),于2007年4月開源,并于2008年5月進(jìn)入Apache孵化器。Thrift于2010年10月成為Apache TLP。
Apache Thrift旨在體現(xiàn)以下價(jià)值觀:
簡單性 Thrift代碼簡單易用,沒有不必要的依賴關(guān)系。
透明 節(jié)儉符合所有語言中最常見的習(xí)慣用法。
一致性 生態(tài)位,特定于語言的功能屬于擴(kuò)展,而不是核心庫。
性能 力爭性能第一,優(yōu)雅第二。
軟件優(yōu)勢
1、節(jié)儉的類型
Thrift類型系統(tǒng)旨在使程序員無論使用哪種編程語言,都可以盡可能多地使用本機(jī)類型。此信息基于并且取代了Thrift白皮書中的信息。的節(jié)儉IDL提供了用于產(chǎn)生針對每個(gè)目標(biāo)語言代碼的類型的描述。
2、基本類型
選擇基本類型的目的是簡化和清楚而不是數(shù)量眾多,重點(diǎn)放在所有編程語言中可用的鍵類型上。
bool:布爾值(對或錯(cuò))
字節(jié):8位有符號整數(shù)
i16:16位有符號整數(shù)
i32:32位有符號整數(shù)
i64:64位有符號整數(shù)
double:64位浮點(diǎn)數(shù)
字符串:使用UTF-8編碼編碼的文本字符串
3、結(jié)構(gòu)
節(jié)儉結(jié)構(gòu)定義了一個(gè)公共對象–它們本質(zhì)上等同于OOP語言中的類,但沒有繼承。一個(gè)結(jié)構(gòu)具有一組強(qiáng)類型字段,每個(gè)字段都有一個(gè)唯一的名稱標(biāo)識符。字段可能具有Thrift IDL中描述的各種注釋(數(shù)字字段ID,可選的默認(rèn)值等) 。
4、容器
節(jié)儉容器是強(qiáng)類型的容器,它們映射到大多數(shù)編程語言中的常用容器和常用容器類型。
共有三種容器類型:
列表:元素的有序列表。轉(zhuǎn)換為STL向量,Java ArrayList,腳本語言的本機(jī)數(shù)組等。
放:無序的唯一元素集。轉(zhuǎn)換為STL集,Java HashSet,Python中的集等。注意:PHP不支持集,因此與List相似。
map :嚴(yán)格唯一的鍵到值的映射。轉(zhuǎn)換為STL映射,Java HashMap,PHP關(guān)聯(lián)數(shù)組,Python / Ruby字典等。盡管提供了默認(rèn)值,但類型映射未明確固定。添加了自定義代碼生成器指令,以允許以各種目標(biāo)語言替換自定義類型。
使用說明
例子
Apache Thrift允許您在簡單的定義文件中定義數(shù)據(jù)類型和服務(wù)接口。將該文件作為輸入,編譯器將生成用于輕松構(gòu)建跨編程語言無縫通信的RPC客戶端和服務(wù)器的代碼。您可以直接開始工作,而無需編寫大量的樣板代碼來序列化和傳輸對象并調(diào)用遠(yuǎn)程方法。
以下示例是一個(gè)簡單的服務(wù),用于存儲Web前端的用戶對象。
節(jié)儉定義文件
Python客戶端
Java服務(wù)器
初始化服務(wù)器
節(jié)儉的接口描述語言
對于Thrift版本0.15.0。
Thrift接口定義語言(IDL)允許Thrift Types的定義。Thrift代碼生成器處理Thrift IDL文件以生成用于各種目標(biāo)語言的代碼,以支持IDL文件中定義的結(jié)構(gòu)和服務(wù)。
描述
這是Thrift IDL的描述。
文件
每個(gè)Thrift文檔包含0個(gè)或多個(gè)標(biāo)頭,后跟0個(gè)或多個(gè)定義。
標(biāo)頭
標(biāo)頭可以是Thrift包含,C ++包含或名稱空間聲明。
節(jié)儉包含
包含使來自另一個(gè)文件的所有符號可見(帶有前綴),并將相應(yīng)的包含語句添加到為此Thrift文檔生成的代碼中。
C ++包含
C ++包含將自定義C ++包含添加到此Thrift文檔的C ++代碼生成器的輸出中
命名空間
名稱空間聲明了哪個(gè)名稱空間/程序包/模塊/等。該文件中的類型定義將以目標(biāo)語言聲明。名稱空間范圍指示名稱空間適用的語言。范圍“ *”表示名稱空間適用于所有目標(biāo)語言
定義
常量
typedef
typedef為類型創(chuàng)建備用名稱
枚舉
一個(gè)枚舉創(chuàng)建一個(gè)帶有命名值的枚舉類型。如果沒有提供常量值,則第一個(gè)元素的值為0,或者對于任何后續(xù)元素的值都大于先前的值。提供的任何常量值都必須為非負(fù)數(shù)。
Senum
Senum(和Slist)現(xiàn)在已棄用,均應(yīng)替換為String。
結(jié)構(gòu)
結(jié)構(gòu)是Thrift中的基本組成類型。每個(gè)字段的名稱在結(jié)構(gòu)中必須唯一。
注意:該xsd_all關(guān)鍵字在Facebook內(nèi)部具有某些用途,但在Thrift本身中沒有任何用途。強(qiáng)烈建議不要使用此功能
聯(lián)盟
聯(lián)合與結(jié)構(gòu)相似,不同之處在于,聯(lián)合提供了一種傳輸可能的一組字段中的一個(gè)字段的方法,就像C ++中的union {}一樣。因此,工會成員被隱含地視為可選的(請參閱要求)。
注意:該xsd_all關(guān)鍵字在Facebook內(nèi)部具有某些用途,但在Thrift本身中沒有任何用途。強(qiáng)烈建議不要使用此功能
異常
異常與結(jié)構(gòu)相似,不同之處在于它們旨在與目標(biāo)語言中的本機(jī)異常處理機(jī)制集成。在異常中,每個(gè)字段的名稱必須唯一。
需求的一般規(guī)則如下:
必填
寫入:必填字段始終會被寫入,并且需要設(shè)置。
讀取:必填字段始終被讀取,并且預(yù)期包含在輸入流中。
默認(rèn)值:始終寫入
如果在讀取過程中缺少必填字段,則預(yù)期的行為是向調(diào)用方指示未成功的讀取操作,例如,引發(fā)異常或返回錯(cuò)誤。
由于這種行為,必填字段極大地限制了有關(guān)軟版本控制的選項(xiàng)。因?yàn)楸仨氃谧x取時(shí)顯示它們,所以不能棄用這些字段。如果必填字段將被刪除(或更改為可選字段),則各版本之間的數(shù)據(jù)將不再兼容。
可選
寫入:僅在設(shè)置了可選字段后才寫入它們
讀取:可選字段可能會或可能不會成為輸入流的一部分。
默認(rèn)值:在設(shè)置了isset標(biāo)志時(shí)寫入
大多數(shù)語言實(shí)現(xiàn)都使用推薦的所謂“ isset”標(biāo)志的做法來指示是否設(shè)置了特定的可選字段。僅寫入設(shè)置了此標(biāo)志的字段,相反,僅當(dāng)從輸入流中讀取了字段值時(shí),才設(shè)置該標(biāo)志。
默認(rèn)要求(隱式)
寫:理論上,字段總是寫的。該規(guī)則有一些例外,請參見下文。
讀取:與可選字段一樣,該字段可以或可以不屬于輸入流。
默認(rèn)值:可能無法寫入(請參閱下一節(jié))
默認(rèn)要求是一個(gè)很好的起點(diǎn)。所需的行為是可選的和必需的,因此內(nèi)部名稱為“選擇加入,要求退出”。盡管從理論上講這些字段應(yīng)該被寫入(“ req-out”),但實(shí)際上未設(shè)置的字段并不總是被寫入。當(dāng)字段包含一個(gè)價(jià)值,顧名思義是不能通過節(jié)儉運(yùn)輸?shù)摹?shí)現(xiàn)此目的的唯一方法是根本不編寫該字段,而這正是大多數(shù)語言所做的。
默認(rèn)值的語義
有關(guān)該主題的討論正在進(jìn)行中,有關(guān)詳細(xì)信息,請參見JIRA。并非所有實(shí)現(xiàn)都以完全相同的方式對待默認(rèn)值,但是當(dāng)前狀態(tài)或多或少地是通常在初始化時(shí)設(shè)置默認(rèn)字段。因此,可能無法寫入等于默認(rèn)值的值,因?yàn)樽x取端將隱式設(shè)置該值。另一方面,無論如何,實(shí)現(xiàn)都可以自由寫入默認(rèn)值,因?yàn)闆]有嚴(yán)格的限制可以防止這種情況發(fā)生。
這里要記住的主要事實(shí)是,任何未寫入的默認(rèn)值都隱式地成為接口版本的一部分。如果更改了默認(rèn)設(shè)置,則界面也會更改。相反,如果將默認(rèn)值寫入輸出數(shù)據(jù),則IDL中的默認(rèn)值可以隨時(shí)更改而不會影響序列化數(shù)據(jù)。
節(jié)儉的網(wǎng)絡(luò)堆棧
Apache Thrift網(wǎng)絡(luò)堆棧的簡單表示
運(yùn)輸
傳輸層為從網(wǎng)絡(luò)讀取/向網(wǎng)絡(luò)寫入提供了簡單的抽象。這使Thrift可以將基礎(chǔ)傳輸與系統(tǒng)的其余部分解耦(例如,序列化/反序列化)。
以下是傳輸接口公開的一些方法:
打開
關(guān)閉
讀
寫
齊平
除了上面的傳輸接口之外,Thrift還使用ServerTransport接口來接受或創(chuàng)建原始傳輸對象。顧名思義,ServerTransport主要用于服務(wù)器端,為傳入的連接創(chuàng)建新的傳輸對象。
打開
聽
接受
關(guān)閉
以下是大多數(shù)Thrift支持的語言可用的傳輸方式:
文件:對磁盤上的文件進(jìn)行讀/寫操作
http:顧名思義
協(xié)議
協(xié)議抽象定義了一種將內(nèi)存中的數(shù)據(jù)結(jié)構(gòu)映射為有線格式的機(jī)制。換句話說,協(xié)議指定數(shù)據(jù)類型如何使用基礎(chǔ)傳輸來對其自身進(jìn)行編碼/解碼。因此,協(xié)議實(shí)現(xiàn)控制編碼方案,并負(fù)責(zé)(反序列化)。從這個(gè)意義上來說,協(xié)議的一些示例包括JSON,XML,純文本,緊湊二進(jìn)制等。
這是協(xié)議接口:
節(jié)儉協(xié)議通過設(shè)計(jì)面向流。不需要任何明確的框架。例如,在開始序列化字符串之前,不必知道字符串的長度或列表中的項(xiàng)目數(shù)。大多數(shù)受Thrift支持的語言可用的一些協(xié)議是:
二進(jìn)制:非常簡單的二進(jìn)制編碼–字段的長度和類型被編碼為字節(jié),然后是字段的實(shí)際值。
緊湊:描述于THRIFT-110
json
處理器
處理器封裝了從輸入流讀取數(shù)據(jù)并寫入輸出流的功能。輸入和輸出流由協(xié)議對象表示。處理器界面非常簡單
特定于服務(wù)的處理器實(shí)現(xiàn)由編譯器生成。處理器本質(zhì)上是從線路讀取數(shù)據(jù)(使用輸入?yún)f(xié)議),將處理委托給處理程序(由用戶實(shí)現(xiàn)),并通過線路寫入響應(yīng)(使用輸出協(xié)議)。
服務(wù)器
服務(wù)器將上述所有各種功能匯總在一起:
創(chuàng)建運(yùn)輸
創(chuàng)建用于傳輸?shù)妮斎?輸出協(xié)議
根據(jù)輸入/輸出協(xié)議創(chuàng)建處理器
等待傳入的連接并將其交給處理器