前言
為什么需要RPC,而不是簡單的HTTP接口关噪?
剛開始還是菜鳥的時(shí)候,時(shí)常把RPC和HTTP搞混淆乌妙,本身概念還沒理解清楚使兔,心里就浮躁的不行,導(dǎo)致鬧出了不少笑話藤韵。
什么是RPC虐沥?
RPC(Remote Promote Call) 一種進(jìn)程間通信方式。允許像調(diào)用本地服務(wù)一樣調(diào)用遠(yuǎn)程服務(wù)泽艘。
RPC框架的主要目標(biāo)就是讓遠(yuǎn)程服務(wù)調(diào)用更簡單欲险、透明。RPC框架負(fù)責(zé)屏蔽底層的傳輸方式(TCP或者UDP)匹涮、序列化方式(XML/JSON/二進(jìn)制)和通信細(xì)節(jié)天试。開發(fā)人員在使用的時(shí)候只需要了解誰在什么位置提供了什么樣的遠(yuǎn)程服務(wù)接口即可,并不需要關(guān)心底層通信細(xì)節(jié)和調(diào)用過程然低。
什么是HTTP喜每?
HTTP協(xié)議是應(yīng)用層的超文本傳送協(xié)議,它是Web的基礎(chǔ)雳攘。HTTP協(xié)議位于TCP/IP協(xié)議棧的應(yīng)用層带兜。基于HTTP協(xié)議的客戶/服務(wù)器模式的信息交換過程来农,分四個(gè)過程:建立連接鞋真、發(fā)送請求信息、發(fā)送響應(yīng)信息沃于、關(guān)閉連接涩咖。
OSI網(wǎng)絡(luò)結(jié)構(gòu)的七層模型
第七層:應(yīng)用層: 定義了用于在網(wǎng)絡(luò)中進(jìn)行通信和數(shù)據(jù)傳輸?shù)慕涌?- 用戶程式;提供標(biāo)準(zhǔn)服務(wù)繁莹,比如虛擬終端檩互、文件以及任務(wù)的傳輸 和處理;
第六層:表示層: 掩蓋不同系統(tǒng)間的數(shù)據(jù)格式的不同性咨演; 指定獨(dú)立結(jié)構(gòu)的數(shù)據(jù)傳輸格式闸昨; 數(shù)據(jù)的編碼和解碼;加密和解密;壓縮和 解壓縮
第五層:會(huì)話層: 管理用戶會(huì)話和對話饵较; 控制用戶間邏輯連接的建立和掛斷拍嵌;報(bào)告上一層發(fā)生的錯(cuò)誤
第四層:傳輸層: 管理網(wǎng)絡(luò)中端到端的信息傳送; 通過錯(cuò)誤糾正和流控制機(jī)制提供可靠且有序的數(shù)據(jù)包傳送循诉; 提供面向無連接的數(shù) 據(jù)包的傳送横辆;
第三層:網(wǎng)絡(luò)層: 定義網(wǎng)絡(luò)設(shè)備間如何傳輸數(shù)據(jù); 根據(jù)唯一的網(wǎng)絡(luò)設(shè)備地址路由數(shù)據(jù)包茄猫;提供流和擁塞控制以防止網(wǎng)絡(luò)資源的損耗
第二層:數(shù)據(jù)鏈路層: 定義操作通信連接的程序狈蚤; 封裝數(shù)據(jù)包為數(shù)據(jù)幀; 監(jiān)測和糾正數(shù)據(jù)包傳輸錯(cuò)誤
第一層:物理層: 定義通過網(wǎng)絡(luò)設(shè)備發(fā)送數(shù)據(jù)的物理方式划纽; 作為網(wǎng)絡(luò)媒介和設(shè)備間的接口脆侮;定義光學(xué)、電氣以及機(jī)械特性勇劣。
RPC是一種概念靖避,http也是rpc實(shí)現(xiàn)的一種方式。論復(fù)雜度比默,dubbo/hessian用起來是超級簡單的筋蓖。最近用dubbo和hessian比較多,http的幾乎都被廢棄了退敦。
至于為什么用,其實(shí)很簡單蚣抗,業(yè)務(wù)場景不一樣侈百。我最早的單位所有的代碼都在一個(gè)工程里,一次要發(fā)布幾百m的代碼翰铡。這種架構(gòu)是非常有利于小程序的钝域。但是我們?yōu)槭裁匆獞?yīng)用rpc層呢,一個(gè)功能锭魔,一套代碼下來不就解決了么例证?我覺得有幾個(gè)好處:
- 靈活部署
- 解耦
系統(tǒng)做大了,肯定是需要做微服務(wù)的迷捧。 現(xiàn)在我們做電商就是這樣织咧,單獨(dú)有一個(gè)訂單系統(tǒng),支付系統(tǒng)漠秋,商品系統(tǒng)笙蒙,用戶系統(tǒng)。都是分開部署庆锦,單獨(dú)上線的捅位。 但我們交互是用HTTP接口來交互的,我想轉(zhuǎn)用RPC,但問題是我現(xiàn)在還沒發(fā)現(xiàn)為什么需要用RPC艇搀,我還沒能理解它的作用和意義尿扯。
用http交互其實(shí)就已經(jīng)屬于rpc了。
不知道大家看到這里有沒有解決掉文章開頭的那個(gè)問題呢焰雕?看似普普通通的一個(gè)問題衷笋,實(shí)際上暗藏了很多玄機(jī),只有從頭到尾都完完整整的了解過一遍之后才能真正地得到想要的答案淀散。大部分程序員應(yīng)該都有在工作過程中碰到各式各樣的問題右莱,那是否都深入去追究過問題的本質(zhì)呢?如果有機(jī)會(huì)不妨去試一試档插,你會(huì)發(fā)現(xiàn)海面下隱藏的“冰山”是表面上的許多倍慢蜓。
為什么面試官問的都是同樣的問題,有的人覺得沒什么太多能回答的點(diǎn)郭膛,有的人卻能滔滔不絕晨抡?我想每個(gè)人思維的深度面試官一眼就能看出來,正好就印證了那句話:架構(gòu)是一種思想则剃,技術(shù)只是外殼耘柱。技術(shù)可能淘汰,思想才能長存棍现。
人因?yàn)橛辛怂枷氲骷澹艣]有成為野獸。
在這里推薦一個(gè)架構(gòu)群895244712
己肮,除了分布式士袄、微服務(wù)、性能優(yōu)化等技術(shù)點(diǎn)的技術(shù)分享谎僻,更重要的是架構(gòu)思想的形成娄柳。
這邊不再糾結(jié),詳細(xì)理解一下RPC的相關(guān)問題艘绍。
廣義和狹義的RPC
廣義的遠(yuǎn)程通訊技術(shù)包括:RPC , WebService , RMI , JMS , EJB , JNDI .
CORBA
:面向?qū)ο蟮木幊腆w系規(guī)范,分布式系統(tǒng),跨語言,對標(biāo)RMI(競爭關(guān)系)赤拒。SOAP
:簡單對象訪問協(xié)議,微軟聯(lián)合廠商對xml-rpc標(biāo)準(zhǔn)化,soap協(xié)議就是聯(lián)合標(biāo)準(zhǔn)化的結(jié)果,而且微軟搶先完善了soap協(xié)議,推出了webservice。對象訪問協(xié)議指的是使用XML描述web service的信息(URI/類/參數(shù)/返回值),理論上SOAP就是一段xmlWebService
:屬于廣義rpc的一種(常見的廣義rpc實(shí)現(xiàn)還有xml-rpc和json-rpc),支持異構(gòu)系統(tǒng)間的交互, 支持不同語言的通信,使用http通信,通過serlvet提供XML格式的數(shù)據(jù),是SOAP協(xié)議的封裝,WSDL是它的描述方式诱鞠。WSDL
:webservice描述語言,描述SOAP協(xié)議的,也是段XMLRMI
:遠(yuǎn)程調(diào)用對象,其實(shí)是java實(shí)現(xiàn)了RPC的一組接口JMS
:MQEJB
:大型分布式,rmi-iiop協(xié)議
廣義RPC發(fā)展歷程
狹義RPC技術(shù)框架
由于目前跨內(nèi)存調(diào)用的普遍性,RPC往往代稱更加具體的基于底層協(xié)議二進(jìn)制流的RPC框架,與WebService最大的不同就是: 狹義的RPC基于二進(jìn)制流的序列化和反序列化,故不能夠提供跨語言的服務(wù),但是比基于文本解析的WebService更加高效挎挖。
狹義RPC框架一般需要高性能的網(wǎng)絡(luò)框架,如Netty,Mina,高性能的序列化反序列化框架,尋址方式,如果是帶會(huì)話的RPC,還要有會(huì)話和狀態(tài)保持功能。
當(dāng)下XML-RPC,SOAP,WebService技術(shù)的缺陷
- 冗余數(shù)據(jù)太多,處理速度太慢般甲。
- RPC 風(fēng)格的 Web Service 跨語言性不佳,而 Document 風(fēng)格的 Web Service 又太過難用肋乍。
- Web Service 沒有解決用戶的真正問題,只是把一個(gè)問題變成了另一個(gè)問題。
- Web Service 的規(guī)范太過復(fù)雜,以至于在 .NET 和 Java 平臺(tái)以外沒有真正好用的實(shí)現(xiàn),甚至沒有可用的實(shí)現(xiàn)敷存。
- 跨語言跨平臺(tái)只是 Web Service 的一個(gè)口號,雖然很多人迷信這一點(diǎn),但事實(shí)上它并沒有真正實(shí)現(xiàn)墓造。
RPC框架實(shí)現(xiàn)的幾個(gè)核心技術(shù)點(diǎn):
- 遠(yuǎn)程提供者需要以某種形式提供服務(wù)調(diào)用相關(guān)的信息堪伍,包括但不限于服務(wù)接口定義、數(shù)據(jù)結(jié)構(gòu)觅闽、或者中間態(tài)的服務(wù)定義文件帝雇。例如Facebook的 Thrift的IDL文件,Web service的WSDL文件蛉拙;服務(wù)的調(diào)用者需要通過一定的圖景獲取遠(yuǎn)程服務(wù)調(diào)用相關(guān)的信息尸闸。
- 遠(yuǎn)程代理對象:服務(wù)調(diào)用者用的服務(wù)實(shí)際是遠(yuǎn)程服務(wù)的本地代理。說白了就是通過動(dòng)態(tài)代理來實(shí)現(xiàn)孕锄。
- 通信:RPC框架與具體的協(xié)議無關(guān)吮廉。
- 序列化:畢竟是遠(yuǎn)程通信,需要將對象轉(zhuǎn)化成二進(jìn)制流進(jìn)行傳輸畸肆。不同的RPC框架應(yīng)用的場景不同宦芦,在序列化上也會(huì)采取不同的技術(shù)
RPC面臨的挑戰(zhàn)
在大規(guī)模服務(wù)化之前,應(yīng)用可能只是通過RPC框架轴脐,簡單的暴露和引用遠(yuǎn)程服務(wù)调卑,通過配置URL地址進(jìn)行遠(yuǎn)程服務(wù)調(diào)用,路由則通過F5負(fù)載均衡器等進(jìn)行簡單的負(fù)載均衡大咱。
當(dāng)服務(wù)越來越多的時(shí)候恬涧,服務(wù)的URL配置管理變得更加困難。單純的使用RPC就有點(diǎn)吃不消碴巾。所以在大規(guī)模分布式集群中溯捆,RPC只是作為集群的一個(gè)方法調(diào)用手段。例如在Hadoop的進(jìn)程間交互都是通過RPC來進(jìn)行的厦瓢,比如Namenode與Datanode直接现使,Jobtracker與Tasktracker之間等。
服務(wù)化架構(gòu)的演進(jìn)
MVC架構(gòu):當(dāng)業(yè)務(wù)規(guī)模很小時(shí)旷痕,將所有功能都不熟在同一個(gè)進(jìn)程中,通過雙機(jī)或者負(fù)載均衡器實(shí)現(xiàn)負(fù)債分流顽冶;此時(shí)欺抗,分離前后臺(tái)邏輯的MVC架構(gòu)是關(guān)鍵。
PRC架構(gòu):當(dāng)垂直應(yīng)用越來越多强重,應(yīng)用之間交互不可避免绞呈,將核心和公共業(yè)務(wù)抽取出來,作為獨(dú)立的服務(wù)间景,實(shí)現(xiàn)前后臺(tái)邏輯分離佃声。此時(shí),用于提高業(yè)務(wù)復(fù)用及拆分的RPC框架是關(guān)鍵倘要。
SOA架構(gòu):隨著業(yè)務(wù)發(fā)展圾亏,服務(wù)數(shù)量越來越多十拣,服務(wù)生命周期管控和運(yùn)行態(tài)的治理成為瓶頸,此時(shí)用于提升服務(wù)質(zhì)量的SOA服務(wù)治理是關(guān)鍵志鹃。
微服務(wù)架構(gòu):通過服務(wù)的原子化拆分夭问,以及微服務(wù)的獨(dú)立打包、部署和升級曹铃,小團(tuán)隊(duì)的交付周期將縮短缰趋,運(yùn)維成本也將大幅度下降。