什么是RPC?
是指遠程過程調用,就是兩個服務A、B,一個應用部署在A服務器上,想要調用B服務器上應用提供的函數/方法,由於不在一個內存空間,不能直接調用,需要通過網絡來表達調用的語義和傳達調用的數據。
RPC 會隱藏底層的通訊細節(不需要直接處理Socket通訊或Http通訊)
RPC 是一個請求響應模型。客戶端發起請求,服務器返回響應(類似於Http的工作方式)
那么:
- 首先,要解決通訊的問題,主要是通過在客戶端和服務器之間建立TCP連接,遠程過程調用的所有交換的數據都在這個連接里傳輸。連接可以是按需連接,調用結束后就斷掉,也可以是長連接,多個遠程過程調用共享同一個連接。
- 第二,要解決尋址的問題,也就是說,A服務器上的應用怎么告訴底層的RPC框架,如何連接到B服務器(如主機或IP地址)以及特定的端口,方法的名稱名稱是什么,這樣才能完成調用。比如基於Web服務協議棧的RPC,就要提供一個endpoint URI,或者是從UDDI服務上查找。如果是RMI調用的話,還需要一個RMI Registry來注冊服務的地址。
- 第三,當A服務器上的應用發起遠程過程調用時,方法的參數需要通過底層的網絡協議如TCP傳遞到B服務器,由於網絡協議是基於二進制的,內存中的參數的值要序列化成二進制的形式,也就是序列化(Serialize)或編組(marshal),通過尋址和傳輸將序列化的二進制發送給B服務器。
- 第四,B服務器收到請求后,需要對參數進行反序列化(序列化的逆操作),恢復為內存中的表達方式,然后找到對應的方法(尋址的一部分)進行本地調用,然后得到返回值。
- 第五,返回值還要發送回服務器A上的應用,也要經過序列化的方式發送,服務器A接到后,再反序列化,恢復為內存中的表達方式,交給A服務器上的應用
一共9步:
1)服務消費方(client)調用以本地調用方式調用服務;
2)client stub接收到調用后負責將方法、參數等組裝成能夠進行網絡傳輸的消息體;
3)client stub找到服務地址,並將消息發送到服務端;
4)server stub收到消息后進行解碼;
5)server stub根據解碼結果調用本地的服務;
6)本地服務執行並將結果返回給server stub;
7)server stub將返回結果打包成消息並發送至消費方;
8)client stub接收到消息,並進行解碼;
9)服務消費方得到最終結果。
引用:https://www.zhihu.com/question/25536695/answer/109977506
什么是REST?
REST是一種架構風格,指的是一組架構約束條件和原則。滿足這些約束條件和原則的應用程序或設計就是 RESTful。REST規范把所有內容都視為資源,網絡上一切皆資源。
REST並沒有創造新的技術,組件或服務,只是使用Web的現有特征和能力。 可以完全通過HTTP協議實現,使用 HTTP 協議處理數據通信。REST架構對資源的操作包括獲取、創建、修改和刪除資源的操作正好對應HTTP協議提供的GET、POST、PUT和DELETE方法。
REST和RPC的比較:
RPC來實現服務間調用的一些痛點:
1.RPC服務提供方與調用方接口依賴方式太強,會導致編碼的復雜性,而REST接口相比RPC更為輕量化,服務提供方和調用方的依賴只是依靠一紙契約,不存在代碼級別的強依賴。
2.RPC服務對平台敏感,難以簡單復用:REST可以實現跨平台,任何一個語言的調用方都可以根據接口定義來實現。
比較項 規范 |
REST |
RPC |
通信協議 |
HTTP |
一般使用TCP |
性能 |
低 |
高 |
靈活度 |
高 |
低 |
Dubbo采用的RPC的服務調用,SpringCloud采用的REST。
Dubbo | Spring Cloud | |
---|---|---|
服務注冊中心 | Zookeeper | Spring Cloud Netflix Eureka |
服務調用方式 | RPC | REST API |
服務監控 | Dubbo-monitor | Spring Boot Admin |
斷路器 | 不完善 | Spring Cloud Netflix Hystrix |
服務網關 | 無 | Spring Cloud Netflix Zuul |
分布式配置 | 無 | Spring Cloud Config |
服務跟蹤 | 無 | Spring Cloud Sleuth |
消息總線 | 無 | Spring Cloud Bus |
數據流 | 無 | Spring Cloud Stream |
批量任務 | 無 | Spring Cloud Task |
…… | …… | …… |
Dubbo 只是實現了服務治理,而 Spring Cloud 子項目分別覆蓋了微服務架構下的眾多部件,服務治理只是其中的一個方面。
建議:
REST調用及測試都很方便,RPC就顯得有點繁瑣,但是RPC的效率是毋庸置疑的,所以建議在多系統之間的內部調用采用RPC。對外提供的服務,Rest更加合適。