前言

不知从什么时候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从性能和使用的角度来说更加稳健一些。

最新文章

  1. spring aop对service层日志和异常的处理
  2. 用修改hosts的方式来屏蔽某些网站
  3. 转】C#接口-显式接口和隐式接口的实现
  4. java的(PO,VO,TO,BO,DAO,POJO)解释
  5. UNITY5以后怎么改GUI文字
  6. -[UIKeyboardLayoutStar release]: message sent to deallocated instance 0x7fbe49120000
  7. 网友微笑分享原创Jquery实现瀑布流特效
  8. apue第四章学习总结
  9. OC面向对象及继承
  10. Oracle sqlldr使用示例
  11. Spark常见错误汇总
  12. hdu4493 Tutor
  13. 如何查看和更改mysql数据库文件存放位置
  14. kettle工具实现报表导出的初步搭建
  15. how tomcat works 总结 二
  16. ES6中var/let/const的区别
  17. hibernate学习以及文件以及注释
  18. python3下最简单的九九乘法表
  19. Flex 项目属性:flex 布局示例
  20. Java知多少(73)文件的压缩处理

热门文章

  1. ad批量上传
  2. ubuntu用samba来实现和虚拟机的文件共享
  3. PTA 树的遍历(根据后序中序遍历输出层序遍历)
  4. DFS(一):砌墙问题
  5. 某个新闻网站抓去自媒体账号 queryId js破解
  6. jenkins邮件配置以及邮件添加附件详解
  7. iwlist/iwconfig/iw命令
  8. destoon6.0 手机版添加下载模块
  9. 推荐系统(recommender systems):预测电影评分--构造推荐系统的一种方法:低秩矩阵分解(low rank matrix factorization)
  10. python基础语法12 内置模块 json,pickle,collections,openpyxl模块