標準庫中的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.執...