Go GRPC 入门

1,安装包

grpc

golang-grpc 包提供了 gRPC 相关的代码库,通过这个库我们可以创建 gRPC 服务或客户端,首先需要安装他。

协议插件

要玩 gRPC,自然离不开 proto 文件,需要安装两个包,用于支持 protobuf 文件的处理。

GOPATH/binprotoc-gen-go.exe

Protocol Buffers

Protocol Buffers 是一个与编程语言无关、与平台无关的可拓展机制,用于序列化结构数据,是一种数据交换格式,gRPC 使用 protoc 作为协议处理工具。

学习 Go 的 gRPC 时,有个坑,很多文章里面都没有说到要安装这个,执行命令提示不存在 protoc 命令。

protoc-3.15.6-win64.zip
bin\protoc.exeGOPATH\binprotoc-gen-go.exe

测试

以上都妥当后,我们在一个新的目录,创建一个 test.proto 文件,其内容示例如下如下:

protoc-3.15.6-win64\include\google\protobuf

然后在 proto 所在目录,执行命令将 proto 转换为相应的编程语言文件。

test.pb.go

2,gRPC 服务端

创建一个 go 程序,把 test.pb.go 复制放到在 main.go 目录,在 main.go 引入 grpc:

test.pb.goTester
TesterServerTesterClient

这里我们先实现 Server。

接着我们创建 gRPC 服务。

3,gRPC 客户端

创建一个新的 go 项目,把 test.pb.go 复制放到 main.go 同级目录,main.go 的代码:

4,编译运行

由于创建的时候,test.pb.go 使用的包名是 main,所以在编译时,需要把多个 go 文件一起编译:

然后分别启动 server 和 client,在 client 每按下一次回车键,便发送一次 gRPC 消息。

gRPC请求和响应

到这里,我们学习了一个完整的 gRPC 从创建协议到创建服务和客户端的过程,下面将接着学习一些相关的知识,了解一些细节。

5,其它

proto.Marshal
proto.Unmarshal

我们还可以自定义如何序列化反序列化消息,代码示例:

GRPC

Protobuf buffer

Protobuf buffer 是一种数据格式,而 Protobuf 是 gRPC 协议,这里需要区分一下。

protobuf buffer 是 Google 用于序列化结构话数据的开源机制,要定义一个 protobuf buffer,需要使用 message 定义。

 = 116-2047

详细的说可以参考官方文档:

https://developers.google.com/protocol-buffers/docs/overview

字段类型

字段类型就不详细列表了,读者可以参考官方文档,这里列一下常用的数据类型:

double、float、int32、int64、bool、string、bytes、枚举。

由于 gRPC 需要考虑兼容 C 语言、C#、java、Go 语言等,所以 gRPC 中的类型不等同于编程语言中的相关类型。这些类型都是 gRPC 中定义的,并且如果要转换为编程语言中的类型,需要一些转换机制,而这有时会十分麻烦。

字段规则

每个字段都可以指定一个规则,在定义字段类型的开头使用规则标识。

有以下三种规则:

requiredoptionalrepeated
repeated[packed=true]

在可选字段中 optional 中,我们可以为其设置一个默认值,当传递消息时如果没有填写此字段,则使用其默认值:

Protobuf

接下来将介绍 gRPC 的协议格式(protobuf),下面是官方文档的一个示例:

syntax 指明协议的版本;

package 指明该 .proto 的名称;

timestamp.proto

不同编程语言引入包/库的方式是不同的,C++ 和 C# 都是使用命名空间区分代码位置;Java 以目录、公共类严格区别包名;go 则是以一个 .go 文件任意设置 package 名称。

前面提到了 protoc,可以将协议文件转为为具体的代码。

_package

例如 :

gRPC 四种服务方法

protobuf 中除了可以定义 message,也可以定义流式接口。

gRPC使您可以定义四种服务方法:

rpc SayHello(HelloRequest) returns (HelloResponse);
rpc LotsOfReplies(HelloRequest) returns (stream HelloResponse);
rpc LotsOfGreetings(stream HelloRequest) returns (HelloResponse);
rpc BidiHello(stream HelloRequest) returns (stream HelloResponse);

编译 proto

protoc-gen-goprotoc-gen-zsharp

需要注意的是,转换 .proto 为编程语言,不一定要安装 protoc。

例如 C# 只需要把 .proto 文件放到项目中,通过包管理器安装一个库,就会自动转换为相应的代码。

回归正题,聊一下 protoc 编译 .proto 文件的命令。

protoc 常用的参数如下:

最简单的编译命令:

--{xxx}_out

这个输出文件的路径是执行命令的路径,如果我们不在 .proto 文件目录下执行命令,则输出的代码便不是相同位置了。为了解决这个问题,我们可以使用:

这样在别的地方执行命令,生成的代码会跟 .proto 文件放在相同的位置。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。