ProtocolBuffer入门和使用

news2024/11/18 5:47:03

<<<<<<< HEAD

基础

入门

img

优势

  • protocol buffer主要用于结构化数据串行化的灵活、高效、自动的方法(简单来说就是结构化数据的可串行化传输,类似JSON、XML等)。
    • 比XML解析更快:解析的层数更少,所以更快
    • 比XML数据包体积更小:采用varint编码
  • 用protocol编译器生成特定语言的源代码,实现数据模型跨语言串行化;
    • 使用对应语言的生成器+Protocol编译器即可编译出对应语言的代码
  • protocol是grpc推荐的序列化和反序列语言、grpc又是k8s推荐的rpc方式;

文档

  • 中文:GitHub - lixiangyun/protobuf_doc_ZH_CN: 中文手册
  • 官方:官方文档

基础语法

  • 注释使用//
  • 字段默认值为零值、可以通过[default = 10]自定义默认值
  • 支持枚举类型
  • extend特性来让你声明一些Tags值来供第三方扩展使用、或者弃用该字段
  • 数据模式:只需要通过message 数据模式名{}字段
  • 每个字段由:限制类型+类型+字段名+编号确定
    • 编号(顺序号)
      • **字段编号在1-15之间占用一个字节进行编码,**16-2047范围内的占用两个字节进行编码。因此在进行字段编码的时候最好将常用的字段用1-15进行编码,这样可以节省占用的空间
  • 生成器选项
    • optimize_for (file option): 可以设置的值有**SPEED, CODE_SIZE, 或 LITE_RUNTIME**. 不同的选项会以下述方式影响C++, Java代码的生成
      • SPEED (默认): protocol buffer编译器将会生成序列化,语法分析和其他高效操作消息类型的方式.这也是最高的优化选项.确定是生成的代码比较大.
      • CODE_SIZE: protocol buffer编译器将会生成最小的类,但是比SPEED运行速度要慢
      • LITE_RUNTIME: protocol buffer编译器将会生成只依赖"lite" runtime library (libprotobuf-lite instead of libprotobuf)的类. lite运行时库比整个库更小但是删除了例如descriptors 和 reflection等特性. 这个选项通常用于手机平台的优化.

核心概念

  • varintzigzag编码:Protocol默认使用varint编码,负数使用zigzag编码
    • varint编码:通过首位标识是否还有数据**,每个字节首位表示后面是否还有字节,而后7位表示数据。**
      • img
    • zigzag编码:由于负数不能使用varint编码,所以首先按照下表中的规律,将数据全部转化成正数,然后再用varint进行编码。
      • img
  • .proto文件:保存数据模型,可以导出并且被外部.proto文件导入,相当于一个xml文件;
  • 数据模型:在Protocol中数据模型的定义主要包括
    • 普通field
    • 数据模型嵌套
  • field
    • 限制类型:在Protocol中主要有三种类型:
      • required:必须
      • optional:可选
      • repeated:可重复(类似数组)
    • 顺序号(tags)
      • **每一个字段都有一个独一无二的数值类型的Tag;**不允许重复、不应该也不要在更新时删除无效字段然后或者替换新字段使用该顺序号
    • 字段类型
message test {
	//必须有字段,默认为lili;顺序号为1
	required string name = 1 [DEFAULT = "lili"];
    //可选字段
    optional string password = 2;
    //数组
    repeated int32 alias = 3;
}

Field

  • 给不同的元素以相同的alias,但是需要指定option allow_alias = true;

字段类型映射表

字段类型转换表(基本和go的内置数据类型是一一映射,除了没有map)

ProtocolJavaGo
int32intint32
int64longint64
doubledoublefloat64
floatfloatfloat32
uint32、uint64uint、ulonguint32、uint64
boolbooleanbool
stringStringstring
mapHashMapmap
bytesByteString[]byte
sfixed32\64、fixed32\64int\long、uint\ulongint32\64、uint32\64
  • Map 字段不能使用repeated关键字修饰

