天天看點

thrift 一個有意思的特性:Class名稱無關性

最近開發的一個項目,後端采用thrift架構來提供rpc服務(java語言實作),然後前端采用php語言來生成thrift client調用背景RPC服務。由于某些原因,上周我把thrift定義檔案中一個struct名稱修改了,當然也沒多想,順手就把java服務端重新編譯部署,而php前端的部署未做任何變化,按正常了解,服務契約中的類名,從A改成B,服務的調用方理應同步更新部署,否則感覺應該會出錯。

然而,美好的事情就這麼發生了,一切運作正常,依舊絲絲順滑!

thrift 一個有意思的特性:Class名稱無關性

 thrift内部存儲二進制資料時,為了提高存儲效率,每個field都配置設定了一個數字編号,是以在序列化及反序列化時,其實是隻認數字編号,不管名稱的,這也正是thrift IDL檔案定義struct時,為什麼強制要求每個成員都要指定一個在struct本身範圍内不重複的數字序号

IDL生成的具體語言的源代碼中,解析對象時,同樣也隻看序号,以c#生成的代碼為例:

從上面的case語句可以很清楚的看出,代碼内部隻認數字序号,不關心名稱。

結論:隻要不改變struct内部的成員類型和數字編号,struct對應的類名可以放心大膽的修改。