A high-performance, open-source universal RPC framework:高性能,开源通用RPC框架
所谓RPC(remote procedure call 远程过程调用)框架实际是提供了一套机制,使得应用程序之间可以进行通信,而且也遵从server/client模型。使用的时候客户端调用server端提供的接口就像是调用本地的函数一样。
grpc和restful api都提供了一套通信机制,用于server/client模型通信,而且它们都使用http作为底层的传输协议(严格地说, gRPC使用的http2.0,而restful api则不一定)。
grpc可以通过protobuf来定义接口,从而可以有更加严格的接口约束条件。
另外,通过protobuf可以将数据序列化为二进制编码,这会大幅减少需要传输的数据量,从而大幅提高性能。
grpc可以方便地支持流式通信(理论上通过http2.0就可以使用streaming模式, 但是通常web服务的restful api似乎很少这么用,通常的流式数据应用如视频流,一般都会使用专门的协议如HLS,RTMP等,这些就不是我们通常web服务了,而是有专门的服务器应用。)
protobuf实际是一套类似Json或者XML的数据传输格式和规范,用于不同应用或进程之间进行通信时使用。通信时所传递的信息是通过Protobuf定义的message数据结构进行打包,然后编译成二进制的码流再进行传输或者存储。
相比较而言,Protobuf有如下优点:
protoc 命令来自 https://github.com/golang/protobuf,可以产生序列化和反序列化的代码,无go相关代码。
protoc是protobuf文件(.proto)的编译器,借助它可以把.proto文件转译成各种编程语言对应的源码。
编译方法
protoc --go_out=./go1/ ./proto/my.proto
protoc的版本可以通过protoc --version进行查看
protoc-gen-go插件则来自https://github.com/golang/protobuf/protoc-gen-go, 可以产生go相关代码, 除上述序列化和反序列化代码之外, 还增加了一些通信公共库。它是protobuf编译插件系列中的Go版本
编译方法
protoc --go_out=plugins=grpc:./go2/ ./proto/my.proto
grpc来源于https://google.golang.org/grpc或者说是https://github.com/grpc/grpc-go,protoc和protoc-gen-go这两个工具都不在其中,所以使用grpc时需要把protoc和protoc-gen-go放到系统PATH中。
方法一:直接下载二进制
下载地址:https://github.com/protocolbuffers/protobuf/releases
下载对应os的压缩包后解压,在bin
目录里可以看到已经编译好的protoc,移到系统PATH中就可以用了
方法二:
下载源码慢慢编译,但我不会哈哈哈哈哈
项目地址:https://github.com/grpc/grpc
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)
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一下
go get -u github.com/golang/protobuf/protoc-gen-go
在$GOPATH/bin
下会生成对应二进制
protoc --go_out=output_directory input_directory/file.proto
其中"–go_out="表示生成Go文件,protoc会自动寻找PATH(系统执行路径)中的protoc-gen-go执行文件。
如果需要下载指定版本的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://blog.miuyun.work
https://www.jianshu.com/p/dba4c7a6d608
https://blog.csdn.net/stpeace/article/details/82713647
https://studygolang.com/articles/12673?fr=sidebar
如有不对,烦请指出,感谢~