Apache Thrift 是一個輕量級、跨語言的 RPC 框架,最初由 Facebook 開發,後捐贈 Apache 基金會。它透過介面定義語言(IDL)描述服務介面與資料結構,利用代碼生成引擎產生多種程式語言的客戶端/伺服器端存根,實現 C++、Java、Python、Go、PHP、Node.js 等 20+ 語言間的無縫互通。
+------------------+ | Service Layer | <- 用戶實作的業務邏輯(Processor) +------------------+ | Processor | <- 生成的處理器,解析請求、調用業務、序列化回應 +------------------+ | Protocol | <- 序列化協議:Binary、Compact、JSON、SimpleJSON 等 +------------------+ | Transport | <- 傳輸層:Socket、HTTP、Framed、Non-blocking、SSL 等 +------------------+ | Server | <- 伺服器模型:Simple、ThreadPool、Nonblocking、HsHa、ThreadedSelector +------------------+
namespace java com.example.thrift
struct User {
1: i64 id,
2: string name,
3: i32 age
}
service UserService {
User getUser(1: i64 id),
void saveUser(1: User user)
}
thrift -r --gen java user.thrift # 生成 gen-java 目錄,包含 User、UserService.Iface、UserService.Processor 等
UserService.Iface 介面(業務邏輯)。TProcessor(new UserService.Processor(handler))。TServerTransport(如 TServerSocket(port))。TProtocolFactory(如 TBinaryProtocol.Factory())。// 簡單單執行緒測試用
TServer server = new TSimpleServer(new TServer.Args(serverTransport).processor(processor).protocolFactory(protocolFactory));
// 生產推薦:非阻塞 + 執行緒池
TNonblockingServerTransport nbTransport = new TNonblockingServerSocket(port);
THsHaServer.Args args = new THsHaServer.Args(nbTransport)
.processor(processor)
.protocolFactory(protocolFactory)
.workerThreads(16);
TServer server = new THsHaServer(args);
server.serve();
TTransport(TSocket(host, port) 或 TFramedTransport)。TProtocol(TBinaryProtocol(transport))。new UserService.Client(protocol))。transport.open(),呼叫 Client 方法,最後 transport.close()。| 協議 | 特點 | 適用場景 |
|---|---|---|
| TBinaryProtocol | 二進制、簡單、效率中等 | 一般 RPC、除錯方便 |
| TCompactProtocol | 壓縮格式、體積小、CPU 稍高 | 頻寬敏感、移動端 |
| TJSONProtocol | JSON 可讀、體積大 | Web 前端直連、除錯 |