go GRPC

go GRPC
King Leonardogo GRPC
下载依赖
protobuf
protobuf 是核心可执行文件
- 安装
protobuf,这里使用scoop安装:scoop install protobuf - 确认安装: 执行
protoc --version
语言相关
要根据不同的语言安装对应的插件, 以生成对应的代码.
其中: protoc-gen-go 用于生成用于生成消息结构体, 生成的代码通常放在 xxx.pb.go 文件中. ``protoc-gen-go-grpc用于生成服务接口和客户端, 生成的代码通常放在xxx_grpc.pb.go` 文件中
- 项目目录下安装库
go get google.golang.org/grpc - 安装插件
go install google.golang.org/protobuf/cmd/protoc-gen-go@latest以及go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest, 这是下载到$GOPATH/bin下的全局命令
proto文件的编写
1 | // 表明生成的go文件 "目录 ; 包名" |
在 .proto 文件目录下执行
1 | protoc --go_out=. hello.proto |
proto文件介绍
message
消息就是需要传输的数据格式的定义, 类似于结构体, 每个字段都有一个名字和类型
字段规则
required: 必填,不设置会导致异常,protobuf2中使用,protobuf3中删去
optional: 可选,protobuf3中没有required和optional, 默认都是optional
repeated: 可重复字段, 重复的值的顺序会被保留, 在go中重复的会被定义为切片
消息号
在消息体定义中,每个字段都必须有一个唯一的标识号,从 $[1, 2^{29}-1]$ 范围内的一个整数
嵌套消息
可以在其他消息中定义,使用消息类型
1
2
3
4
5
6
7
8message PersonInfo {
message Person {
string name = 1;
int32 height = 2;
repeated int32 weight = 3;
}
repeated Person info = 1;
}或者将 Person 定义在外部, 直接使用即可
1
2
3
4
5
6
7
8message Person {
string name = 1;
int32 height = 2;
repeated int32 weight = 3;
}
message PersonInfo {
repeated Person info = 1;
}service
如果要将消息类型用在RPC系统中, 可以在
.proto文件中定义一个RPC服务接口, protobuf buffer 编译器将会根据所选的不同语言生成服务接口的代码及存根1
2
3
4service SearchService{
# rpc 服务函数名(参数) 返回 (返回参数)
rpc Search(SearchRequest) returns (SearchResponse)
}
服务端编写
- 创建gRPC Server对象
- 将server(其包含需要被调用的服务端接口)注册到gRPC Server的内部注册中心. 这样可以在接收到请求时, 通过内部的服务发现, 发现该服务端接口并转接进行逻辑处理
- 创建 Listen, 监听 TCP 端口
- gRPC Server 开始 lis.Accept, 直到 Stop
客户端编写
- 创建与给定目标(服务端)的连接交互
- 创建server的客户端对象
- 发送 RPC 请求, 等待同步响应, 得到回调后的响应结果
- 输出响应结果
证书安装和使用
证书安装参考mk文档
服务端配置:
1 | // 使用证书,第一个是证书路径,第二个是私钥路径 |
客户端配置:
1 | // 带上TLS连接, 第一个是证书路径,第二个是服务器名称(避免服务器名称不匹配报错) |
Token
客户端定义token
1 | // 实现PerRPCCredentials接口 |
服务端获取token
1 | // 这是在对应的远程调用函数中实现 |



