天天看點

golang中的RPC開發-2

遠端過程調用(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} &lt;class 'dict'&gt;</code>

微服務架構下資料互動一般是對内 RPC,對外 REST

将業務按功能子產品拆分到各個微服務,具有提高項目協作效率、降低子產品耦合度、提高系統可用性等優點,但是開發門檻比較高,比如 RPC 架構的使用、後期的服務監控等工作

一般情況下,我們會将功能代碼在本地直接調用,微服務架構下,我們需要将這個函數作為單獨的服務運作,用戶端通過網絡調用

兩端要約定好資料包的格式

成熟的RPC架構會有自定義傳輸協定,這裡網絡傳輸格式定義如下,前面是固定長度消息頭,後面是變長消息體

服務端接收到的資料需要包括什麼?

調用的函數名、參數清單,還有一個傳回值error類型

服務端需要解決的問題是什麼?

Map維護用戶端傳來調用函數,服務端知道去調誰

服務端的核心功能有哪些?

維護函數map

用戶端傳來的東西進行解析

函數的傳回值打包,傳給用戶端

用戶端隻有函數原型,使用reflect.MakeFunc() 可以完成原型到函數的調用

reflect.MakeFunc()是Client從函數原型到網絡調用的關鍵

給服務端注冊一個查詢使用者的方法,用戶端使用RPC方式調用

參考連結