Go 实践教程-gRPC-Protobuf(六)
字数:
341
·
阅读:
2 分钟
·
访问:
-
Protobuf 是 Protobuf Buffers 的简称,它是 Google 公司开发的一种数据描述语言,并于2008年开源。
可用作为设计安全的跨语言 RPC 接口的基础工具。
目前 Protobuf 已经发展到第3版本,即
syntax = "proto3";
你将会学到
- 如何编写 protobuf 文件
- 如何通过
protoc工具生成 go 代码
编写 protobuf 文件
- 先定义语法版本
- 再定义
package - 定义一个
service - 定义一组
request,response的message
创建 hello.proto 文件
- 第一行结尾需要写上分号
; service相当于定义接口,rpc定义未实现的接口方法message相当于定义一个结构体,里面定义字段属性, 先类型后变量名,然后序列号。- 每一行数据类型后需要写一个编号,从1开始,因为编码是通过成员的唯一编号来绑定对应的数据。
- 推荐使用请求
message后加上Request关键字, 如StringRequest - 推荐使用响应
message后加上Response关键字,如StringResponse
// 选择 proto3 语法
syntax = "proto3";
// 定义一个包名为 hello
package hello;
// 定义一个 service 服务名为 HelloService,相当于 GO 接口定义
service HelloService {
// 以 rpc 开头,定义未实现的方法名称。 必须要有一个请求 message 和响应 message
// rpc, returns 都是关键字
rpc Hello(StringRequest) returns (StringResponse){};
}
// message 相当于一个结构体,里面定义字段属性, 先类型后变量名,然后序列号。
// protoful 编码是通过成员的唯一编号来绑定对应的数据。
// 定义一个请求结构体
message StringRequest {
string value = 1;
}
// 定义一个响应结构体
message StringResponse {
string result = 1;
}
标量类型
以下只列出常用的类型对应关系。更多参考最下面的链接
| .proto Type | Go Type |
|---|---|
| double | float64 |
| float | float32 |
| int32 | int32 |
| int64 | int64 |
| uint32 | uint32 |
| uint64 | uint64 |
| bool | bool |
| string | string |
| bytes | []byte |
枚举
- 使用
enum关键字 - 编号从0开始
// 枚举,编号从0开始。
enum ResultType {
Success = 0;
Failed = 1;
}
// 在 message 里使用枚举
// 定义一个响应结构体
message StringResponse {
string result = 1;
ResultType result_type = 2;
}
嵌套
一般用于多条数据传递或分页数据等操作。
- 使用
repeated关键字
message UserItem {
int64 id = 1;
string user_name = 2;
int32 age = 3;
string passwd = 4;
}
message UserListResponse {
string tag = 1;
repeated UserItem user_list = 2;
}
protoc 插件安装
protoc 工具可将 protobuf 文件生成 golang 代码
下载 protoc 工具,选择对应的操作系统版本
https://github.com/protocolbuffers/protobuf/releases

下载完后,加入到环境变量或path中, 保证全局可用。
验证: protoc --version
安装依赖包
# 安装 golang 的proto工具包
go get -u github.com/golang/protobuf/proto
# 安装 goalng 的proto编译支持
go get -u github.com/golang/protobuf/protoc-gen-go
# 安装 GRPC 包
go get -u google.golang.org/grpc
生成 go 代码
hello.proto文件的当前目录下--go_out表示加载插件grpc- 对
hello.proto文件进行编译加载,生成hello.pb.go文件
protoc --go_out=plugins=grpc:. hello.proto
也可以制作shell脚本
gen.sh脚本名称
#!/usr/bin/env bash
set -x
# 第一步: 安装 protoc 插件
# 打开下面URL, 跟据自己的系统选择对应的 protoc-3.x.x-linux|osx|win
# https://github.com/protocolbuffers/protobuf/releases
# 下载完后,加入到环境变量或path中, 保证全局可用。
# 验证: protoc --version
# 第二步:引用 proto, protoc-gen-go, grpc 共3个工具包
# 安装 golang 的proto工具包
# go get -u github.com/golang/protobuf/proto
# 安装 goalng 的proto编译支持
# go get -u github.com/golang/protobuf/protoc-gen-go
# 安装 GRPC 包
# go get -u google.golang.org/grpc
protoc --go_out=plugins=grpc:. *.proto