RPC,是一種遠程調用方式(Remote Procedure Call),通過 RPC 我們可以像調用本地方法一樣調用別的機器上的方法,用戶將無感服務器與服務器之間的通訊。RPC 在微服務當中,起到相當大的作用,當然 RPC 不是微服務必須的一種方式,有別的方式也可以實現這種遠程調用,例如 RESTful API 就可以實現遠程調用。如果有用過 SOAP,那么你使用 RPC 將會覺得很類似,都是可以直接調用別的機器上的方法。
隨著業務的發展,我們的項目從簡單的單體結構逐漸的演化成微服務結構,我們為什么要拆分成微服務呢?那我們來說說微服務和單體架構的優缺點。
單體架構
單體架構優點
- 部署容易,如 php 寫的項目,只要一個文件夾復制到支持 php 的環境就可以了,JAVA 只需要一個 jar 包
- 測試容易,我們整體項目只要改了一個地方馬上就可以測試得出結果
- 負載均衡就可以解決,快速部署多個一模一樣的項目在不同的機器運行分流
單體架構缺點
- 部署的問題,對于 php 來說這點還好,但是對于 java 的項目來說,我們需要重新打包整個項目耗費的時間是很長的
- 代碼維護,由于所有的代碼都寫在一個項目里面,要想要修改某一個功能點那么需要對項目的整體邏輯和設計有較深的理解,否則代碼耦合嚴重,導致維護難,特別對于新入職的員工來說這將是最容易出現問題的地方
- 開發效率低,隨著項目需求的不斷改變和新的功能新增,老舊的代碼又不敢隨便刪除,導致整個項目變得笨重,這將會增加你閱讀代碼的時間
- 擴展性,在高并發的情況下,我們往往不是整個項目的每一個功能都處于高流量高請求的情況下的,很多時候都是某一個功能模塊使用的人數比較多,在單體結構下我們沒有辦法針對單個功能實現分布式擴展,必須整個項目一起部署
微服務架構
在2014年被提出,現在國內很多公司已經使用,微服務是一種架構設計,并不是說什么框架或者代替什么。微服務做的事情是按照項目顆粒度進行服務的拆分,把模塊單獨拿出來做成每一個單獨的小項目。微服務的主要特點有:每一個功能模塊是一個小項目、獨立運行在不同進程或者機器上、不同功能可以又不同的人員開發獨立開發不松耦合、獨立部署不需要依賴整體項目就可以啟動單個服務、分布式管理。每一個服務只要做好自己的事情就好了。在設計微服務的時候還需要考慮到數據庫的問題,是所有微服務使用共同一個數據庫還是每一個服務單個數據庫。
微服務架構優點
- 拆分業務,把整體大項目分割成不同小項目運行在不同進程或者機器上實現數據隔離
- 技術棧,每個服務可以由不同的團隊或者開發者進行開發,外部調用人員不需要操心具體怎么實現的,只需要類似調用自己方法一樣或者接口一樣按照服務提供者給出來的參數傳遞即可
- 獨立部署,每一個服務獨立部署,部署一個服務不會影響整體項目,如果部署失敗最多是這個服務的功能缺失,并不影響其他功能的使用
- 按需部署,針對不同的需求可以給不同的服務自由擴展服務器,根據服務的規模部署滿足需求的實例
- 局部修改,當一個服務有新需求或者其他修改,不需要修改整體項目只要管好自己的服務就好了
微服務架構缺點
- 運維,微服務由于把業務拆分得細,有可能部署在不同機器上,因此對于運維人員的管理來說,這部分的成本會加大
- 接口調整,微服務之間通過接口進行通信。如果修改某個微服務的API,可能所有使用了該接口的微服務都需要做調整;
- 重復勞動,很多服務可能都會使用到相同的功能。而這個功能并沒有達到分解為一個微服務的程度,這個時候,可能各個服務都會開發這一功能,導致代碼重復。
- 分布式,由于會把不同服務部署在不同機器上,那么對于這些服務的調用、容錯、網絡延遲、分布式事務等等都是一個很大的挑戰,當然微服務不一定全部都是部署在不同服務器上
服務調用
如上圖所示,RPC 就用于調用者與服務之間的通訊。RPC 協議可基于 TCP、UDP 或者 HTTP 實現,但是更推薦選擇 TCP。
例如,調用者需要調用商品的服務就可以通過 RPC 或者 RESTful API 來調用,那么 RPC 調用和 RESTful API 兩者之間的區別在哪呢?
- TCP 支持長連接,當調用服務的時候不需要每次都進行三次握手才實現。從性能和網絡消耗來說 RPC 都具備了很好的優勢。
- RESTful API 基于 HTTP 的,也就是說每次調用服務都需要進行三次握手建立起通信才可以實現調用,當我們的并發量高的時候這就會浪費很多帶寬資源
- 服務對外的話采用 RESTful API 會比 RPC 更具備優勢,因此,看自己團隊的服務是對內還是對外
RPC 調用過程
RPC 最主要的作用就是用于服務調用
我們從 RPC 的使用場景開山篇,對于單體架構和微服務的進行了一個描述。這個就是 RPC 的一個使用場景,也是最常用的一個使用場景。大家只有了解好 RPC 是什么使用在什么場景才能更好的去使用。