什么是RPC?
百度解釋:RPC(Remote Procedure Call)— 遠程過程調用,它是一種通過網絡從遠程計算機程序上請求服務,而不需要了解底層網絡技術的協議。RPC協議假定某些傳輸協議的存在,如TCP或UDP,為通信程序之間攜帶信息數據。
可能各位看了這句話,還是不懂。那我舉個例子。平時老婆經常給我發指令,陽台的衣服收下,面對面發就是本地過程調用,通過微信,或者電話告訴我。然后我再執行就是遠程過程調用。
什么情況下使用 RPC ?
例如開發電商系統,需要拆分出用戶服務、商品服務、優惠券服務、支付服務、訂單服務、物流服務、售后服務等等,這些服務之間都相互調用,這時內部調用最好使用 RPC ,同時每個服務都可以獨立部署,獨立上線。 也就說當我們的項目太大,需要解耦服務,擴展性強、部署靈活,這時就要用到 RPC ,主要解決了分布式系統中,服務與服務之間的調用問題。
RPC 框架原理
RPC 架構主要包括三部分:
- 服務注冊中心(Registry),負責將本地服務發布成遠程服務,管理遠程服務,提供給服務消費者使用。
- 服務提供者(Server),提供服務接口定義與服務實現類。
- 服務消費者(Client),通過遠程代理對象調用遠程服務。
服務提供者啟動后主動向服務注冊中心(Registry)注冊機器IP、端口以及提供的服務列表;
服務消費者啟動時向服務注冊中心(Registry)獲取服務提供方地址列表。
服務注冊中心(Registry)可實現負載均衡和故障切換。
RPC 調用過程
(1) 客戶端(client)以本地調用方式調用服務;
(2) 客戶端存根(client stub)接收到調用后,負責將方法、參數等組裝成能夠進行網絡傳輸的消息體(將消息體對象序列化為二進制);
(3) 客戶端通過 sockets 將消息發送到服務端;
(4) 服務端存根(server stub)收到消息后進行解碼(將消息對象反序列化);
(5) 服務端存根(server stub)根據解碼結果調用本地的服務;
(6) 本地服務執行並將結果返回給服務端存根(server stub);
(7) 服務端存根(server stub)將返回結果打包成消息(將結果消息對象序列化);
(8) 服務端(server)通過 sockets 將消息發送到客戶端;
(9) 客戶端存根(client stub)接收到結果消息,並進行解碼(將結果消息發序列化);
(10) 客戶端(client)得到最終結果。
RPC 就是要把 2、3、4、7、8、9 這些步驟都封裝起來。
RPC 優點
- 跨語言(C++、PHP、Java、Python ...)
- 協議私密,安全性較高
- 數據傳輸效率高
- 支持動態擴展
RPC 缺點
一個完善的 RPC框架 開發難度大,需要的專業人員比較多,對初學者難度比較大。
PHP RPC 有哪些?
- Thrift:http://thrift.apache.org/
- gRPC:http://doc.oschina.net/grpc
- Yar:https://www.php.net/manual/zh/book.yar.php
- Swoole-RPC:https://wiki.swoole.com/wiki/page/683.html
- Hprose:https://hprose.com/
小結
這篇文章分享了,我認為的 RPC 是什么樣的。
主要包括在什么場景下使用 RPC,RPC 的原理及調用過程,還有 RPC 的優缺點和 PHP 常用的 RPC 框架。
等我研究了具體某一種 RPC,再分享給大家。