Apache Thrift 是一種支援多種程式設計語言的遠端服務調用架構,由 Facebook 于 2007 年開發,并于 2008 年進入 Apache 開源項目管理。Apache Thrift 通過 IDL 來定義 RPC 的接口和資料類型,然後通過代碼生成工具來生成針對不同程式設計語言的代碼,目前支援 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, OCaml, Delphi 等。
本文将從 C# 開發人員的角度介紹基于 Apache Thrift 的服務開發過程。

傳輸層提供對網絡 I/O 的抽象,通過 Transport 對用戶端進行抽象,ServerTransport 對服務端進行抽象。
TTransport
TBufferedTransport
TFramedTransport
TStreamTransport
TSocket
TTLSSocket
THttpClient
TMemoryBuffer
TNamedPipeClientTransport
TServerTransport
TServerSocket
TTLSServerSocket
TNamedPipeServerTransport
其實,看一眼 TSocket 的源代碼就可以了解事情的真相了。
<a></a>
協定層抽象了資料結構的定義,描述了如何組織資料以進行傳輸,包括 Encode 和 Decode 資料處理。是以,協定層負責實作資料的序列化和反序列化機制,例如序列化 Json, XML, Plain Text, Binary, Compact Binary 等。
協定層抽象了大量的讀寫操作接口,以供擴充。
Processor 封裝了對輸入輸出流的讀寫操作,輸入輸出流也就代表着協定層處理的對象。Processor 接口定義的極其簡單。
Server 将所有功能整合到一起:
建立一個 Transport;
建立 Transport 使用的 I/O Protocol;
為 I/O Protocol 建立 Processor;
啟動服務,等待用戶端的連接配接;
通過抽象 TServer 類來提供上述整合。
TServer
TSimpleServer -- Simple single-threaded server for testing.
TThreadedServer -- Server that uses C# threads (as opposed to the ThreadPool) when handling requests.
TThreadPoolServer -- Server that uses C# built-in ThreadPool to spawn threads when handling requests.
使用 Thrift 的過程:
編寫類似于結構體的消息格式定義,使用類似于 IDL 的語言定義。
使用代碼生成工具,生成目智語言代碼。
在程式中直接使用這些代碼。
這裡我們從一個簡單的 Thrift 執行個體開始,對 Thrift 服務的建構進行直覺的展示。建立一個簡單的 CalculatorService,通過 Calculate 接口來支援 "+ - x /" 簡單的計算。Thrift 檔案名為 calculator.thrift。
上面的 calculator.thrift 執行個體中,
namespace 定義針對不同程式設計語言的名空間或者包;
enum 定義了 Calculate 需要支援的枚舉類型;
exception 定義了 Calculate 中可能發生的異常類型;
service 定義了 CalculatorService 服務接口;
Apache Thrift 與 Google Protocol Buffers 的另一個不同點就是,Apache Thrift 支援對 Exception 的定義,使得在定義服務和實作服務接口時可以友善的處理服務端異常。
在指令行使用 Thrift 代碼生成工具為 C# 程式設計語言生成代碼:
代碼生成工具根據 calculator.thrift 中的定義會生成 3 個 C# 代碼檔案:
CalculatorService.cs
DivideByZeroException.cs
Operation.cs
有了這些生成的代碼檔案,就可以設計服務端和用戶端代碼了。這裡,建立 3 個 solution 檔案:
Contracts:存放生成的代碼檔案,共享給 Server 和 Client;
Server:實作服務端代碼,為用戶端提供服務;
Client:實作用戶端代碼,調用服務端;
由于在 calculator.thrift 檔案中定義了 C# 的名空間:
是以生成的代碼的 namespace 即為 Contracts。
相應的,在 CalculatorService 檔案中也生成了名為 Iface 的接口定義,也就是 Server 端需要為 Client 端實作的接口。
為了實作 CalculatorService,需要實作一個 CalculatorServiceHandler 類來實作生成的 Contracts 中的 CalculatorService.Iface 接口。
上面代碼中的 Operation.Divide 段,判斷了當除數為 0 時将抛出 Contracts.DivideByZeroException 異常。
然後,需要啟動 Server 來提供 CalculatorService 服務。将 CalculatorServiceHandler 類的執行個體傳遞給 CalculatorService.Processor 的構造函數,指定 Socket 綁定端口 8888,然後啟動服務。
Client 端消費 Server 端的代碼更加簡單,基本上 Thrift 都已提供了預設的實作,需要做的就是指定位址、端口和協定。
然後,就可以啟動 Server 端和 Client 端程式,實作簡單的服務調用了。
本文轉自匠心十年部落格園部落格,原文連結:http://www.cnblogs.com/gaochundong/p/apache_thrift.html,如需轉載請自行聯系原作者