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 使用场景

  1. 低延时、高可用的分布式系统;
  2. 移动端与云服务端的通讯;
  3. 使用protobuf,独立于语言的协议,支持多语言之间的通讯;
  4. 可以分层扩展,如:身份验证,负载均衡,日志记录,监控等;

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