Thrift之Protocol源碼分析
來(lái)源:易賢網(wǎng) 閱讀:2222 次 日期:2015-04-09 15:56:14
溫馨提示:易賢網(wǎng)小編為您整理了“Thrift之Protocol源碼分析”,方便廣大網(wǎng)友查閱!

之前寫(xiě)過(guò)兩篇關(guān)于 Thrift 的相關(guān)文章。

Thrift源碼剖析

Thrift異步IO服務(wù)器源碼分析

也算是對(duì)Thrift比較熟悉,不過(guò)對(duì) Thrift 里面的 Protocol 部分還是黑盒使用。 雖然大概能猜到具體實(shí)現(xiàn)方式,但是還是忍不住花了一點(diǎn)點(diǎn)時(shí)間把具體代碼實(shí)現(xiàn)翻出來(lái)看看。 主要是為了滿(mǎn)足一下好奇心。

簡(jiǎn)單搞了一個(gè)Thrift的描述文件Insight.thrift作為例子。

struct Person {

1: string name,

2: i32 age,

3: optional string address,

}

service Insight {

Person Hello(1: Person person),

Person Hi(1: Person p1, 2: Person p2),

}

然后通過(guò) 畢竟Thrift其實(shí)就是干RPC的活,所以看源碼就按著RPC遠(yuǎn)程調(diào)用的順序來(lái)看就行。

從Hello函數(shù)調(diào)用開(kāi)始,InsightClient::Hello 可以看出, 在每次RPC調(diào)用的時(shí)候,會(huì)先將函數(shù)名通過(guò)writeMessageBegin("Hello", ::apache::thrift::protocol::T_CALL, cseqid) 先發(fā)送過(guò)去。 這個(gè)過(guò)程的序列化協(xié)議很簡(jiǎn)單,直接就是傳輸?shù)暮瘮?shù)名字符串。 然后再發(fā)送參數(shù)。 發(fā)送參數(shù)的時(shí)候,會(huì)將所有參數(shù)作為一個(gè) struct 發(fā)送 InsightHellopargs,

所以協(xié)議的序列化過(guò)程主要都是體現(xiàn)在 struct 的序列化上面。 比如像Hi函數(shù)的參數(shù)序列化過(guò)程:

uint32_t Insight_Hi_pargs::write(::apache::thrift::protocol::TProtocol* oprot) const {

uint32_t xfer = 0;

xfer += oprot->writeStructBegin("Insight_Hi_pargs");

xfer += oprot->writeFieldBegin("p1", ::apache::thrift::protocol::T_STRUCT, 1);

xfer += (*(this->p1)).write(oprot);

xfer += oprot->writeFieldEnd();

xfer += oprot->writeFieldBegin("p2", ::apache::thrift::protocol::T_STRUCT, 2);

xfer += (*(this->p2)).write(oprot);

xfer += oprot->writeFieldEnd();

xfer += oprot->writeFieldStop();

xfer += oprot->writeStructEnd();

return xfer;

}

整個(gè)對(duì)象的序列化過(guò)程主要是依賴(lài)了接口 TProtocol 的函數(shù)。

對(duì)于實(shí)現(xiàn) TProtocol 接口的序列化實(shí)現(xiàn)主要是以下三種(在thrift-0.9.0/lib/cpp/src/thrift/protocol里):

TBinaryProtocol

TCompactProtocol

TJSONProtocol

要了解協(xié)議序列化過(guò)程主要看一下 TBinaryProtocol 和 TCompactProtocol 就夠了。

主要是如下幾個(gè)關(guān)鍵點(diǎn):

其實(shí) writeStructStruct 和 writeStructEnd 啥屁事也不用做。

其實(shí) writeFieldBegin 只有后兩個(gè)參數(shù)有用,第二個(gè)參數(shù)是類(lèi)型,第三個(gè)參數(shù)是ID, 因?yàn)楣饪窟@兩者就可以在反序列化(讀取解析)的時(shí)候知道是哪個(gè)成員了。

struct write 的過(guò)程其實(shí)是個(gè)遞歸的過(guò)程,也就是在write函數(shù)中, 會(huì)遞歸的調(diào)用結(jié)構(gòu)體本身每個(gè)成員的write函數(shù)。

TCompactProtocol 和 TBinaryProtocol 的區(qū)別主要是, TCompactProtocol 對(duì)整數(shù)類(lèi)型使用了 ZigZag 壓縮算法,比如 i32 類(lèi)型的整數(shù)本來(lái)是4個(gè)字節(jié), 可以壓縮成 1~5 字節(jié)不等。而 i64類(lèi)型的整數(shù)本來(lái)是8個(gè)字節(jié)??梢詨嚎s成 1~10 字節(jié)不等。

更多信息請(qǐng)查看IT技術(shù)專(zhuān)欄

更多信息請(qǐng)查看技術(shù)文章
易賢網(wǎng)手機(jī)網(wǎng)站地址:Thrift之Protocol源碼分析
由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢(xún)回復(fù)僅供參考,敬請(qǐng)考生以權(quán)威部門(mén)公布的正式信息和咨詢(xún)?yōu)闇?zhǔn)!

2025國(guó)考·省考課程試聽(tīng)報(bào)名

  • 報(bào)班類(lèi)型
  • 姓名
  • 手機(jī)號(hào)
  • 驗(yàn)證碼
關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡(jiǎn)要咨詢(xún) | 簡(jiǎn)要咨詢(xún)須知 | 新媒體/短視頻平臺(tái) | 手機(jī)站點(diǎn) | 投訴建議
工業(yè)和信息化部備案號(hào):滇ICP備2023014141號(hào)-1 云南省教育廳備案號(hào):云教ICP備0901021 滇公網(wǎng)安備53010202001879號(hào) 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號(hào)
云南網(wǎng)警備案專(zhuān)用圖標(biāo)
聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢(xún)關(guān)注公眾號(hào):hfpxwx
咨詢(xún)QQ:1093837350(9:00—18:00)版權(quán)所有:易賢網(wǎng)
云南網(wǎng)警報(bào)警專(zhuān)用圖標(biāo)