枚举类型

  • 枚举类型的第一个值初始化为0,
  • 在message中使用枚举类型,必须要给定一个为0的值
message SearchRequest {
	option allow_alias = true;
  string query = 1;
  int32 page_number = 2;
  int32 result_per_page = 3;
  enum Corpus {
    UNIVERSAL = 0;
    WEB = 1;
    IMAGES = 2;
    LOCAL = 3;
    NEWS = 4;
    PRODUCTS = 5;
    VIDEO = 6;
  }
  Corpus corpus = 4;
}

方法

  • Protocol定义方法(函数)的方式为:service serviceName{}
  • 定义rpc方法:rpc methodName (参数类型) returns (返回值类型)
message requestMessage {
  optional int32 code = 1;
  optional string message = 2;
}

message responseMessage {
  optional int32 code = 1;
  optional string message = 2;
}


service UserService {
  rpc test(requestMessage) returns (responseMessage);
}

import机制

  • 导入数据模型时,如果不在一个文件需要通过import导入

  • import必须指定在执行protocol命令的目录为基点,否则需要通过import public机制导入

    • 编译器就会在某些固定目录下查询import的proto文件(具体在命令行编译的时候,由-I/—proto_path指定)\
    • 如果上述路径找不到,编译器会在调用路径进行查找。通常将—proto_path设置为项目的根目录
    import "xxx"
    import public "xxx"
    

命令

  • proto --help:获取帮助
  • proto --XXX_out:将proto文件编译为xxx类型的源代码*(go语言需要安装插件才能实现)*
    • --go-grpc_out: 安装go-grpc插件后,可以将proto文件生成go的grpc代码
protoc --go_out=输出目录(数据模型) --go-grpc_out=输出目录(grpc方法) *.proto #输出文件:*.proto表示输出全部proto文件

使用

基本使用

  • 首先安装Protocol buffer编译器
  • 安装对应语言生成器

go例子

//protoc版本
syntax = "proto3";

//包名
package grpc;

//输出包
option go_package ="../grpc";

//数据模型
message requestMessage {
  optional int32 code = 1;
  optional string message = 2;
}

message responseMessage {
  optional int32 code = 1;
  optional string message = 2;
}

//grpc方法
service UserService {
  rpc test(requestMessage) returns (responseMessage);
}

输出go代码

