远程过程调用RPC简介
RPC(Remote Procedure Call, 遠程過程調用):是一種通過網絡從遠程計算機程序上請求服務,而不需要了解底層網絡技術的思想。
RPC是一種技術思想而非一種規范或協議,常見RPC技術和框架有:
(1). 應用級的服務框架:阿里的 Dubbo/Dubbox、Google gRPC、Spring Boot/Spring Cloud。
(2). 遠程通信協議:RMI、Socket、SOAP(HTTP XML)、REST(HTTP JSON)。
(3). 通信框架:MINA和Netty。
目前流行的開源RPC框架主要有阿里巴巴的Dubbo、Facebook的Thrift、Google的gRPC、Twitter的Finagle等。
RPC框架的重要組成:
(1). 客戶端(Client):服務調用方。
(2). 客戶端存根(Client Stub):存放服務端地址信息,將客戶端的請求參數數據信息打包成網絡消息,再通過網絡傳輸發送給服務端。
(3). 服務端存根(Server Stub):接收客戶端發送過來的請求消息并進行解包,然后再調用本地服務進行處理。
(4). 服務端(Server):服務的真正提供者。
(5). Network Service:底層傳輸,可以是TCP或HTTP。
一次RPC調用流程如下:
(1). 服務消費者(Client客戶端)通過本地調用的方式調用服務。
(2). 客戶端存根(Client Stub)接收到調用請求后負責將方法、入參等信息序列化(組裝)成能夠進行網絡傳輸的消息體。
(3). 客戶端存根(Client Stub)找到遠程的服務地址,并且將消息通過網絡發送給服務端。
(4). 服務端存根(Server Stub)收到消息后進行解碼(反序列化操作)。
(5). 服務端存根(Server Stub)根據解碼結果調用本地的服務進行相關處理
(6). 服務端(Server)本地服務業務處理。
(7). 處理結果返回給服務端存根(Server Stub)。
(8). 服務端存根(Server Stub)序列化結果。
(9). 服務端存根(Server Stub)將結果通過網絡發送至消費方。
(10). 客戶端存根(Client Stub)接收到消息,并進行解碼(反序列化)。
(11). 服務消費方得到最終結果。
RPC要解決的兩個問題:
(1). 解決分布式系統中,服務之間的調用問題。
(2). 遠程調用時,要能夠像本地調用一樣方便,讓調用者感知不到遠程調用的邏輯。
RPC的核心并不在于使用什么協議。RPC的目的是讓你在本地調用遠程的方法,而對你來說這個調用是透明的,你并不知道這個調用的方法是部署哪里。通過RPC能解耦服務,這才是使用RPC的真正目的。RPC的原理主要用到了動態代理模式,至于HTTP協議,只是傳輸協議而已。在RPC中可選的網絡傳輸方式有多種,可以選擇TCP協議、UDP協議、HTTP 協議。
簡單的說,RPC就是從一臺機器(客戶端)上通過參數傳遞的方式調用另一臺機器(服務器)上的一個函數或方法(可以統稱為服務)并得到返回的結果。RPC會隱藏底層的通訊細節(不需要直接處理Socket通訊或Http通訊),RPC 是一個請求響應模型。客戶端發起請求,服務器返回響應(類似于Http的工作方式),RPC在使用形式上像調用本地函數(或方法)一樣去調用遠程的函數(或方法)。
RPC采用客戶機/服務器模式:請求程序就是一個客戶機,而服務提供程序就是一個服務器。首先,客戶機調用進程發送一個有進程參數的調用信息到服務進程,然后等待應答信息。在服務器端,進程保持睡眠狀態直到調用信息到達為止。當一個調用信息到達,服務器獲得進程參數,計算結果,發送答復信息,然后等待下一個調用信息,最后,客戶端調用進程接收答復信息,獲得進程結果,然后調用執行繼續進行。
RPC是指遠程過程調用,也就是說兩臺服務器A,B,一個應用部署在A服務器上,想要調用B服務器上應用提供的函數/方法,由于不在一個內存空間,不能直接調用,需用通過網絡來表達調用的語義和傳達調用的數據,執行過程如下圖所示,無法在一個進程內,甚至一個計算機內通過本地調用的方式完成的需求,比如不同的系統間的通訊,甚至不同的組織間的通訊。由于計算能力需要橫向擴展,需要在多臺機器組成的集群上部署應用時需要使用RPC。
進程間通信(IPC,Inter-Process Communication),指至少兩個進程或線程間傳送數據或信號的一些技術或方法。進程是計算機系統分配資源的最小單位。每個進程都有自己的一部分獨立的系統資源,彼此是隔離的。為了能使不同的進程互相訪問資源并進行協調工作,才有了進程間通信。這些進程可以運行在同一計算機上或網絡連接的不同計算機上。進程間通信技術包括消息傳遞、同步、共享內存和遠程過程調用。IPC是一種標準的Unix通信機制。有兩種類型的進程間通信(IPC):
(1). 本地過程調用(LPC):用在多任務操作系統中,使得同時運行的任務能互相會話。這些任務共享內存空間使任務同步和互相發送信息。
(2). 遠程過程調用(RPC):RPC類似于LPC,只是在網上工作。
RPC主要用于公司內部的服務調用,性能消耗低,傳輸效率高,實現復雜。HTTP主要用于對外的異構環境,瀏覽器接口調用,App接口調用,第三方接口調用等。
RPC使用場景(大型的網站,內部子系統較多、接口非常多的情況下適合使用RPC):
(1). 長鏈接:不必每次通信都要像HTTP一樣去3次握手,減少了網絡開銷。
(2). 注冊發布機制:RPC框架一般都有注冊中心,有豐富的監控管理;發布、下線接口、動態擴展等,對調用方來說是無感知、統一化的操作。
(3). 安全性:沒有暴露資源操作。
(4). 微服務支持:就是最近流行的服務化架構、服務化治理,RPC框架是一個強力的支撐。
注:以上內容均來自網絡整理,主要參考:
1.?https://mp.weixin.qq.com/s/UYL8yD9lusl3ELPSiIDk_A
2.?https://www.zhihu.com/question/25536695
3.?https://www.jianshu.com/p/b0343bfd216e
4.?https://www.cs.rutgers.edu/~pxk/417/notes/03-rpc.html
以下是使用python3實現的簡單的客戶端、服務器簡單測試代碼:
test_server_1.py內容如下:
from xmlrpc.server import SimpleXMLRPCServerclass MyFuncs:def add(self, a, b):return a + bif __name__ == "__main__":s = SimpleXMLRPCServer(("localhost", 8000))s.register_instance(MyFuncs())print("server is online ...")s.serve_forever()
test_client_1.py內容如下:
import xmlrpc.clients = xmlrpc.client.ServerProxy("http://localhost:8000")
print("sum:", s.add(2, 3))
執行結果如下:
GitHub:https://github.com/fengbingchun/Python_Test
總結
以上是生活随笔為你收集整理的远程过程调用RPC简介的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: FFmpeg中RTSP客户端拉流测试代码
- 下一篇: FFmpeg实现获取USB摄像头视频流测