中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久

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

之前寫過兩篇關于 Thrift 的相關文章。

Thrift源碼剖析

Thrift異步IO服務器源碼分析

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

簡單搞了一個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),

}

然后通過 畢竟Thrift其實就是干RPC的活,所以看源碼就按著RPC遠程調用的順序來看就行。

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

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

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;

}

整個對象的序列化過程主要是依賴了接口 TProtocol 的函數(shù)。

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

TBinaryProtocol

TCompactProtocol

TJSONProtocol

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

主要是如下幾個關鍵點:

其實 writeStructStruct 和 writeStructEnd 啥屁事也不用做。

其實 writeFieldBegin 只有后兩個參數(shù)有用,第二個參數(shù)是類型,第三個參數(shù)是ID, 因為光靠這兩者就可以在反序列化(讀取解析)的時候知道是哪個成員了。

struct write 的過程其實是個遞歸的過程,也就是在write函數(shù)中, 會遞歸的調用結構體本身每個成員的write函數(shù)。

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

更多信息請查看IT技術專欄

更多信息請查看技術文章
易賢網手機網站地址:Thrift之Protocol源碼分析

2026國考·省考課程試聽報名

  • 報班類型
  • 姓名
  • 手機號
  • 驗證碼
關于我們 | 聯(lián)系我們 | 人才招聘 | 網站聲明 | 網站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點 | 投訴建議
工業(yè)和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網安備53010202001879號 人力資源服務許可證:(云)人服證字(2023)第0102001523號
聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關注公眾號:hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權所有:易賢網
主站蜘蛛池模板: 扎赉特旗| 峨边| 常德市| 四川省| 永顺县| 株洲市| 铁岭市| 凉山| 西城区| 婺源县| 贺州市| 岳阳市| 康定县| 咸阳市| 五莲县| 新竹市| 潼南县| 武宣县| 观塘区| 青海省| 聊城市| 渭南市| 疏勒县| 大埔县| 上栗县| 开阳县| 玛沁县| 左云县| 雅安市| 水城县| 三河市| 定陶县| 营口市| 开鲁县| 延安市| 安西县| 宾阳县| 府谷县| 新田县| 长春市| 邢台市|