不知從何時rpc這個東西開始進入咱們的視野,一開始作開發的時候常用的都是http,偶爾使用的是socket進行通訊,使用的是restful的方式。可是,一次偶然的機會你會發現RPC這個東西進入了你的視野,並且因爲微服務的興起然他迅速被人們所知,那麼它是什麼,又如何使用呢?php
RPC,即 Remote Procedure Call(遠程過程調用),說得通俗一點就是:調用遠程計算機上的服務,就像調用本地服務同樣。
說的再實際一點:
若是咱們以前使用UserService.getUser(1)這樣的方式調用本地服務,而rpc就是要讓調用遠程服務也是這樣。git
其實說多了也沒用,仍是直接上代碼,讓我實際來看看使用方式你就瞬間明白了。
首先舉個jsonrpc的例子。
golang自帶了"net/rpc/jsonrpc"的庫,因此咱們利用它來作。
首先是咱們須要調用的服務

很是簡單的一個定義,定義了一個獲取用戶的服務,返回用戶信息。
其中須要說明的是,入參是須要遵循jsonrpc的一個定義規範,將返回值以指針的方式傳入。
註冊和啓動服務

註冊咱們剛纔寫好的服務,而後監聽一個端口,而且準備接受請求。github
最後最重要的就是咱們的客戶端調用

咱們經過鏈接對應端口,經過Call方法調用對應服務的方法,傳入對應的參數和返回值。
咱們看到,雖然這個rpc服務沒有寫在咱們本地,可是咱們看到使用UserService.GetUser這樣的寫法調用這個服務,這其實就是所謂的rpcgolang
對比http來看,http服務你須要給出對應的接口地址,須要定義http method,等等。從我我的的見解來講:rpc更像是熟人之間的對話,http更多的陌生人之間的約定 由於rpc調用的時候,我都知道你的方法命名和位置,對你很瞭解;而http調用的時候我必須按照文檔的定義。因此rpc多用於微服務之間的調用也是有道理的。shell
上面咱們看到jsonrpc的實現仍是比較簡單的,只須要把對應的服務進行註冊便可調用,而grpc會稍微複雜一些,不過grpc也被更多人所知道,由於它的性能和語言支持,grpc支持各類語言哦。json
因爲國內某些你懂的緣由,grpc安裝使用go get會有問題,下面是個人安裝步驟,能夠參考bash
首先須要一些依賴
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.gitrestful
mkdir -p \(GOPATH/src/google.golang.org/
cd \)GOPATH/src/google.golang.org
git clone https://github.com/Agzs/grpc grpcsocket
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
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
看到這個提示證實安裝成功
一、首先編寫一個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);
}
二、而後使用命令生成對應的pb文件
protoc -I ./ ./demo.proto --go_out=plugins=grpc:./
三、而後編寫服務端

能夠看到這裏的寫法和jsonrpc是相似的,可是由於生成了pb文件的緣由,因此不可能寫錯,都是引用的代碼,須要注意的是,這個的Add方法就是實現了咱們在protoc文件中定義的接口。
四、最後編寫客戶端

在這裏咱們明顯能夠看出,在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從性能和使用的角度來講更加穩健一些。