一、基本了解
1、grpc定义
A high-performance, open-source universal RPC framework:高性能,开源通用RPC框架
所谓RPC(remote procedure call 远程过程调用)框架实际是提供了一套机制,使得应用程序之间可以进行通信,而且也遵从server/client模型。使用的时候客户端调用server端提供的接口就像是调用本地的函数一样。
2、grpc VS restful api
grpc和restful api都提供了一套通信机制,用于server/client模型通信,而且它们都使用http作为底层的传输协议(严格地说, gRPC使用的http2.0,而restful api则不一定)。
-
grpc可以通过protobuf来定义接口,从而可以有更加严格的接口约束条件。
-
另外,通过protobuf可以将数据序列化为二进制编码,这会大幅减少需要传输的数据量,从而大幅提高性能。
-
grpc可以方便地支持流式通信(理论上通过http2.0就可以使用streaming模式, 但是通常web服务的restful api似乎很少这么用,通常的流式数据应用如视频流,一般都会使用专门的协议如HLS,RTMP等,这些就不是我们通常web服务了,而是有专门的服务器应用。)
3、grpc使用场景
- 需要对接口进行严格约束的情况,尤其是考虑到安全性的因素
- 对于性能有更高的要求时。需要传递大量的数,异步的请求传递二进制数据
4、protobuf
4.1 定义
protobuf实际是一套类似Json或者XML的数据传输格式和规范,用于不同应用或进程之间进行通信时使用。通信时所传递的信息是通过Protobuf定义的message数据结构进行打包,然后编译成二进制的码流再进行传输或者存储。
4.2 优点
相比较而言,Protobuf有如下优点:
- 足够简单
- 序列化后体积很小:消息大小只需要XML的1/10 ~ 1/3
- 解析速度快:解析速度比XML快20 ~ 100倍
- 多语言支持
- 更好的兼容性,Protobuf设计的一个原则就是要能够很好的支持向下或向上兼容
5、protoc、protoc-gen-go和grpc的关系
5.1 protoc
protoc 命令来自 https://github.com/golang/protobuf,可以产生序列化和反序列化的代码,无go相关代码。
protoc是protobuf文件(.proto)的编译器,借助它可以把.proto文件转译成各种编程语言对应的源码。
编译方法
protoc --go_out=./go1/ ./proto/my.proto
protoc的版本可以通过protoc --version进行查看
5.2 protoc-gen-go
protoc-gen-go插件则来自https://github.com/golang/protobuf/protoc-gen-go, 可以产生go相关代码, 除上述序列化和反序列化代码之外, 还增加了一些通信公共库。它是protobuf编译插件系列中的Go版本
编译方法
protoc --go_out=plugins=grpc:./go2/ ./proto/my.proto
5.3 grpc
grpc来源于https://google.golang.org/grpc或者说是https://github.com/grpc/grpc-go,protoc和protoc-gen-go这两个工具都不在其中,所以使用grpc时需要把protoc和protoc-gen-go放到系统PATH中。
二、安装
1、下载protobuf,安装protoc
方法一:直接下载二进制
下载地址:https://github.com/protocolbuffers/protobuf/releases
下载对应os的压缩包后解压,在bin
目录里可以看到已经编译好的protoc,移到系统PATH中就可以用了
方法二:
下载源码慢慢编译,但我不会哈哈哈哈哈
2、安装grpc
项目地址:https://github.com/grpc/grpc
2.1 使用官方的安装命令
go get google.golang.org/grpc
但是会报错:(科学上网的话不会)
package google.golang.org/grpc: unrecognized import path “google.golang.org/grpc”(https fetch: Get https://google.golang.org/grpc?go-get=1: dial tcp 216.239.37.1:443: i/o timeout)
2.2 使用git clone进行安装
git clone https://github.com/grpc/grpc-go.git $GOPATH/src/google.golang.org/grpc
git clone https://github.com/golang/net.git $GOPATH/src/golang.org/x/net
git clone https://github.com/golang/text.git $GOPATH/src/golang.org/x/text
cd $GOPATH/src/
go install google.golang.org/grpc
go install
缺啥包就git clone一下
3、安装protoc-gen-go
3.1 下载安装
go get -u github.com/golang/protobuf/protoc-gen-go
在$GOPATH/bin
下会生成对应二进制
3.2 使用命令说明
protoc --go_out=output_directory input_directory/file.proto
其中"–go_out="表示生成Go文件,protoc会自动寻找PATH(系统执行路径)中的protoc-gen-go执行文件。
3.3 安装指定版本
如果需要下载指定版本的protoc-gen-go,那么:(VERSION中的版本可以通过git checkout [tab键]
补充出来看看有哪些)
cd "$(go env GOPATH)"/src/github.com/golang/protobuf
VERSION=v1.5.0
git checkout $VERSION
cd protoc-gen-go
go install
生成的二进制也会放在$GOPATH/bin
中 (记得把$GOPATH/bin
加入系统路径,不然使用protoc时会找不到)
参考链接:
https://www.jianshu.com/p/dba4c7a6d608
https://blog.csdn.net/stpeace/article/details/82713647
https://studygolang.com/articles/12673?fr=sidebar
如有不对,烦请指出,感谢~