1、概述
1.1 什么是gRPC
RPCRemote Procedure Call
gRPC
A high-performance, open-source universal RPC framework
gRPC
gRPCclientserverRPCgRPC
gRPCclientservergRPC
serverclientgRPC
gRPC
如下图所示就是一个典型的RPC结构图。
gRPCProtocol BuffersProtocol Buffers(详细proto语法参见:Golang使用Protobuf)Golangstruct结构体func函数gRPC
1.2 使用场景
- 低延时、高可用的分布式系统;
- 移动端与云服务端的通讯;
- 使用protobuf,独立于语言的协议,支持多语言之间的通讯;
- 可以分层扩展,如:身份验证,负载均衡,日志记录,监控等;
1.3 gRPC 与 RESTful API比较
特性 | gRPC | RESTful API |
规范 | 必须.proto | 可选 OpenAPI |
协议 | HTTP/2 任意版本的 | HTTP 协议 |
有效载荷 | Protobuf(小、二进制) | JSON(大、易读) |
浏览器支持 | 否(需要 grpc-web) | 是 |
流传输 | 客户端、服务端、双向 | 客户端、服务端 |
代码生成 | 是 | OpenAPI + 第三方工具 |
2、环境配置
2.1 安装配置protocol buffers和protoc-gen-go
2.2 获取gRPC
gRPC
protoc-gen-go-grpc
protoc-gen-go-grpc用于.proto-->***_grpc.pb.go。
3、gRPC入门示例
在开始开发之前,先说说我们的目标。
grpc-practice
项目结构如下:
注意: 这是整个项目所有文件生成完后的结构,所有.proto和.go文件都是在3.1及其后步骤生成的,go.mod内容如下:
3.1 定义服务
serverclient
MessageSenderSendMessageRequestMessageResponse
接着在grpc-practice/pkg/proto目录下执行如下命令:
这两条命令会grpc-practice/pkg/pb目录中生成message.pb.go、message_grpc.pb.go这两个文件。在这两个文件中,包含了我们定义方法的go语言实现,也包含了我们定义的请求与相应的go语言实现。
protoc-gen-gomessage.protoserverclient
注意:在网上的一些教程中,有这样的生成方式:
githubprotoc-gen-goxxx_grpc.pb.goxxx.pb.goxxx.pb.go
3.2 服务端
3.2.1 实现服务定义的方法
Server
3.2.2 gRPC服务端注册定义的服务并监听
很容易可以看出,我们在这一部分创建了一个grpcServer,然后注册了我们的Service,在注册函数的第二个参数中,我们传进去了一个MessageSenderServerImpl实例。
8002
至此,服务端开发完毕。
3.3 客户端
server