天天看點

Apache Thrift 跨語言服務開發架構

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 的服務開發過程。

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 的語言定義。

使用代碼生成工具,生成目智語言代碼。

在程式中直接使用這些代碼。

Apache Thrift 跨語言服務開發架構

這裡我們從一個簡單的 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:實作用戶端代碼,調用服務端;

Apache Thrift 跨語言服務開發架構

由于在 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,如需轉載請自行聯系原作者