Contents

通用技术-Protobuf

protobuf 官网

概述

Protocol Buffers 是一种独立于语言、独立于平台的可扩展机制,用于序列化结构化数据。

编程指南

语言指南(proto 3)

定义消息类型

1
2
3
4
5
6
7
8
//默认proto2,显式声明proto3
syntax = "proto3";

message SearchRequest {
  string query = 1;
  int32 page_number = 2;
  int32 result_per_page = 3;
}

指定字段类型:可以为字段指定复合类型,包括枚举 和其他消息类型

分配字段编号:每个字段都有一个唯一的编号。1 到 15 范围内的字段编号需要一个字节进行编码,包括字段编号和字段类型。16 到 2047 范围内的字段编号占用两个字节。

指定字段规则;

  • singular:默认字段规则,除非它是默认值,否则它将被序列化。
  • optional:可以检查该值是否已明确设置。该字段已设置,并包含一个明确设置或从线路解析的值,将被序列化;该字段未设置,并将返回默认值,它不会被序列化。
  • repeated:此字段类型可以在格式正确的消息中重复零次或多次。重复值的顺序将被保留。
  • map:这是成对的键/值字段类型。

注释与C/C++一致

1
2
3
4
5
6
7
8
/* SearchRequest represents a search query, with pagination options to
 * indicate which results to include in the response. */

message SearchRequest {
  string query = 1;
  int32 page_number = 2;  // Which page number do we want?
  int32 result_per_page = 3;  // Number of results to return per page.
}

保留字段:指定已删除字段的字段编号(和/或名称,这也可能导致 JSON 序列化问题)是reserved.

1
2
3
4
message Foo {
  reserved 2, 15, 9 to 11;
  reserved "foo", "bar";
}

教程

go

定义协议格式

1
2
3
4
5
syntax = "proto3";
//该proto文件属于的包
package tutorial;

import "google/protobuf/timestamp.proto";

go_package选项定义包的导入路径

1
option go_package = "github.com/protocolbuffers/protobuf/examples/go/tutorialpb";

编译你的协议缓冲区

安装编译器

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

编译

1
protoc -I=$SRC_DIR --go_out=$DST_DIR $SRC_DIR/addressbook.proto

protobuf与grpc的关系

博客园 路人的技术

gRPC 是 google 家公开的高性能 RPC 调用框架,号称高效,支持广(题外话,似乎度娘也开源了一款不错的 RPC 框架)

protobuf是服务它的一种序列化方法

 |