架構(gòu)圖



Thrift組件
- TTransport 傳輸組件
- TProtocol 協(xié)議和編解碼組件
- TProcessor 服務(wù)調(diào)用組件
- TServer,Client 服務(wù)器和客戶端組件
- IDL 服務(wù)描述組件,負(fù)責(zé)生產(chǎn)跨平臺(tái)客戶端
IDL組件
namespace java com.thrift.test
struct Parameter{
1: required i32 id;
2: required string name;
}
service DemoService{
i32 demoMethod(1:string param1, 2:Parameter param2, 3:map<string,string> param3);
}
執(zhí)行命令
thrift -r --gen java demo.thrift
生成結(jié)果

- 接口類型,默認(rèn)名稱都是Iface。這個(gè)接口類型被服務(wù)器和客戶端共同使用。
自動(dòng)生成的接口有兩個(gè),一個(gè)是同步調(diào)用的Iface,一個(gè)是異步調(diào)用的AsyncIface。異步調(diào)用的接口多了一個(gè)回調(diào)參數(shù)。 - 客戶端類型,一個(gè)同步調(diào)用Client,一個(gè)異步調(diào)用AsyncClient
- Processor,用來(lái)支持方法調(diào)用,每個(gè)服務(wù)的實(shí)現(xiàn)類都要使用Processor來(lái)注冊(cè),這樣最后服務(wù)器端調(diào)用接口實(shí)現(xiàn)時(shí)能定位到具體的實(shí)現(xiàn)類。
4.方法參數(shù)的封裝類,以"方法名_args"命名。
5.方法返回值的封裝類,以"方法名_result"命名。
TProcessor組件
TProcessor負(fù)責(zé)對(duì)Client的請(qǐng)求做出相應(yīng),包括RPC請(qǐng)求轉(zhuǎn)發(fā),調(diào)用參數(shù)解析和用戶邏輯調(diào)用,返回值寫(xiě)回等處理步驟。Processor是服務(wù)器端從Thrift框架轉(zhuǎn)入用戶邏輯的關(guān)鍵流程。Processor同時(shí)也負(fù)責(zé)向Message結(jié)構(gòu)中寫(xiě)入數(shù)據(jù)或者讀出數(shù)據(jù)。

