1

更方便的在微信公众号阅读文章可以关注公众号:海生的go花园
图片

一、介绍

Protocol Buffers是一种语言中立、跨平台,用来序列化结构化数据的一阵协议。
主要定义了一个proto文件,就可以在多种编程语言,多种操作系统使用。
我们使用最新的proto3版本。
我们先新建一个 hello.proto文件

mkdir grpc-demo1 && cd grpc-demo1 && mkdir api && cd api && touch  hello.proto

最后我们看到一个目录
image.png

➜  grpc-demo1 git:(master) ✗ tree
.
└── api
    └── hello.proto

1 directory, 1 file

二、proto文件基础知识

我们先打开hello.proto文件,写入以下代码,然后讲解一下。
一个proto文件的主要构成有 三 部分。

  1. syntax,package,import 定义协议格式以及proto命名空间,加载其他的proto包名
  2. go_package 生成go文件 package 名称
  3. 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;
}

海生
104 声望33 粉丝

与黑夜里,追求那一抹萤火。