gRPC+ProtoBuf-微服务传输协议
微服务中,常见的传输协议有
HTTP+Json
、gRPC+ProtoBuf
。
同HTTP+Json
一样,gRPC+ProtoBuf
同样适用于跨语言传输。前提是,使用相同的协议原文件(.proto)
生成各自的协议文件(.pb.go\.pb.cc\.java)
协议格式
user.proto
// proto 协议版本
syntax = "proto3";
package user;
// 包路径
option go_package = "common/proto/user";
// 编写方法
service UserService {
// 获取列表
rpc GetUserList(GetUserListReq) returns(GetUserListRes) {
}
// ...
}
// 请求体
message GetUserListReq{
// 请求参数
// 类型 参数名 参数序号(从1开始,不能重复)
// 序号是协议的一部分,并不会对性能有过多影响,不重复即可
int64 Page = 1;
int64 PageSize = 2;
int64 Sit = 3;
}
message GetUserListRes{
int32 ErrCode = 1;
string ErrMsg = 2;
// repeated 表名是数组
repeated SysUser sysUsers = 3;
int32 Total = 4;
}
// 结构体可循环引用
message SysUser{
string ID = 1;
string CreatedAt = 2;
string UpdatedAt = 3;
string DeletedAt = 4;
string UUID = 5;
string Username = 6;
string Password = 7;
string NickName = 8;
string HeaderImg = 9;
}
编译命令
# Go
protoc -I . --go_out=. ./common/proto/user/user.proto
# Java
protoc -I . --java_out=. ./common/proto/user/user.proto
# C++
protoc -I . --cpp_out=. ./common/proto/user/user.proto
编译
其中分别为Java\c++\go的编译后文件。
user.proto
为原协议文件。
使用相同的源协议文件,才能跨语言通讯。