一、基本了解

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
image-1691672006453

下载对应os的压缩包后解压,在bin目录里可以看到已经编译好的protoc,移到系统PATH中就可以用了
image-1691672016839

方法二:

下载源码慢慢编译,但我不会哈哈哈哈哈

 

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
 
如有不对,烦请指出,感谢~