Golang 微服务化 (3) - 使用 Protobuf 创建 rpc 结构

RPC

各个服务之间的调用, 需要统一的协议. Protobuf 和 Thrift 都是做类似的功能的, 目前感觉 Protobuf 好像使用的更广泛一些.

安全编译软件, 依赖库

编译支持 golang 的 Protobuf 程序, 需要安装 protocprotoc-gen-go

安装 protoc

https://github.com/protocolbuffers/protobuf/releases/latest 下载系统对应的最新版本.

安装 proto-gen-go

1
go install google.golang.org/protobuf/cmd/protoc-gen-go

$GOBIN (默认 $GOPATH/bin) 写入环境变量 $PATH.

定义 Protobuf 文件

service.go

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
syntax = "proto3";

package pb;

service StringHandler {
rpc Uppercase(UppercaseRequest) returns (UppercaseResponse) {}
...
}

message UppercaseRequest { string s = 1; }

message UppercaseResponse {
string v = 1;
string err = 2;
}

编译

1
protoc service.proto --go_out=./pb

使用

1
2
3
4
// 错误
var resp = UppercaseResponse{"ABC", ""}
// 正确
var resp = UppercaseResponse{"v": "ABC", "err": ""}

错误写法会报错, too few values in struct initializer, 解决方案就是初始化的时候显示使用属性名, 这样增加后期重新排序, 增加字段等的可扩展性.

VSCode 保存格式化提示缺少 clang-format 命令

mac 安装 clang-format, 注意不是 vscode 的 clang-format 插件.

1
brew install clang-format

参考: Clang 11 文档

参考资料

Donate - Support to make this site better.
捐助 - 支持我让我做得更好.