如何才能深入理解Thrift原理岩灭,Everything is in code.
繼續(xù)以上一篇文章中的購買汽車的service為例子偎行,我們在看編譯生產(chǎn)的代碼之前,想一下如果我們是Thrift的設(shè)計者熄云,會生產(chǎn)哪些代碼:
1.首先是如何正確的read妙真,write。即序列化和反序列化對象:細節(jié)包括read珍德,write fieldId,fieldValue
2.處理好IsSet接口
其中Car和Consumer都是簡單struct(沒有包含子struct)薄料,我們來看一下自動生成的代碼
Struct/POJO對象
比如Car泵琳,編譯后的Car.java它包含如下幾個內(nèi)部類:
1.CarStandard(Tuple)Scheme(Factory): scheme用于read, write即序列化反序列化car對象获列,本質(zhì)它還是調(diào)用對應(yīng)Protocol里面的read,write方法.?
目前觀察發(fā)現(xiàn)Tuple就是將Optional屬性通過BitSet的方式來存儲击孩。即將required和optional
2.Scheme中的read,write會被Car對象的read创泄,write方法調(diào)用
其它就是一些get/set(包含IsSet方法)等方法
復(fù)合Struct對象
比如Order對象括蝠,它包含car和consumer。編譯后的代碼包括:
1.和簡單對象類似碍拆,包含Scheme對象,它內(nèi)部處理car對象時端幼,會調(diào)用car對象的read弧满,write方法
2.Oder對象的read,write會調(diào)用schema的read滑进,write
Service對象
CarService編譯后募谎,會產(chǎn)生
1.Iface:service的接口
2.createBuyCarOrder_args:內(nèi)部同樣有scheme子類,負責read节槐,write拐纱,它會調(diào)用car,order等對象的read揍庄,write
3.Client:封裝了客戶端的調(diào)用东抹,構(gòu)造時傳入TProtocol。它通過createBuyCarOrder_args來完成序列化和反序列化,它最終會調(diào)用對象的read试浙,write方法。
4.AsyncClient:Client的異步實現(xiàn)
5.Processor: 服務(wù)端的調(diào)用封裝田巴,構(gòu)造時需要傳入真正的服務(wù)實現(xiàn)類壹哺。在調(diào)用方法的時候艘刚,processor會調(diào)用真正的實現(xiàn)實現(xiàn)類,然后
6.createBuyCarOder_result:調(diào)用服務(wù)類后產(chǎn)生的結(jié)果的類的封裝,里面包含scheme(它可以負責對結(jié)果進行read岗喉,write)
整個流程就是:
Client類發(fā)起請求钱床,通過調(diào)用對象的read埠居,write進行序列化,對象的read纸颜,write會調(diào)用schema的read捏浊,write
Server端收到請求后,會轉(zhuǎn)到Processor中浊洞,會調(diào)用服務(wù)實現(xiàn)類胡岔,然后將結(jié)果封裝到createBuyCarOder_result中,里面會調(diào)用對象的read苫亦,write方法進行序列話怨咪,將結(jié)果返回給Client