談談RPC——golang中jsonrpc和grpc的使用


前言

不知從什么時候rpc這個東西開始進入我們的視野,一開始做開發的時候經常使用的都是http,偶爾使用的是socket進行通信,使用的是restful的方式。但是,一次偶然的機會你會發現RPC這個東西進入了你的視野,而且由於微服務的興起然他迅速被人們所知,那么它是什么,又如何使用呢?

 

RPC定義

RPC,即 Remote Procedure Call(遠程過程調用),說得通俗一點就是:調用遠程計算機上的服務,就像調用本地服務一樣。
說的再實際一點:
如果我們之前使用UserService.getUser(1)這樣的方式調用本地服務,而rpc就是要讓調用遠程服務也是這樣。

 

jsonrpc

其實說多了也沒用,還是直接上代碼,讓我實際來看看使用方式你就瞬間明白了。
首先舉個jsonrpc的例子。
golang自帶了"net/rpc/jsonrpc"的庫,所以我們利用它來做。
首先是我們需要調用的服務

非常簡單的一個定義,定義了一個獲取用戶的服務,返回用戶信息。
其中需要說明的是,入參是需要遵循jsonrpc的一個定義規范,將返回值以指針的方式傳入。
注冊和啟動服務

注冊我們剛才寫好的服務,然后監聽一個端口,並且准備接受請求。

最后最重要的就是我們的客戶端調用

我們通過連接對應端口,通過Call方法調用對應服務的方法,傳入對應的參數和返回值。
我們看到,雖然這個rpc服務沒有寫在我們本地,但是我們看到使用UserService.GetUser這樣的寫法調用這個服務,這其實就是所謂的rpc

對比http來看,http服務你需要給出對應的接口地址,需要定義http method,等等。從我個人的看法來說:rpc更像是熟人之間的對話,http更多的陌生人之間的約定 因為rpc調用的時候,我都知道你的方法命名和位置,對你很了解;而http調用的時候我必須按照文檔的定義。所以rpc多用於微服務之間的調用也是有道理的。

 

grpc

上面我們看到jsonrpc的實現還是比較簡單的,只需要把對應的服務進行注冊即可調用,而grpc會稍微復雜一些,不過grpc也被更多人所知道,因為它的性能和語言支持,grpc支持各種語言哦。

由於國內某些你懂的原因,grpc安裝使用go get會有問題,下面是我的安裝步驟,可以參考

 

grpc的安裝

首先需要一些依賴
cd $GOPATH/src/golang.org/x
git clone https://github.com/golang/net.git
git clone https://github.com/golang/text.git
git clone https://github.com/golang/crypto.git

mkdir -p \(GOPATH/src/google.golang.org/
cd \)GOPATH/src/google.golang.org
git clone https://github.com/Agzs/grpc grpc

cd $GOPATH/src/
go install google.golang.org/grpc

如果沒有任何提示,證明安裝完成,如果提示問題,查詢一下應該可以解決

 

 

如果你懂一點shell可以直接運行下面的腳本進行安裝這些依賴

#!/bin/bash
MODULES="crypto net oauth2 sys text tools"
for module in ${MODULES}
do
wget https://github.com/golang/${module}/archive/master.tar.gz -O ${GOPATH}/src/golang.org/x/${module}.tar.gz
cd ${GOPATH}/src/golang.org/x && tar zxvf ${module}.tar.gz && mv ${module}-master/ ${module}
done


wget https://github.com/google/go-genproto/archive/master.tar.gz -O ${GOPATH}/src/google.golang.org/genproto.tar.gz
cd ${GOPATH}/src/google.golang.org && tar zxvf genproto.tar.gz && mv go-genproto-master genproto

 

 

protocol-buffer的安裝

grpc的使用還需要這個東西的幫忙
官網:https://developers.google.com/protocol-buffers/
我的安裝方式:
首先:
https://github.com/protocolbuffers/protobuf/releases
在這里下載需要的版本

然后下載完成之后找到


將protoc拷貝到環境變量PATH中的一個目錄下就可以了

可以放在/usr/local/sbin,我就偷懶喜歡放在gopath下的bin里面

然后在命令行輸入

protoc --version

 

 

libprotoc 3.7.1
看到這個提示證明安裝成功

 

grpc的使用

1、首先編寫一個proto文件,用於定義你的服務接口
syntax = "proto3";

package grpc_demo;

message Request {
int64 a = 1;
int64 b = 2;
}

message Response {
int64 result = 1;
}

service AddService {
rpc Add (Request) returns (Response);
}

 

2、然后使用命令生成對應的pb文件
protoc -I ./ ./demo.proto --go_out=plugins=grpc:./

 

3、然后編寫服務端

可以看到這里的寫法和jsonrpc是類似的,但是因為生成了pb文件的原因,所以不可能寫錯,都是引用的代碼,需要注意的是,這個的Add方法就是實現了我們在protoc文件中定義的接口。

 

4、最后編寫客戶端

在這里我們明顯可以看出,在grpc中的寫法更加的穩一些,不容易出錯。調用的入參和出參都非常的明確。

到這里,grpc的使用就完成了。我們也明顯可以對比出兩者的區別。同時你也發現,如果是一些復雜的服務情況對於grpc的proto你需要更加的了解。

詳細了解可以查看
https://blog.didiyun.com/index.php/2018/12/12/grpc-golang-1/
https://blog.didiyun.com/index.php/2018/12/29/grpc-golang-2/

 

總結

實際我們可以看到,其實rpc沒有我們想的很復雜,它與http的使用上面差別也不是很大,但是從服務的角度來說,確實rpc更多適用於內部服務的調用,這樣服務的調用會非常方便,就像在使用本地服務一樣。同時我們也對比了jsonrpc和grpc從實現的角度上面來說jsonrpc實現起來更加方便一些,不過grpc從性能和使用的角度來說更加穩健一些。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM