Thrift學(xué)習(xí)

架構(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é)果


  1. 接口類型,默認(rèn)名稱都是Iface。這個(gè)接口類型被服務(wù)器和客戶端共同使用。
    自動(dòng)生成的接口有兩個(gè),一個(gè)是同步調(diào)用的Iface,一個(gè)是異步調(diào)用的AsyncIface。異步調(diào)用的接口多了一個(gè)回調(diào)參數(shù)。
  2. 客戶端類型,一個(gè)同步調(diào)用Client,一個(gè)異步調(diào)用AsyncClient
  3. 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)成:
    1. 一個(gè)AcceptThread線程對(duì)象,專門用于處理監(jiān)聽(tīng)socket上的新連接;
    2. 若干個(gè)SelectorThread對(duì)象專門用于處理業(yè)務(wù)socket的網(wǎng)絡(luò)I/O操作,所有網(wǎng)絡(luò)數(shù)據(jù)的讀寫(xiě)均是有這些線程來(lái)完成;
    3. 一個(gè)負(fù)載均衡器SelectorThreadLoadBalancer對(duì)象,主要用于AcceptThread線程接收到一個(gè)新socket連接請(qǐng)求時(shí),決定將這個(gè)新連接請(qǐng)求分配給哪個(gè)SelectorThread線程。
    4. 一個(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ì)象通常如下工作:

  1. 使用TServerTransport獲得一個(gè)TTransport
  2. 使用TTransportFactory,可選地將原始傳輸轉(zhuǎn)換為一個(gè)適合的應(yīng)用傳輸(典型的是使用TBufferedTransportFactory)
  3. 使用TProtocolFactory,為TTransport創(chuàng)建一個(gè)輸入和輸出
  4. 調(diào)用TProcessor對(duì)象的process()方法

參考

Thrift源碼分析系列
Thrift由淺入深
Thrift RPC詳
Thrift TServer模型

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Thrift源碼剖析 Thrift源碼分析及一個(gè)完整的例子 CSDN Thrift源碼分析 Thrift二進(jìn)制序列...
    無(wú)善無(wú)惡閱讀 1,607評(píng)論 0 1
  • 簡(jiǎn)介 thrift是一個(gè)軟件框架,用來(lái)進(jìn)行可擴(kuò)展且跨語(yǔ)言的服務(wù)的開(kāi)發(fā)。它結(jié)合了功能強(qiáng)大的軟件堆棧和代碼生成引擎,以...
    ssochi閱讀 331評(píng)論 0 2
  • Thrift是什么? Thrift是Facebook于2007年開(kāi)發(fā)的跨語(yǔ)言的rpc服框架,提供多語(yǔ)言的編譯功能,...
    jiangmo閱讀 9,654評(píng)論 0 6
  • 上接:thrift 入門(1/2)PS:我也不想拆,但是放一起文章太長(zhǎng)無(wú)法發(fā)布。。。 四、thrift 入門 4....
    李眼鏡閱讀 1,207評(píng)論 0 1
  • Apache Thrift是FaceBook實(shí)現(xiàn)的一種高效的、支持多語(yǔ)言的遠(yuǎn)程服務(wù)調(diào)用框架。其主要功能是通過(guò)自定義...
    gfgao閱讀 373評(píng)論 0 0

友情鏈接更多精彩內(nèi)容