Fork me on GitHub

谈谈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从性能和使用的角度来说更加稳健一些。

 

posted @ 2019-05-20 18:31  LinkinStar  阅读(8020)  评论(0编辑  收藏  举报