【grpc03】proto文件介绍
目录
message介绍
字段规则
标识号
字段映射
默认值
定义多个消息类型
嵌套消息
定义服务(Service)
message介绍
- protobuf中定义一个消息类型是通过关键字
message
字段指定的。 消息就是需要传输的数据格式的定义。 - message关键字类似于C++中的class,Java中的class,go中的struct
- 在消息中承载的数据分别对应于每一个字段,其中每个字段都有一个名字和一种类型 。
- 一个proto文件中可以定义多个消息类型
字段规则
required
:消息体中必填字段,不设置会导致编解码异常。在protobuf2中使用,protobuf3被删除optional
: 消息体中可选字段。protobuf3没有了required,optional等说明关键字,都默认为optionalrepeated
: 消息体中可重复字段,重复的值的顺序会被保留在go中重复的会被定义为切片。
message User {string username = 1;int32 age = 2;optional string password = 3;repeated string address = 4;
}
标识号
在消息体的定义中,每个字段都必须要有一个唯一的标识号,标识号是[0,2^29-1]范围内的一个整数。
message Person { string name = 1; // (位置1)int32 id = 2; optional string email = 3; repeated string phones = 4; // (位置4)
}
以Person为例,name=1,id=2, email=3, phones=4 中的1-4就是标识号。
字段映射
proto Type | Notes | C++ Type | Python Type | Go Type |
---|---|---|---|---|
double | double | float | float64 | |
float | float | float | float32 | |
int32 | 使用变长编码,对于负值的效率很低,如果你的域有 可能有负值,请使用sint64替代 | int32 | int | int32 |
uint32 | 使用变长编码 | uint32 | int/long | uint32 |
uint64 | 使用变长编码 | uint64 | int/long | uint64 |
sint32 | 使用变长编码,这些编码在负值时比int32高效的多 | int32 | int | int32 |
sint64 | 使用变长编码,有符号的整型值。编码时比通常的 int64高效。 | int64 | int/long | int64 |
fixed32 | 总是4个字节,如果数值总是比总是比228大的话,这 个类型会比uint32高效。 | uint32 | int | uint32 |
fixed64 | 总是8个字节,如果数值总是比总是比256大的话,这 个类型会比uint64高效。 | uint64 | int/long | uint64 |
sfixed32 | 总是4个字节 | int32 | int | int32 |
sfixed32 | 总是4个字节 | int32 | int | int32 |
sfixed64 | 总是8个字节 | int64 | int/long | int64 |
bool | bool | bool | bool | |
string | 一个字符串必须是UTF-8编码或者7-bit ASCII编码的文 本。 | string | str/unicode | string |
bytes | 可能包含任意顺序的字节数据。 | string | str | []byte |
默认值
protobuf3 删除了 protobuf2 中用来设置默认值的 default 关键字,取而代之的是protobuf3为各类型定义的默认值,也就是约定的默认值,如下表所示:
类型 | 默认值 |
---|---|
bool | false |
整型 | 0 |
string | 空字符串"" |
枚举enum | 第一个枚举元素的值,因为Protobuf3强制要求第一个枚举元素的值必须是0,所以枚举的默认值就是0; |
message | 不是null,而是DEFAULT_INSTANCE |
定义多个消息类型
一个proto文件中可以定义多个消息类型
message UserRequest {string username = 1;int32 age = 2;optional string password = 3;repeated string address = 4;
}message UserResponse {string username = 1;int32 age = 2;optional string password = 3;repeated string address = 4;
}
嵌套消息
可以在其他消息类型中定义、使用消息类型,在下面的例子中,Person消息就定义在PersonInfo消息内,如 :
message PersonInfo {message Person {string name = 1;int32 height = 2;repeated int32 weight = 3;} repeated Person info = 1;
}
如果你想在它的父消息类型的外部重用这个消息类型,你需要以PersonInfo.Person的形式使用它,如:
message PersonMessage {PersonInfo.Person info = 1;
}
当然,你也可以将消息嵌套任意多层,如 :
message Grandpa { // Level 0message Father { // Level 1message son { // Level 2string name = 1;int32 age = 2;}} message Uncle { // Level 1message Son { // Level 2string name = 1;int32 age = 2;}}
}
定义服务(Service)
如果想要将消息类型用在RPC系统中,可以在.proto文件中定义一个RPC服务接口,protocol buffer 编译器将会根据所选择的不同语言生成服务接口代码及存根。
service SearchService {//rpc 服务的函数名 (传入参数)返回(返回参数)rpc Search (SearchRequest) returns (SearchResponse);
}
上述代表表示,定义了一个RPC服务,该方法接收SearchRequest返回SearchResponse
【grpc03】proto文件介绍相关推荐
- Caffe源码中caffe.proto文件分析
Caffe源码(caffe version:09868ac , date: 2015.08.15)中有一些重要文件,这里介绍下caffe.proto文件. 在src/caffe/proto目录下有一个 ...
- proto的介绍和基础使用
内容摘抄自书籍<Netty redis zookeeper高并发实战> Protobuf使用 proto文件来预先定义的消息格式.数据包是按照proto文件所定义的消息格式完成二进制码流的 ...
- Protobuf之proto文件编写规则
一. 简单介绍 protobuf文件:就是定义你要的消息(类似java中的类)和消息中的各个字段及其数据类型(类似java类中的成员变量和他的数据类型) 二. Protobuf消息定义 1.消息由至少 ...
- Ectd Raft 模块介绍(二):目录文件介绍
目录文件介绍 Etcd Raft 模块代码位于 Etcd 源代码库的 raft 目录下 以下是 raft 目录下的目录结构(去除了文档.test 代码): . ├── bootstrap.go ├── ...
- protobuf教程(一)---引入其他proto文件
本章主要介绍了如何在 proto 文件中引入其他 proto 文件. 1. 概述 Protocol buffers 是一种语言无关.平台无关的可扩展机制或者说是数据交换格式,用于序列化结构化数据.与 ...
- 编译proto文件python_Python:如何将proto文件编译为python文件
说明: 最近刚刚开始接触接口的编写,用的是有关grpc远程调用.我还没太搞明白接口是怎么回事,但我的初步目标可以简单理解为生成两个python文件.比如你的proto文件名是ABC,那么我的目标是生成 ...
- iOS 集成Protobuf,转换proto文件
原文地址:http://blog.csdn.net/hyq4412/article/details/54891038 附加Homebrew安装地址:https://brew.sh/index_zh-c ...
- proto文件导入mysql_导出mysql表结构生成grpc需要的proto文件工具
使用过grpc的同学都知道,写proto文件比较繁琐,尤其是写message,对应很多字段,为此写了一个简单的从mysql直接读取表结构,生成proto文件的工具. 工具的使用很简单,需要简单的配置, ...
- ProtoBuffer由.proto文件生成.cc/.h
ProtoBuffer由.proto文件生成.cc/.h 一:编译源码 下载地址:http://code.google.com/p/protobuf/downloads/list 下载后,根据编译说 ...
最新文章
- php 函数传值_传址_函数参数,php函数的传值与传址(引用)详解
- 93. 复原 IP 地址(回溯算法)
- python中random库中shuffle_[宜配屋]听图阁 - 详解Python中打乱列表顺序random.shuffle()的使用方法...
- Netflow的配置方法
- mysql数据库优化6_mysql数据库优化
- 占空比输出程序c语言,怎样利用c语言来实现占空比的设置?(单片机:SPCE061A)
- 神经网络matlab仿真,神经网络模型及其MATLAB仿真程序设计 周开利 等著 - 仿真模拟 - 小木虫 - 学术 科研 互动社区...
- 【数字信号调制】基于BPSK实现信号调制和解调含Matlab源码
- winform DevComponents.DotNetBar2 添加到工具栏方法
- 【推荐算法论文阅读】STAMP: Short-Term Attention/Memory Priority Model for Session-based Recommendation
- 奉劝各位应届毕业生,该打造你的技术影响力了,只会抄代码,该怎么办?
- Markdown 数学公式总结
- ayit第十周训练g题
- STM32驱动RC522读卡完整资料分享,包含原理图、PCB、驱动工程文件
- 境外服务器停机:原因、影响以及如何预防
- python实现奇异值分解_SVD(奇异值分解)Python实现
- ggbiplot | 带箭头的主成分分析(PCA)图绘制
- 名编辑电子杂志大师教程 | 怎样安装TTS朗读配音引擎?
- Sql Server数据库中的用户及权限配置,保障数据库安全
- 使用 Django 部署深度学习模型-2