遠端過程調用(Remote Procedure Call,RPC)是一個計算機通信協定
該協定允許運作于一台計算機的程式調用另一台計算機的子程式,而程式員無需額外地為這個互動作用程式設計
如果涉及的軟體采用面向對象程式設計,那麼遠端過程調用亦可稱作遠端調用或遠端方法調用
golang中實作RPC非常簡單,官方提供了封裝好的庫,還有一些第三方的庫
golang官方的net/rpc庫使用encoding/gob進行編解碼,支援tcp和http資料傳輸方式,由于其他語言不支援gob編解碼方式,是以golang的RPC隻支援golang開發的伺服器與用戶端之間的互動
官方還提供了net/rpc/jsonrpc庫實作RPC方法,jsonrpc采用JSON進行資料編解碼,因而支援跨語言調用,目前jsonrpc庫是基于tcp協定實作的,也支援http傳輸方式
例題:golang實作RPC程式,實作求矩形面積和周長
服務端
用戶端
golang寫RPC程式,必須符合4個基本條件,不然RPC用不了
結構體字段首字母要大寫,可以别人調用
函數名必須首字母大寫
函數第一參數是接收參數,第二個參數是傳回給用戶端的參數,必須是指針類型
函數還必須有一個傳回值error
練習:模仿前面例題,自己實作RPC程式,服務端接收2個參數,可以做乘法運算,也可以做商和餘數的運算,用戶端進行傳參和通路,得到結果如下:
服務端代碼
點選檢視代碼
用戶端代碼
另外,net/rpc/jsonrpc庫通過json格式編解碼,支援跨語言調用
go服務端代碼
go用戶端代碼
python用戶端代碼
python列印結果:<code>{'id': 100, 'result': 'hello 懂事兒', 'error': None} <class 'dict'></code>
微服務架構下資料互動一般是對内 RPC,對外 REST
将業務按功能子產品拆分到各個微服務,具有提高項目協作效率、降低子產品耦合度、提高系統可用性等優點,但是開發門檻比較高,比如 RPC 架構的使用、後期的服務監控等工作
一般情況下,我們會将功能代碼在本地直接調用,微服務架構下,我們需要将這個函數作為單獨的服務運作,用戶端通過網絡調用
兩端要約定好資料包的格式
成熟的RPC架構會有自定義傳輸協定,這裡網絡傳輸格式定義如下,前面是固定長度消息頭,後面是變長消息體
服務端接收到的資料需要包括什麼?
調用的函數名、參數清單,還有一個傳回值error類型
服務端需要解決的問題是什麼?
Map維護用戶端傳來調用函數,服務端知道去調誰
服務端的核心功能有哪些?
維護函數map
用戶端傳來的東西進行解析
函數的傳回值打包,傳給用戶端
用戶端隻有函數原型,使用reflect.MakeFunc() 可以完成原型到函數的調用
reflect.MakeFunc()是Client從函數原型到網絡調用的關鍵
給服務端注冊一個查詢使用者的方法,用戶端使用RPC方式調用
參考連結