rpc通信原理淺析
rpc(remote procedure call),即遠程過程調(diào)用,廣泛用于分布式或是異構(gòu)環(huán)境下的通信,數(shù)據(jù)格式一般采取protobuf。
protobuf(protocol buffer)是google 的一種數(shù)據(jù)交換的格式,它獨立于平臺語言。
google 提供了protobuf多種語言的實現(xiàn):java、c#、c++、go 和 python,每一種實現(xiàn)都包含了相應(yīng)語言的編譯器以及庫文件。
由于它是一種二進制的格式,比使用 xml(20倍) 、json(10倍)進行數(shù)據(jù)交換快許多??梢园阉糜诜植际綉?yīng)用之間的數(shù)據(jù)通信或者異構(gòu)環(huán)境下的數(shù)據(jù)交換。作為一種效率和兼容性都很優(yōu)秀的二進制數(shù)據(jù)傳輸格式,可以用于諸如網(wǎng)絡(luò)傳輸、配置文件、數(shù)據(jù)存儲等諸多領(lǐng)域。
protobuf比json、xml塊是毋庸置疑的,一方面前者是二進制存儲,后兩者是純文本存儲且還需要存取一些額外的數(shù)據(jù)信息,例如xml需要存取標簽、json需要存取key-vale。文章來源:http://www.zghlxwxcb.cn/news/detail-609612.html
上一節(jié)說到,分布式環(huán)境下不同服務(wù)器上的節(jié)點,想要完成服務(wù)的互相調(diào)用離不開rpc遠程調(diào)用,這里簡單分析一下調(diào)用過程。
step1:local調(diào)用一個service,即一個method,該method有方法名、方法的參數(shù)以及返回值,首先如何知道這個服務(wù)在哪個分布式節(jié)點上?這就要實現(xiàn)服務(wù)注冊和服務(wù)發(fā)現(xiàn)(例如zookeeper),分布式各節(jié)點先將自身擁有的一些服務(wù)注冊到服務(wù)中心,那么local調(diào)用某個服務(wù)的時候,就先去服務(wù)中心去找這個注冊的服務(wù)在哪臺節(jié)點上注冊的,找到這個節(jié)點后,那么說明我要通過該結(jié)點返回這個服務(wù)所執(zhí)行的結(jié)果。
step2:擁有該服務(wù)的分布式節(jié)點如何知道調(diào)用者需要哪個服務(wù)?顯然local需要自己將要調(diào)用的服務(wù)的一些標識信息(方法名、參數(shù)、返回值)通過網(wǎng)絡(luò)傳輸給該結(jié)點,這里local采取protobuf來序列化服務(wù)的標識信息,然后通過網(wǎng)絡(luò)發(fā)送給對端。
step3:擁有該服務(wù)的節(jié)點,接收到local發(fā)送過來的數(shù)據(jù)之后,需要反序列化出服務(wù)的標識信息,這樣才知道需要調(diào)用哪個服務(wù),調(diào)用完成之后得到該服務(wù)的結(jié)果,那么和調(diào)用的過程類似,先將這個結(jié)果序列化,然后發(fā)送給對端,當然如果該服務(wù)沒有調(diào)用成功,那么可以序列化錯誤信息返回,表示調(diào)用失敗。
step4:local端接收到服務(wù)調(diào)用的結(jié)果,同樣采取反序列化的方式得到需要的結(jié)果,local再根據(jù)結(jié)果做下一步操作或是返回錯誤,整個rpc調(diào)用過程結(jié)束。黃色部分:設(shè)計rpc方法參數(shù)的打包和解析,也就是數(shù)據(jù)的序列化和反序列化,使用Protobuf。
綠色部分:網(wǎng)絡(luò)部分,包括尋找rpc服務(wù)主機,發(fā)起rpc調(diào)用請求和響應(yīng)rpc調(diào)用結(jié)果。
文章來源地址http://www.zghlxwxcb.cn/news/detail-609612.html
到了這里,關(guān)于rpc通信原理淺析的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!