分佈式下的遠程通信技術(RPC)的一些理解

前言

爲什麼需要RPC,而不是簡單的HTTP接口?

剛開始還是菜鳥的時候,時常把RPC和HTTP搞混淆,本身概念還沒理解清楚,心裏就浮躁的不行,導致鬧出了不少笑話。

什麼是RPC?

RPC(Remote Promote Call) 一種進程間通信方式。允許像調用本地服務一樣調用遠程服務。

RPC框架的主要目標就是讓遠程服務調用更簡單、透明。RPC框架負責屏蔽底層的傳輸方式(TCP或者UDP)、序列化方式(XML/JSON/二進制)和通信細節。開發人員在使用的時候只需要瞭解誰在什麼位置提供了什麼樣的遠程服務接口即可,並不需要關心底層通信細節和調用過程。

什麼是HTTP?

HTTP協議是應用層的超文本傳送協議,它是Web的基礎。HTTP協議位於TCP/IP協議棧的應用層。基於HTTP協議的客戶/服務器模式的信息交換過程,分四個過程:建立連接、發送請求信息、發送響應信息、關閉連接。
 

OSI網絡結構的七層模型

第七層:應用層:     定義了用於在網絡中進行通信和數據傳輸的接口 - 用戶程式;提供標準服務,比如虛擬終端、文件以及任務的傳輸 和處理; 
第六層:表示層:     掩蓋不同系統間的數據格式的不同性; 指定獨立結構的數據傳輸格式; 數據的編碼和解碼;加密和解密;壓縮和 解壓縮 
第五層:會話層:     管理用戶會話和對話; 控制用戶間邏輯連接的建立和掛斷;報告上一層發生的錯誤 
第四層:傳輸層:     管理網絡中端到端的信息傳送; 通過錯誤糾正和流控制機制提供可靠且有序的數據包傳送; 提供面向無連接的數 據包的傳送; 
第三層:網絡層:     定義網絡設備間如何傳輸數據; 根據唯一的網絡設備地址路由數據包;提供流和擁塞控制以防止網絡資源的損耗 
第二層:數據鏈路層:     定義操作通信連接的程序; 封裝數據包爲數據幀; 監測和糾正數據包傳輸錯誤 
第一層:物理層:      定義通過網絡設備發送數據的物理方式; 作爲網絡媒介和設備間的接口;定義光學、電氣以及機械特性。

RPC是一種概念,http也是rpc實現的一種方式。論複雜度,dubbo/hessian用起來是超級簡單的。最近用dubbo和hessian比較多,http的幾乎都被廢棄了。

至於爲什麼用,其實很簡單,業務場景不一樣。我最早的單位所有的代碼都在一個工程裏,一次要發佈幾百m的代碼。這種架構是非常有利於小程序的。但是我們爲什麼要應用rpc層呢,一個功能,一套代碼下來不就解決了麼?我覺得有幾個好處:

  1. 靈活部署
  2. 解耦

系統做大了,肯定是需要做微服務的。 現在我們做電商就是這樣,單獨有一個訂單系統,支付系統,商品系統,用戶系統。都是分開部署,單獨上線的。 但我們交互是用HTTP接口來交互的,我想轉用RPC,但問題是我現在還沒發現爲什麼需要用RPC,我還沒能理解它的作用和意義。
用http交互其實就已經屬於rpc了

不知道大家看到這裏有沒有解決掉文章開頭的那個問題呢?看似普普通通的一個問題,實際上暗藏了很多玄機,只有從頭到尾都完完整整的瞭解過一遍之後才能真正地得到想要的答案。大部分程序員應該都有在工作過程中碰到各式各樣的問題,那是否都深入去追究過問題的本質呢?如果有機會不妨去試一試,你會發現海面下隱藏的“冰山”是表面上的許多倍。

爲什麼面試官問的都是同樣的問題,有的人覺得沒什麼太多能回答的點,有的人卻能滔滔不絕?我想每個人思維的深度面試官一眼就能看出來,正好就印證了那句話:架構是一種思想,技術只是外殼。技術可能淘汰,思想才能長存。

人因爲有了思想,纔沒有成爲野獸。
在這裏推薦一個架構羣895244712,除了分佈式、微服務、性能優化等技術點的技術分享,更重要的是架構思想的形成。

這邊不再糾結,詳細理解一下RPC的相關問題。