TProtocol組件
TProtocol負(fù)責(zé)把TTransport中的字節(jié)流轉(zhuǎn)化為數(shù)據(jù)流,并定義了具體的轉(zhuǎn)換格式。TProtocol主要做兩件事: 1) 雙向有序的消息傳遞; 2) 基本類型、容器及結(jié)構(gòu)體的編碼。
- TBinaryProtocol:二進(jìn)制格式
- TCompactProtocol: 高效率的、密集的二進(jìn)制編碼格式
- TJSONProtocol:使用JSON的數(shù)據(jù)編碼協(xié)議進(jìn)行數(shù)據(jù)傳輸
- TSimpleJSONProtocol:提供JSON只寫(xiě)協(xié)議,生成的文件很容易通過(guò)腳本語(yǔ)言解析
- TDebugProtocol:使用易懂的可讀的文本格式,以便于debug
TTransport組件
TTransport是與底層數(shù)據(jù)傳輸緊密相關(guān)的傳輸層。每一種支持的底層傳輸方式都存在一個(gè)與之對(duì)應(yīng)的TTransport。在TTransport這一層,數(shù)據(jù)是按字節(jié)流(Byte Stream)方式處理的,即傳輸層看到的是一個(gè)又一個(gè)的字節(jié),并把這些字節(jié)按照順序發(fā)送和接收。TTransport并不了解它所傳輸?shù)臄?shù)據(jù)是什么類型,實(shí)際上傳輸層也不關(guān)心數(shù)據(jù)是什么類型,只需要按照字節(jié)方式對(duì)數(shù)據(jù)進(jìn)行發(fā)送和接收即可。數(shù)據(jù)類型的解析在TProtocol這一層完成。
- TSocket:使用阻塞的TCP Socket進(jìn)行數(shù)據(jù)傳輸,也是最常見(jiàn)的模式
- THttpTransport:采用Http傳輸協(xié)議進(jìn)行數(shù)據(jù)傳輸
- TFileTransport:文件(日志)傳輸類,允許client將文件傳給server,允許server將收到的數(shù)據(jù)寫(xiě)到文件中
-
TZlibTransport:與其他的TTransport配合使用,壓縮后對(duì)數(shù)據(jù)進(jìn)行傳輸,或者將收到的數(shù)據(jù)解壓
下面幾個(gè)類主要是對(duì)上面幾個(gè)類地裝飾(采用了裝飾模式),以提高傳輸效率。 - TBufferedTransport:對(duì)某個(gè)Transport對(duì)象操作的數(shù)據(jù)進(jìn)行buffer,即從buffer中讀取數(shù)據(jù)進(jìn)行傳輸,或者將數(shù)據(jù)直接寫(xiě)入buffer
- TFramedTransport:同TBufferedTransport類似,也會(huì)對(duì)相關(guān)數(shù)據(jù)進(jìn)行buffer,同時(shí),它支持定長(zhǎng)數(shù)據(jù)發(fā)送和接收(按塊的大小,進(jìn)行傳輸)。
- TMemoryBuffer:從一個(gè)緩沖區(qū)中讀寫(xiě)數(shù)據(jù)。
TServer組件
TServer在Thrift框架中的主要任務(wù)是接收Client的請(qǐng)求,并轉(zhuǎn)到某個(gè)TProcessor上進(jìn)行請(qǐng)求處理。針對(duì)不同的訪問(wèn)規(guī)模,Thrift提供了不同的TServer模型。Thrift目前支持的Server模型包括:
- TSimpleServer:使用阻塞IO的單線程服務(wù)器,循環(huán)監(jiān)聽(tīng)新請(qǐng)求的到來(lái)并完成對(duì)請(qǐng)求的處理,主要用于調(diào)試。
- TThreadPoolServer:通過(guò)線程池的方式來(lái)處理請(qǐng)求,線程池使用了SynchronousQueue同步隊(duì)列,主線程一直循環(huán)接收請(qǐng)求,接收到請(qǐng)求時(shí)將請(qǐng)求封裝為WorkerProcess拋給線程池來(lái)處理。
- TNonblockingServer:?jiǎn)尉€程非阻塞的模式,借助Channel/Selector機(jī)制。所有的socket都會(huì)被注冊(cè)到selector上,在一個(gè)線程循環(huán)監(jiān)控所有的socket。每次selector完成一次select,就會(huì)將已就緒的socket取出來(lái)進(jìn)行處理。
-
THsHaServer:繼承了TNonBlockingServer,并通過(guò)線程池來(lái)提高任務(wù)處理的并發(fā)能力。THsHaServer是半同步半異步的處理模式,Half-Sync用于IO事件處理(Accept/Read/Write),Half-Async用于業(yè)務(wù)handler對(duì)rpc的同步處理上。
半同步:通過(guò)SelectAcceptThread線程同步輪詢IO就緒事件,調(diào)用就緒的channel來(lái)accept,read,write事件。
半異步:將上述事件的調(diào)用封裝成一個(gè)Runnale交給線程池執(zhí)行,而同步輪詢的SelectAcceptThread線程中直接返回進(jìn)行下一輪輪詢。 -
TThreadedSelectorServer:是目前Thrift提供的最高級(jí)的模式,它內(nèi)部有如果幾個(gè)部分構(gòu)成:
- 一個(gè)AcceptThread線程對(duì)象,專門用于處理監(jiān)聽(tīng)socket上的新連接;
- 若干個(gè)SelectorThread對(duì)象專門用于處理業(yè)務(wù)socket的網(wǎng)絡(luò)I/O操作,所有網(wǎng)絡(luò)數(shù)據(jù)的讀寫(xiě)均是有這些線程來(lái)完成;
- 一個(gè)負(fù)載均衡器SelectorThreadLoadBalancer對(duì)象,主要用于AcceptThread線程接收到一個(gè)新socket連接請(qǐng)求時(shí),決定將這個(gè)新連接請(qǐng)求分配給哪個(gè)SelectorThread線程。
- 一個(gè)ExecutorService類型的工作線程池,在SelectorThread線程中,監(jiān)聽(tīng)到有業(yè)務(wù)socket中有調(diào)用請(qǐng)求過(guò)來(lái),則將請(qǐng)求讀取之后,交個(gè)ExecutorService線程池中的線程完成此次調(diào)用的具體執(zhí)行。
TServer對(duì)象通常如下工作:
- 使用TServerTransport獲得一個(gè)TTransport
- 使用TTransportFactory,可選地將原始傳輸轉(zhuǎn)換為一個(gè)適合的應(yīng)用傳輸(典型的是使用TBufferedTransportFactory)
- 使用TProtocolFactory,為TTransport創(chuàng)建一個(gè)輸入和輸出
- 調(diào)用TProcessor對(duì)象的process()方法