#在当前文件目录下执行
protoc -I=. --go_out=. --go-grpc_out=. ./*.proto

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wHRIablp-1681966664637)(ProtocolBuffer.assets/image-20220614102631349.png)]

Proto3

image-20220614155653530

内置数据结构

timestamp和duration

  • 时间类型

any

  • 任意类型,所有实现了proto.Message的结构体;所有消息都会自动实现该接口;
    • 在go中可以通过anypb.Any使用[]byte类型的默认实现
  • 自定义实现了proto.Message接口的结构体

empty

  • 空类型,在没有参数或者返回值的方法需要类型为指定为empty

Oneof

  • oneof内的field只能有一个字段填充
  • oneof字段就像可选字段, 除了它们会共享内存设置其中一个字段会清除其它字段。
  • 使用case()或者WhichOneof() 方法检查哪个oneof字段被设置
//数据模型
message requestMessage {
  //普通字段
  optional int32 code = 1;
  //map字段  
  map<string,google.protobuf.Any> other = 10;
  //内置字段
  google.protobuf.Timestamp sendTime = 11;
  google.protobuf.Duration createTime = 12;
  optional google.protobuf.Any data = 3;
  //oneof
  oneof testOneof {
    string name = 4;
    string alais = 9;
  }
}

内置API

https://cloud.google.com/apis/design/glossary

=======

基础

入门

img

优势

  • protocol buffer主要用于结构化数据串行化的灵活、高效、自动的方法(简单来说就是结构化数据的可串行化传输,类似JSON、XML等)。
    • 比XML解析更快:解析的层数更少,所以更快
    • 比XML数据包体积更小:采用varint编码
  • 用protocol编译器生成特定语言的源代码,实现数据模型跨语言串行化;
    • 使用对应语言的生成器+Protocol编译器即可编译出对应语言的代码
  • protocol是grpc推荐的序列化和反序列语言、grpc又是k8s推荐的rpc方式;

文档

  • 中文:GitHub - lixiangyun/protobuf_doc_ZH_CN: 中文手册
  • 官方:官方文档

基础语法

  • 注释使用//
  • 字段默认值为零值、可以通过[default = 10]自定义默认值
  • 支持枚举类型
  • extend特性来让你声明一些Tags值来供第三方扩展使用、或者弃用该字段
  • 数据模式:只需要通过message 数据模式名{}字段
  • 每个字段由:限制类型+类型+字段名+编号确定
    • 编号(顺序号)
      • **字段编号在1-15之间占用一个字节进行编码,**16-2047范围内的占用两个字节进行编码。因此在进行字段编码的时候最好将常用的字段用1-15进行编码,这样可以节省占用的空间
  • 生成器选项
    • optimize_for (file option): 可以设置的值有**SPEED, CODE_SIZE, 或 LITE_RUNTIME**. 不同的选项会以下述方式影响C++, Java代码的生成
      • SPEED (默认): protocol buffer编译器将会生成序列化,语法分析和其他高效操作消息类型的方式.这也是最高的优化选项.确定是生成的代码比较大.
      • CODE_SIZE: protocol buffer编译器将会生成最小的类,但是比SPEED运行速度要慢
      • LITE_RUNTIME: protocol buffer编译器将会生成只依赖"lite" runtime library (libprotobuf-lite instead of libprotobuf)的类. lite运行时库比整个库更小但是删除了例如descriptors 和 reflection等特性. 这个选项通常用于手机平台的优化.

核心概念

  • varintzigzag编码:Protocol默认使用varint编码,负数使用zigzag编码
    • varint编码:通过首位标识是否还有数据**,每个字节首位表示后面是否还有字节,而后7位表示数据。**
      • img
    • zigzag编码:由于负数不能使用varint编码,所以首先按照下表中的规律,将数据全部转化成正数,然后再用varint进行编码。
      • img
  • .proto文件:保存数据模型,可以导出并且被外部.proto文件导入,相当于一个xml文件;
  • 数据模型:在Protocol中数据模型的定义主要包括
    • 普通field
    • 数据模型嵌套
  • field
    • 限制类型:在Protocol中主要有三种类型:
      • required:必须
      • optional:可选
      • repeated:可重复(类似数组)
    • 顺序号(tags)
      • **每一个字段都有一个独一无二的数值类型的Tag;**不允许重复、不应该也不要在更新时删除无效字段然后或者替换新字段使用该顺序号
    • 字段类型
message test {
	//必须有字段,默认为lili;顺序号为1
	required string name = 1 [DEFAULT = "lili"];
    //可选字段
    optional string password = 2;
    //数组
    repeated int32 alias = 3;
}

Field

  • 给不同的元素以相同的alias,但是需要指定option allow_alias = true;

字段类型映射表

字段类型转换表(基本和go的内置数据类型是一一映射,除了没有map)

ProtocolJavaGo
int32intint32
int64longint64
doubledoublefloat64
floatfloatfloat32
uint32、uint64uint、ulonguint32、uint64
boolbooleanbool
stringStringstring
mapHashMapmap
bytesByteString[]byte
sfixed32\64、fixed32\64int\long、uint\ulongint32\64、uint32\64
  • Map 字段不能使用repeated关键字修饰

枚举类型

  • 枚举类型的第一个值初始化为0,
  • 在message中使用枚举类型,必须要给定一个为0的值
message SearchRequest {
	option allow_alias = true;
  string query = 1;
  int32 page_number = 2;
  int32 result_per_page = 3;
  enum Corpus {
    UNIVERSAL = 0;
    WEB = 1;
    IMAGES = 2;
    LOCAL = 3;
    NEWS = 4;
    PRODUCTS = 5;
    VIDEO = 6;
  }
  Corpus corpus = 4;
}

方法

  • Protocol定义方法(函数)的方式为:service serviceName{}
  • 定义rpc方法:rpc methodName (参数类型) returns (返回值类型)
message requestMessage {
  optional int32 code = 1;
  optional string message = 2;
}

message responseMessage {
  optional int32 code = 1;
  optional string message = 2;
}


service UserService {
  rpc test(requestMessage) returns (responseMessage);
}

import机制

  • 导入数据模型时,如果不在一个文件需要通过import导入

  • import必须指定在执行protocol命令的目录为基点,否则需要通过import public机制导入

    • 编译器就会在某些固定目录下查询import的proto文件(具体在命令行编译的时候,由-I/—proto_path指定)\
    • 如果上述路径找不到,编译器会在调用路径进行查找。通常将—proto_path设置为项目的根目录
    import "xxx"
    import public "xxx"
    

命令

  • proto --help:获取帮助
  • proto --XXX_out:将proto文件编译为xxx类型的源代码*(go语言需要安装插件才能实现)*
    • --go-grpc_out: 安装go-grpc插件后,可以将proto文件生成go的grpc代码
protoc --go_out=输出目录(数据模型) --go-grpc_out=输出目录(grpc方法) *.proto #输出文件:*.proto表示输出全部proto文件

使用

基本使用

  • 首先安装Protocol buffer编译器
  • 安装对应语言生成器

go例子

//protoc版本
syntax = "proto3";

//包名
package grpc;

//输出包
option go_package ="../grpc";

//数据模型
message requestMessage {
  optional int32 code = 1;
  optional string message = 2;
}

message responseMessage {
  optional int32 code = 1;
  optional string message = 2;
}

//grpc方法
service UserService {
  rpc test(requestMessage) returns (responseMessage);
}

输出go代码

#在当前文件目录下执行
protoc -I=. --go_out=. --go-grpc_out=. ./*.proto

image-20220614102631349

Proto3

image-20220614155653530

内置数据结构

timestamp和duration

  • 时间类型

any

  • 任意类型,所有实现了proto.Message的结构体;所有消息都会自动实现该接口;
    • 在go中可以通过anypb.Any使用[]byte类型的默认实现
  • 自定义实现了proto.Message接口的结构体

empty

  • 空类型,在没有参数或者返回值的方法需要类型为指定为empty

Oneof

  • oneof内的field只能有一个字段填充
  • oneof字段就像可选字段, 除了它们会共享内存设置其中一个字段会清除其它字段。
  • 使用case()或者WhichOneof() 方法检查哪个oneof字段被设置
//数据模型
message requestMessage {
  //普通字段
  optional int32 code = 1;
  //map字段  
  map<string,google.protobuf.Any> other = 10;
  //内置字段
  google.protobuf.Timestamp sendTime = 11;
  google.protobuf.Duration createTime = 12;
  optional google.protobuf.Any data = 3;
  //oneof
  oneof testOneof {
    string name = 4;
    string alais = 9;
  }
}

内置API

https://cloud.google.com/apis/design/glossary

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/451708.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【技术发烧】MySqlServer,MySQL WorkBench安装详细教程

目录 一.下载安装MySQLSever 1.下载 2.安装 1.解压 2.编写配置文件 二.初始化数据库 1.以管理员身份打开命令提示符 2.初始化数据库 3.安装mysql服务并启动 4.连接MySQL 5. 修改密码 三.MySQL WorkBench下载 一.下载安装MySQLSever 1.下载 下载路径&#xff1a;https:/…

java导入导出excel数据图片合成工具

目录 java导出和导入excel数据java读取excel数据java数据导出成excel表格 java服务端图片合成的工具 java导出和导入excel数据 可以使用hutool的ExcelUtil工具。 在项目中加入以下依赖&#xff1a; <dependency><groupId>cn.hutool</groupId><artifactI…

【计算机基础】绝对路径和相对路径

目录 一.绝对路径 二.相对路径 例如 三.举例 一.绝对路径 绝对路径是指从根目录开始的完整路径&#xff0c;包括所有父目录的路径&#xff0c;直到目标文件或者目录 所在的位置。 全文件名全路径文件名绝对路经完整的路径 例如&#xff0c;在windows系统中&#xff0c;绝…

《Linux基础》09. Shell 编程

Shell 编程 1&#xff1a;Shell 简介2&#xff1a;Shell 脚本2.1&#xff1a;规则与语法2.2&#xff1a;执行方式2.3&#xff1a;第一个 Shell 脚本 3&#xff1a;变量3.1&#xff1a;系统变量3.2&#xff1a;用户自定义变量3.2.1&#xff1a;规则3.2.2&#xff1a;基本语法3.2…

Python自动发送消息小脚本,可用于各种聊天框~

作者主页&#xff1a;爱笑的男孩。的博客_CSDN博客-深度学习,YOLO,活动领域博主爱笑的男孩。擅长深度学习,YOLO,活动,等方面的知识,爱笑的男孩。关注算法,python,计算机视觉,图像处理,深度学习,pytorch,神经网络,opencv领域.https://blog.csdn.net/Code_and516?typecollect 个…

安装k3s

k3s官方文档 architecture quick start 概述&#xff1a;k3s一个轻量级的kubernetes,因资源消耗知识kubernetes的一半&#xff0c;故取名k3s k3s的node分为 server node 和agent node: server node: 可以运行kubectl等命令&#xff0c;且包含 agent node的功能。agent node:…

【升级】专为小白设计的TypeScript入门课无密拟把疏狂图一醉

TypeScript&#xff1a;JavaScript的超集&#xff0c;提高代码可靠性和可维护性 【升级】专为小白设计的TypeScript入门课 download&#xff1a;https://www.666xit.com/3817/ 随着现代Web应用程序的复杂性增加&#xff0c;使用JavaScript编写大型项目变得越来越困难。TypeS…

Centos 安装MySQL

CentOS 安装 MySQL 1. 安装 VMware 以及 CentOS2. 安装 docker2.1 卸载&#xff08;可选&#xff09;2.2 安装 Docker2.3 启动 Docker2.4.配置镜像加速2.5 设置 Docker 开机自启 3. 安装 MySQL3.1 从docker镜像仓库中拉取mysql镜像3.2 创建实例&#xff0c;并启动3.3.查看docke…

20230422 | 24. 两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题 02.07. 链表相交、142. 环形链表 II

1、24. 两两交换链表中的节点 初始时&#xff0c;cur指向虚拟头结点&#xff0c;然后进行如下三步&#xff1a; 操作之后&#xff0c;链表如下&#xff1a; 看这个可能就更直观一些了&#xff1a; /*** Definition for singly-linked list.* public class ListNode {* i…

camunda流程引擎send task节点用途

Camunda的Send Task用于向外部系统或服务发送消息。消息可以是同步或异步的&#xff0c;可以发送到队列、主题或其他类型的消息中间件。Send Task通常用于将消息发送到外部系统&#xff0c;而无需等待响应或结果。相反&#xff0c;它只是向外部系统发出信号&#xff0c;通知其执…

使用Storm proxies动态代理IP如何正确设置使用海外IP代理?

正确设置使用海外IP代理需要以下几个步骤&#xff1a; 获取代理服务器的IP地址和端口号&#xff1a;可以在代理服务提供商的网站上或者代理IP池中获取相应的信息。在计算机或移动设备上配置代理服务器&#xff1a;打开网络设置&#xff0c;找到代理服务器的设置选项&#xff0c…

10. 并查集

10. 并查集 并查集是一种树型的数据结构 &#xff0c;并查集可以高效地进行如下操作&#xff1a; 查询元素p和元素q是否属于同一组 合并元素p和元素q所在的组 10.1 并查集结构 并查集也是一种树型结构&#xff0c;但这棵树跟我们之前讲的二叉树、红黑树、B树等都不一样&…

项目风险管理的5个重点 不得不重视

风险管理持续贯穿软件项目的整个生命周期&#xff0c;其对项目的影响非常大&#xff0c;那么如何高效管理项目风险&#xff1f;5个风险管理重点如下&#xff1a; 1、风险识别和科学分析 需要对风险发生的可能性进行分析&#xff0c;判断风险对项目影响可能性并记录其特征&#…

【 初识 Spring MyBatis 查询数据库 】

文章目录 一、概念二、为什么学 MyBatis三、怎么学 MyBatis四、第⼀个MyBatis查询4.1 MyBatis 在整个框架中的定位4.2 准备&#xff1a;创建库和表4.3 配置 MyBatis 开发环境4.3.1 添加MyBatis框架⽀持4.3.1.1 ⽼项⽬添加支持扩展&#xff1a;在⽼项⽬中快速添加框架 - EditSta…

ChatGPT 速通手册——不同相似度算法的分值介绍

不同相似度算法的分值介绍 在信息大暴涨的今天&#xff0c;人类已经不可能出现通才、全才式的人物。利用 ChatGPT 来询问我们未知领域的知识是很好的习惯和用法。但对严肃知识的学习&#xff0c;一定要通过权威来源复核审校&#xff0c;保证自己所学知识的正确。否则&#xff…

【安全学习笔记】信息收集-CDN相关的技术(CDN绕过)

CDN相关的技术&#xff08;CDN绕过&#xff09; CDN&#xff1a;内容分发网络&#xff0c;它是构建在现有网络基础之上的智能虚拟网络&#xff0c;依靠部署在各地的边缘服务器&#xff0c;通过中心平台的负载均衡、内容分发、调度等功能模块&#xff0c;使用户就近获取所需内容…

104. 二叉树的最大深度【75】

难度等级&#xff1a;容易 上一篇算法&#xff1a; 101. 对称二叉树【74】 力扣此题地址&#xff1a; 104. 二叉树的最大深度 - 力扣&#xff08;Leetcode&#xff09; 1.题目&#xff1a;104. 二叉树的最大深度 给定一个二叉树&#xff0c;找出其最大深度。 二叉树的深度为根…

【并发编程】Java并发之关键字synchronized使用和原理

文章目录 前言一、synchronized的四种应用方式修饰一个代码块修饰一个方法修饰一个静态的方法修饰一个类 二、synchronized底层语义原理三、理解Java对象头与Monitor四、synchronized代码块底层原理五、synchronized方法底层原理六、Java虚拟机对synchronized的优化偏向锁轻量级…

Finetuner+:为企业实现大模型微调和私有化部署

如 ChatGPT、GPT4 这样的大型语言模型就像是你为公司请的一个牛人顾问&#xff0c;他在 OpenAI、Google 等大公司被预训练了不少的行业内专业知识&#xff0c;所以加入你的公司后&#xff0c;你只需要输入 Prompt 给他&#xff0c; 介绍一些业务上的背景知识&#xff0c;他就能…

清除Github提交历史commit

如果提交代码到Github仓库时&#xff0c;不小心把敏感信息&#xff08;比如登陆账号和登陆密码&#xff09;提交了上去&#xff0c;尽快处理。 git log 查看提交记录 git log定位你误操作的那一个版本 ‘be757abcb2b6c2b86b489384aeb4619d9b8c94c7’ 比如这个是你提交版本的…