更方便的在微信公众号阅读文章可以关注公众号:海生的go花园
一、介绍
Protocol Buffers是一种语言中立、跨平台,用来序列化结构化数据的一阵协议。
主要定义了一个proto文件,就可以在多种编程语言,多种操作系统使用。
我们使用最新的proto3版本。
我们先新建一个 hello.proto文件
mkdir grpc-demo1 && cd grpc-demo1 && mkdir api && cd api && touch hello.proto
最后我们看到一个目录
➜ grpc-demo1 git:(master) ✗ tree
.
└── api
└── hello.proto
1 directory, 1 file
二、proto文件基础知识
我们先打开hello.proto文件,写入以下代码,然后讲解一下。
一个proto文件的主要构成有 三 部分。
- syntax,package,import 定义协议格式以及proto命名空间,加载其他的proto包名
- go_package 生成go文件 package 名称
- service,message proto文件的内容,service定义grpc,message定义消息
syntax = "proto3";
package hello;
import "google/protobuf/timestamp.proto";
option go_package = "./api;api";
service Say {
rpc SayHello (HelloRequest) returns (HelloReply) {}
}
message HelloRequest {
string name = 1;
}
message HelloReply {
string message = 1;
google.protobuf.Timestamp last_updated = 2;
}
2.1 定义协议格式,proto文件的头部 syntax,package,import
每一个.proto文件,都要定义使用syntax,目前默认是proto3协议格式。
package定义proto的命名空间,通过上面可以看到我们的hello.proto文件在api文件夹内,如果api文件夹,还有其他的.proto文件,如何防止不同的.proto文件冲突,此时就是使用package,定义每个.proto文件的package包名,作为命名空间。这样就防止了同名冲突。
import就是导入其他的.proto文件,就是配合上面的package,如果其他的文件需要引入hello.proto,就使用import "hello.proto" 就可以了。
syntax = "proto3";
package hello;
import "google/protobuf/timestamp.proto";
这里,我们适应了proto3协议格式
然后我们定义了package为hello,
最后我们使用了import,导入了google的timestamp.proto
2.2 定义go_package,生成文件的go package
定义go_package有两种方式。
1、option go_package = "./api;api";
2、option go_package = "github/hisheng/grpc-demo1/api";
两个是等价的,优先第2种,这里写第1种,是因为我们这里单纯的讲 proto格式,用相对的路径简单一点。
当我们使用go mod init,设置了 项目的module了,我们可以使用第2种。
2.3 定义proto的 service和message
2.3.1 定义服务和方法
grpc调用过程(函数)成为方法,若干方法的集合称为 服务
// 定义一个服务Say
service Say {
// 定义一个方法 SayHello
rpc SayHello (HelloRequest) returns (HelloReply) {}
}
在这段代码里,我们定义了一个Say
服务。
提供了供第三方调用的 SayHello
方法。其中HelloRequest
是请求的数据结构,HelloReply
是返回的数据结构。
2.3.2 定义消息类型 message
一个message消息类型,有多个字段(名称/类型,序号)组成。
在这里需要需要唯一。
类型有很多种,官方文档有很详细的描述https://protobuf.dev/programm...
我们这里主要使用了 string字符串类型,以及一个google.protobuf.Timestamp时间戳类型。
message HelloRequest {
string name = 1;
}
message HelloReply {
string message = 1;
google.protobuf.Timestamp last_updated = 2;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。