跨語言的RPC

2021-10-25 18:39:50 字數 2253 閱讀 3709

標準庫中的rpc預設採用go語言特有的gob編碼,所有從其他語言呼叫go語言實現的rpc服務將比較困難。在網際網路的微服務時代,每乙個rpc以及服務的使用者都可能採用不同的程式語言,因此跨語言是網際網路時代rpc的乙個首要條件。得益於rpc框架設計,go語言的rpc其實也是很容易實現跨語言支援的。

go語言的rpc框架有兩個比較有特色的設計:第乙個是rpc資料打包時可以通過外掛程式實現自定義的編碼和解碼;另乙個就是roc建立在抽象的io.readwritecloser介面之上,我們可以將rpc架設在不同的通訊協議上。這裡我們通過官方自帶的jsonrpc擴充套件實現乙個跨語言的小案例

首先是基於json編碼的重新實現

package main

import

("log"

"net"

"net/rpc"

"net/rpc/jsonrpc"

)type helloservice struct

func

(p *helloservice)

hello

(requset string

,reply *

string

)error

func

main()

forgo rpc.

servecodec

(jsonrpc.

newservercodec

(conn))}

}

**和我們之前最大的區別就是用rpc.servecodec()代替了rpc.serveconn()函式,傳入的引數是針對伺服器端的json編解碼器。

然後時實現json版本的客戶端:

package main

import

("fmt"

"log"

"net"

"net/rpc"

"net/rpc/jsonrpc"

)func

main()

client:=rpc.

newclientwithcodec

(jsonrpc.

newclientcodec

(conn)

)var reply string

client.

call

("helloservice.hello"

,"hello"

,&reply)

if err !=

nil fmt.

println

(reply)

}

先使用net.dial()函式建立tcp鏈結,然後基於該鏈結建立針對客戶端的json編解碼器。

在確保客戶端可以正常呼叫rpc服務的方法之後,我們用乙個普通的tcp服務代替go 語言的rpc服務,我門先關閉前面我們編寫的伺服器端的**,然後在命令列中輸入 nc -l 1234啟動乙個相同埠號的tcp服務,然後再執行一次客戶端的**,這時我們就可以在nc中看到以下資訊

這是乙個json編寫的資料,其中method部分對應要呼叫的rpc服務和方法組合成的名字,params部分的第乙個元素為引數,id是由呼叫放維護的唯一的呼叫編號

請求的json資料物件在內部其實對應了兩個結構體,他們的結果基本相同,客戶端是clientrequest,伺服器端是serverrequest。

type	clientrequest struct

'json:"params"'

id uint64

'json:id'

}type serverrequest struct

'json:"params"'

id uint64

'json:id'

}

在獲取到rpc呼叫對應的json資料後,可以通過直接向架設了rpc服務的tcp伺服器傳送json資料模擬rpc方法呼叫

echo -e ''

|nc lacalhost 1234

返回如下

其中id對應輸入的id引數,result為返回的結果,error部分在出問題時表示錯誤資訊。對順序呼叫來說,id不是必須的。但是go語言的rpc框架支援一步呼叫,當返回結果的順序和呼叫的順序不一樣時,可以通過id來識別對應的呼叫。

經過上面的學習,我們知道,無論採用任何的語言,只要遵循了相同的json的結構,以同樣的流暢就可以和go語言編寫rpc服務進行通訊,這樣就實現了跨語言的rpc。

跨語言類RPC

rpc從最初的客戶端伺服器模式,最終演進到微服務。對於rpc框架的要求越來越多 grpc首先滿足二進位制和跨語言這兩條,二進位制說明壓縮效率高。跨語言說明更靈活。對於grpc來說,二進位制序列化協議是protocol buffers。首先,需要定義個協議檔案.proto。無論使用什麼語言,都有相應的...

請大家推薦跨語言的RPC庫

近來需要乙個款語言的rpc庫,請大家推薦一二。我考慮過幾個,但都沒不滿足要求,比如 thrift,感覺功能不全,比如乙個server只能乙個service,也就是乙個遠端物件。要發布乙個遠端物件樹,還沒找到可行的辦法。protobuf,rpc功能不全,要自己弄。那些第三方的看起來沒乙個成才的。ice...

RPC遠端呼叫,go語言實現RPC小Demo

它是一種通過網路從遠端電腦程式上請求服務,而不需要了解底層網路技術的協議。採用客戶機 伺服器模式。請求程式是乙個客戶機 而服務服務提供程式就是乙個伺服器。過程 1.呼叫客戶端控制代碼 執行傳送引數。2.呼叫本地系統核心傳送網路訊息。3.訊息傳送到遠端主機。4.伺服器控制代碼得到訊息並取得引數。5.執...