廣義和狹義的RPC

廣義的遠程通訊技術包括:RPC , WebService , RMI , JMS , EJB , JNDI .

  • CORBA:面向對象的編程體系規範,分佈式系統,跨語言,對標RMI(競爭關係)。
  • SOAP:簡單對象訪問協議,微軟聯合廠商對xml-rpc標準化,soap協議就是聯合標準化的結果,而且微軟搶先完善了soap協議,推出了webservice。對象訪問協議指的是使用XML描述web service的信息(URI/類/參數/返回值),理論上SOAP就是一段xml
  • WebService:屬於廣義rpc的一種(常見的廣義rpc實現還有xml-rpc和json-rpc),支持異構系統間的交互, 支持不同語言的通信,使用http通信,通過serlvet提供XML格式的數據,是SOAP協議的封裝,WSDL是它的描述方式。
  • WSDL:webservice描述語言,描述SOAP協議的,也是段XML
  • RMI:遠程調用對象,其實是java實現了RPC的一組接口
  • JMS:MQ
  • EJB:大型分佈式,rmi-iiop協議

廣義RPC發展歷程

狹義RPC技術框架

由於目前跨內存調用的普遍性,RPC往往代稱更加具體的基於底層協議二進制流的RPC框架,與WebService最大的不同就是: 狹義的RPC基於二進制流的序列化和反序列化,故不能夠提供跨語言的服務,但是比基於文本解析的WebService更加高效。

狹義RPC框架一般需要高性能的網絡框架,如Netty,Mina,高性能的序列化反序列化框架,尋址方式,如果是帶會話的RPC,還要有會話和狀態保持功能。

當下XML-RPC,SOAP,WebService技術的缺陷

  • 冗餘數據太多,處理速度太慢。 
  • RPC 風格的 Web Service 跨語言性不佳,而 Document 風格的 Web Service 又太過難用。 
  • Web Service 沒有解決用戶的真正問題,只是把一個問題變成了另一個問題。 
  • Web Service 的規範太過複雜,以至於在 .NET 和 Java 平臺以外沒有真正好用的實現,甚至沒有可用的實現。 
  • 跨語言跨平臺只是 Web Service 的一個口號,雖然很多人迷信這一點,但事實上它並沒有真正實現。 

RPC框架實現的幾個核心技術點:

  • 遠程提供者需要以某種形式提供服務調用相關的信息,包括但不限於服務接口定義、數據結構、或者中間態的服務定義文件。例如Facebook的 Thrift的IDL文件,Web service的WSDL文件;服務的調用者需要通過一定的圖景獲取遠程服務調用相關的信息。
  • 遠程代理對象:服務調用者用的服務實際是遠程服務的本地代理。說白了就是通過動態代理來實現。
  • 通信:RPC框架與具體的協議無關。
  • 序列化:畢竟是遠程通信,需要將對象轉化成二進制流進行傳輸。不同的RPC框架應用的場景不同,在序列化上也會採取不同的技術

RPC面臨的挑戰

在大規模服務化之前,應用可能只是通過RPC框架,簡單的暴露和引用遠程服務,通過配置URL地址進行遠程服務調用,路由則通過F5負載均衡器等進行簡單的負載均衡。

當服務越來越多的時候,服務的URL配置管理變得更加困難。單純的使用RPC就有點吃不消。所以在大規模分佈式集羣中,RPC只是作爲集羣的一個方法調用手段。例如在Hadoop的進程間交互都是通過RPC來進行的,比如Namenode與Datanode直接,Jobtracker與Tasktracker之間等。

服務化架構的演進

  • MVC架構:當業務規模很小時,將所有功能都不熟在同一個進程中,通過雙機或者負載均衡器實現負債分流;此時,分離前後臺邏輯的MVC架構是關鍵。
  • PRC架構:當垂直應用越來越多,應用之間交互不可避免,將核心和公共業務抽取出來,作爲獨立的服務,實現前後臺邏輯分離。此時,用於提高業務複用及拆分的RPC框架是關鍵。
  • SOA架構:隨着業務發展,服務數量越來越多,服務生命週期管控和運行態的治理成爲瓶頸,此時用於提升服務質量的SOA服務治理是關鍵。
  • 微服務架構:通過服務的原子化拆分,以及微服務的獨立打包、部署和升級,小團隊的交付週期將縮短,運維成本也將大幅度下降。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章