java為什么要實(shí)現(xiàn)序列化 微服務(wù)調(diào)用為什么用RPC框架,http不更簡(jiǎn)單嗎?
微服務(wù)調(diào)用為什么用RPC框架,http不更簡(jiǎn)單嗎?簡(jiǎn)單點(diǎn),HTTP是協(xié)議,RPC是概念!實(shí)現(xiàn)RPC可以基于HTTP協(xié)議(Feign),TCP協(xié)議(Netty),RMI協(xié)議(Soap),WebServi
微服務(wù)調(diào)用為什么用RPC框架,http不更簡(jiǎn)單嗎?
簡(jiǎn)單點(diǎn),HTTP是協(xié)議,RPC是概念!實(shí)現(xiàn)RPC可以基于HTTP協(xié)議(Feign),TCP協(xié)議(Netty),RMI協(xié)議(Soap),WebService(XML—RPC)框架。傳輸過程中,也因?yàn)樾蛄谢绞降牟煌?,又有一些框架和協(xié)議,比如Dubbo中的Dubbo協(xié)議,gRpc—Protobuf序列化協(xié)議等等。其實(shí),都是基于遠(yuǎn)程調(diào)用的概念,何為遠(yuǎn)程調(diào)用?
重點(diǎn)是,RPC就是遠(yuǎn)程調(diào)用,遠(yuǎn)程調(diào)用就是客戶端把調(diào)用的接口,參數(shù),參數(shù)類型,方法,返回值,返回值類型等(這些稱為方法簽名),通過如上的協(xié)議,發(fā)送給服務(wù)端,告知服務(wù)端需要調(diào)用的接口方法,這個(gè)過程就是RPC的實(shí)現(xiàn)過程!HTTP和RPC是不同層面的兩個(gè)東西!
性能方面,HTTP本身是基于TCP協(xié)議的,屬于應(yīng)用層協(xié)議,所以HTTP協(xié)議本身在實(shí)現(xiàn)過程中就會(huì)占用大量的資源(內(nèi)存,帶寬等),性能上肯定沒有通過TCP直接實(shí)現(xiàn)RPC協(xié)議快,不管HTTP如何優(yōu)化肯定的是不如TCP的!而TCP則是依靠字節(jié)碼,現(xiàn)在普遍采用的是將客戶端調(diào)用的接口信息,序列化的方式發(fā)送給服務(wù)端,序列化框架又包含很多(Hession,Protobuf,Kryo等等,序列化性能最高的是Kryo,序列化后字節(jié)碼最小的是Protobuf),序列化后的字節(jié)碼越小,占用帶寬越少,序列化時(shí)間越短,線程IO等待時(shí)間就會(huì)越小。所以,在具體應(yīng)用層面有很多可探討的技術(shù),可以根據(jù)自己的硬件能力來選擇相應(yīng)的技術(shù)就可以了!
歡迎熱愛技術(shù)的人來探討!
二進(jìn)制序列化原理?
二進(jìn)制序列化:
序列化就是將對(duì)象從內(nèi)存中移到硬盤(使用FileStream)或者向網(wǎng)絡(luò)(使用NetWorkStream)中傳送??烧J(rèn)為是格式化數(shù)據(jù)。
javabean為什么需要序列化?
所謂的Serializable,就是java提供的通用數(shù)據(jù)保存和讀取的接口。至于從什么地方讀出來和保存到哪里
去都被隱藏在函數(shù)參數(shù)的背后了。這樣子,任何類型只要實(shí)現(xiàn)了Serializable接口,就可以被保存到文件中,或者作為數(shù)據(jù)流通過網(wǎng)絡(luò)發(fā)送
到別的地方。也可以用管道來傳輸?shù)较到y(tǒng)的其他程序中。這樣子極大的簡(jiǎn)化了類的設(shè)計(jì)。只要設(shè)計(jì)一個(gè)保存一個(gè)讀取功能就能解決上面說得
所有問題。
java的"對(duì)象序列化"能讓你將一個(gè)實(shí)現(xiàn)了Serializable接口的對(duì)象轉(zhuǎn)換成一組byte,這樣日后要用這個(gè)對(duì)象時(shí)候,你就能把這些byte數(shù)
據(jù)恢復(fù)出來,并據(jù)此重新構(gòu)建那個(gè)對(duì)象了。
工作流當(dāng)中流程變量的幾種數(shù)據(jù)類型:string integer short long double boolean date binary serializable,這就是為什么要將
javabean實(shí)現(xiàn)序列化的原因,因?yàn)槟銓?duì)象設(shè)置到流程變量中必須要實(shí)現(xiàn)序列化,否則會(huì)在設(shè)置流程變量的時(shí)候報(bào)錯(cuò)找不到該類型
java對(duì)象序列化機(jī)制就是把內(nèi)存中的Java對(duì)象(User之類的JavaBean)轉(zhuǎn)換成二進(jìn)制流。java對(duì)象序列化后可以很方便的存儲(chǔ)或者在網(wǎng)絡(luò)
中傳輸。Java的序列化機(jī)制是通過運(yùn)行時(shí)判斷類的序列化ID(serialVersionUID)來判定版本的一致性。在反序列化時(shí),java虛擬機(jī)會(huì)通過二
進(jìn)制流中的serialVersionUID與本地的對(duì)應(yīng)的實(shí)體類進(jìn)行比較,如果相同就認(rèn)為是一致的,可以進(jìn)行反序列化,正確獲得信息,否則拋出序列
化版本不一致的異常。所以涉及到數(shù)據(jù)傳輸或者存儲(chǔ)的類,嚴(yán)格意義上來說都要加上序列化ID,這也是一種良好的編程習(xí)慣。