谈谈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从性能和使用的角度来说更加稳健一些。
谈谈RPC——golang中jsonrpc和grpc的使用的更多相关文章
- golang中的RPC开发-2
RPC简介 远程过程调用(Remote Procedure Call,RPC)是一个计算机通信协议 该协议允许运行于一台计算机的程序调用另一台计算机的子程序,而程序员无需额外地为这个交互作用编程 如果 ...
- golang中的rpc包用法
RPC,即 Remote Procedure Call(远程过程调用),说得通俗一点就是:调用远程计算机上的服务,就像调用本地服务一样. 我所在公司的项目是采用基于Restful的微服务架构,随着微服 ...
- golang中的rpc开发
golang中实现RPC非常简单,官方提供了封装好的库,还有一些第三方的库 golang官方的net/rpc库使用encoding/gob进行编解码,支持tcp和http数据传输方式,由于其他语言不支 ...
- google的grpc在golang中的使用
GRPC是google开源的一个高性能.跨语言的RPC框架,基于HTTP2协议,基于protobuf 3.x,基于Netty 4.x. 前面写过一篇golang标准库的rpc包的用法,这篇文章接着讲一 ...
- python golang中grpc 使用示例代码详解
python 1.使用前准备,安装这三个库 pip install grpcio pip install protobuf pip install grpcio_tools 2.建立一个proto文件 ...
- golang中Context的使用场景
golang中Context的使用场景 context在Go1.7之后就进入标准库中了.它主要的用处如果用一句话来说,是在于控制goroutine的生命周期.当一个计算任务被goroutine承接了之 ...
- Golang中的自动伸缩和自防御设计
Raygun服务由许多活动组件构成,每个组件用于特定的任务.其中一个模块是用Golang编写的,负责对iOS崩溃报告进行处理.简而言之,它接受本机iOS崩溃报告,查找相关的dSYM文件,并生成开发者可 ...
- Golang中设置函数默认参数的优雅实现
在Golang中,我们经常碰到要设置一个函数的默认值,或者说我定义了参数值,但是又不想传递值,这个在python或php一类的语言中很好实现,但Golang中好像这种方法又不行.今天在看Grpc源码时 ...
- Golang中如何正确的使用sarama包操作Kafka?
Golang中如何正确的使用sarama包操作Kafka? 一.背景 在一些业务系统中,模块之间通过引入Kafka解藕,拿IM举例(图来源): 用户A给B发送消息,msg_gateway收到消息后,投 ...
随机推荐
- zabbix--自定义监控项vsftpd
Zabbix 自定义监控项之监控 vsftpd zabbix 提供了很多监控选择,功能丰富,我们还可以根据自定义来监控想要监控一些日常的服务等. 说明: 此处我们通过监控 ftp (自定义命令),实现 ...
- css3动画 2D 3D transfrom
2D transform 例如transform: translate(1px,30px); translate() 方法 translate()方法,根据左(X轴)和顶部(Y轴)位置给定的参数,从当 ...
- QTAction Editor的简单使用(简洁明了)
1. 打开UI界面,选择如下图的模式 2. 添加资源名称并选择相应的资源,点击OK 3. 相应的资源就建立好了 4. 添加好的资源可以直接拖到MainWindow中
- 201671030102陈飞 实验十四 团队项目评审&课程学习总结
项目 内容 这个作业属于哪个课程 2016级计算机科学与工程学院软件工程(西北师范大学) 这个作业的要求在哪里 实验十四 团队项目评审&课程学习总结 课程学习目标 1.掌握软件项目评审会议流程 ...
- Btn 样式
.btn { display: inline-block; padding: 6px 12px; margin-bottom: 0; font-size: 14px; font-weight: nor ...
- 利用反射与dom4j读取javabean生成对应XML
项目中需要自定义生成一个xml,要把Javabean中的属性拼接一个xml,例如要生成以下xml <?xml version="1.0" encoding="gb2 ...
- SQL编程规范整理
一.排版规范 1.代码缩进 对于判断.循环等处理使用字符缩进 缩进的空格最好不要使用TAB键 2.空格及换行 变量定义.相对独立的程序块等要单独成行,便于阅读 太长的程序(超过110列)应做换行处理 ...
- BZOJ 5306: [Haoi2018]染色 二项式反演+NTT
给定长度为 $n$ 的序列, 每个位置都可以被染成 $m$ 种颜色中的某一种. 如果恰好出现了 $s$ 次的颜色有 $k$ 种, 则会产生 $w_{k}$ 的价值. 求对于所有可能的染色方案,获得价值 ...
- ent 基本使用九 代码生成
ent 提供了cli 工具,可以方便我们进行schema 以及代码生成,同时目前提供的cli已经够用了 安装 cli go get github.com/facebookincubator/ent/c ...
- pmm 添加proxysql metrics
pmm 对于proxysql 的管理是基于metrics的进行处理的,使用的是proxysql exporter 对于proxysql exporter的添加,比较简单,我们可以通过独立的额容器运行e ...