golang之gRPC

发布时间 2023-10-10 17:02:34作者: X-Wolf

相关链接:

grpc:

https://grpc.io/docs/languages/go/quickstart/

 

protobuf:

https://protobuf.dev/programming-guides/proto3/

 

protobuf语法:

 

示例:

syntax = "proto3";


// 声明请求参数
message SearchRequest {
  string query = 1;
  int32 page = 2;
  int32 page_size = 3;
}

 

说明:

  1. 声明proto文件使用的语法版本,目前是proto2 和proto3, 如果不声明的话, 他会默认使用protocol2,并且语法声明必须是在非空格的第一行
  2. 声明数据使用message,里面定义参数的类型,名称,索引位置(注意从1开始), 以分号结尾
  3. 索引的取值范围为:1 ~ 536,870,911
  4. 索引的值必须保证唯一性

 

枚举类型:

enum Status {
  STATUS_UNSPECIFIED = 0;
  STATUS_OK = 1;
  STATUS_FAIL = 2;
}

 

通过enum关键字定义枚举类型,

  1. 枚举是一个Int32类型
  2. 第一个枚举类必须从0开始,可以使用XXX_UNSPECIFIED作为占位符
  3. 不推荐出现负数

 

 

 

字段标签:

optional:

 

  • FileOptions —— 文件级别
  • MessageOptions —— 消息级别
  • FieldOptions —— 字段级别
  • ServiceOptions —— service级别
  • MethodOptions —— method级别

 

 

repeated:只有标量,枚举,message类型可以被修饰使用

标识被重复人一次(包括0次),可标识当前修饰类型的变长数组

// repeated
message RepeatedMessage {
    repeated SearchRequest requests = 1;
    repeated Status status = 2;
    repeated int32 number = 3;
}

 

 

 

map:

message MapMessage{
    map<string, string> message = 1;
    map<string, SearchRequest> request = 2;
}

 

 

any:

any类型可以包含一个不需要指定类型的任意的序列化消息。要使用any类型,需要import google/protobuf/any.protoany类型字段的encode/decode交由各语言的运行时各自实现,例如在Go语言中可以这样读写any类型的字段:

 

...
import "google/protobuf/any.proto";
...
message AnyMessage {
    string message = 1;
    google.protobuf.Any details = 2;
}
...

 

 

oneof

 

 

 

 

 

 

Protocol buffer compiler安装

 

【源码】

自定义安装->linux/mac

# 1.卸载老版编译器
apt remove protobuf-compiler
# 2.下载并解压
wget https://github.com/protocolbuffers/protobuf/releases/download/v23.0/protoc-23.0-linux-x86_64.zip
unzip protoc-23.0-linux-x86_64.zip -d protoc-23.0
# 3.设置环境变量
export PATH="$PATH:/usr/local/src/protoc-23.0/bin"

# 4.测试
protoc --version
# libprotoc 23.0

 

window需要到github上下载压缩包到本地并将bin目录下的protoc.exe文件加入环境变量即可

https://github.com/protocolbuffers/protobuf/releases/tag/v23.4

 

 

 

Go 支持

# 1.安装
$ go install google.golang.org/protobuf/cmd/protoc-gen-go@latest

$ go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest

# 2.添加环境变量
export PATH="$PATH:$(go env GOPATH)/bin"

 

 

相关命令:

# 根据.proto文件,生成xxx.pb.go 和 xxx_grpc.pb.go
protoc --go_out=. --go_opt=paths=source_relative \
    --go-grpc_out=. --go-grpc_opt=paths=source_relative \
    helloworld/helloworld.proto

protoc -I=pb \
  --go_out=pb --go_opt=paths=source_relative \
  --go-grpc_out=pb --go-grpc_opt=paths=source_relative \
pb/addsrv.proto