gRPC和ProtoBuf

gRPC介绍

gRPC是一个高性能、开源且通用的RPC框架,它基于HTTP/2标准协议和Protocol Buffers进行数据序列化,支持多种编程语言。

rpc和http区别

  1. 传输协议:RPC可以基于TCP或HTTP协议,而HTTP服务则工作在HTTP协议之上。
  2. 效率和性能消耗:由于RPC可以使用自定义的TCP协议,请求报文体积可以更小,或者使用HTTP2协议来减少报文体积,从而提高传输效率。HTTP在1.1版本中可能包含较多无用信息,而2.0版本则可以简化封装,适合作为RPC使用。在性能消耗方面,RPC可以基于Thrift等高效二进制传输方式,而HTTP大多使用JSON,可能在字节大小和序列化耗时上更消耗性能。

ProtoBuf和json 对比

ProtoBuf在时间和空间效率上均优于JSON,具有显著的性能优势。
从时间效率上看,当处理的数据交换次数在2千以上时,ProtoBuf的编码和解码性能就已经比JSON高出很多。随着数据交换次数的增加,这种性能差异会变得更加明显。特别是在数据交换次数达到10万以上时,ProtoBuf的编解码性能远远高于JSON。这意味着在高频率的数据交互场景中,ProtoBuf能够提供更快的数据处理速度。
从空间效率上看,ProtoBuf的内存占用仅为JSON的三分之一左右。在一项对比测试中,ProtoBuf的内存占用为34,而JSON达到了106,这表明ProtoBuf在内存使用上更为高效。这在资源受限或者需要处理大量数据的场景中尤为重要,因为它可以减少系统资源的消耗。
综上所述,ProtoBuf在时间和空间效率上都表现出色,尤其是在数据量较大或处理频繁的场景下,其性能优势更加突出。这使得ProtoBuf成为了许多高性能数据交换场景的首选格式。

ProtoBuf优点

  1. 性能优异:ProtoBuf具有较小的数据体积,序列化后的数据大小可以缩小3-10倍。同时,它的序列化速度非常快,比XML和JSON快20-100倍。由于数据体积小,传输速度快,因此在带宽和速度方面会有优化。
  2. 使用简便:通过proto编译器,ProtoBuf可以自动进行序列化和反序列化操作,无需手动编写代码。
  3. 维护成本低:多平台只需维护一套对象协议文件(.proto),减少了在不同平台上的维护成本。
  4. 向后兼容性好:ProtoBuf支持对数据结构进行更新,而不必破坏旧数据格式,因此具有良好的向后兼容性。
  5. 加密性好:在Http传输中,抓包只能看到字节内容,无法直接查看明文信息,提高了数据的安全性。
  6. 跨平台、跨语言支持:ProtoBuf支持多种编程语言,包括Java, Python, Objective-C, C++, Dart, Go, Ruby, C#等,并且具有良好的可扩展性。

ProtoBuf的缺点

  1. 不适合用于对基于文本的标记文档(如HTML)建模,因为文本不适合描述数据结构。
  2. 通用性较差:虽然Json和Xml已成为多种行业标准的编写工具,但ProtoBuf只是Google公司内部的工具,其通用性相对较差。
  3. 自解耦性差:ProtoBuf以二进制数据流方式存储,无法直接阅读,需要通过.proto文件才能了解到数据结构。
  4. 阅读性差:生成出来的模型文件是不允许修改的(protoBuf官方建议),如果有新增字段,都必须依赖于.proto文件重新进行生成,导致生成出来的模型无论从可读性还是易用性上来说都是较差的。

proto文件基础介绍

Protocol Buffers(简称ProtoBuf)是Google开发的一种数据序列化协议,它能够将结构化数据序列化为二进制格式,用于数据存储或网络传输。以下是proto文件的基础介绍:

  1. 消息定义:在proto文件中,使用message关键字定义一个数据结构,这类似于C++中的class、Java中的Class或Go中的struct。消息中承载的数据对应于每个字段,每个字段都有一个名字和类型。
  2. 字段规则:
  • required:表示必填字段,如果这些字段未设置,会导致编解码异常。
  • optional:表示可选字段,对应生成的是指针类型。
  • repeated:表示可重复字段,这些字段的值顺序会被保留,在Go中通常被定义为切片类型。
  1. 文件规范:创建proto文件时,应使用全小写字母命名,多个单词之间用下划线连接。例如:lower_snake_case.proto。书写代码时应使用2个空格的缩进。注释可以使用单行注释(//)或多行注释(/* */)。
  2. 语法指定:在文件首行指定该proto文件所采用的语法版本,如syntax = “proto3”;表示使用proto3语法。
  3. 编解码原理:ProtoBuf通过Thrift编码和解码数据,这是一种紧凑的二进制格式,可以有效地用于网络传输和文件存储。

以下是一个简单的文件示例:

syntax = "proto3";message Error {int32 code = 1;string message = 2;}message Request {string id = 1;string data = 2;}message Response {Error error = 1;string result = 2;}service MyService {rpc GetData (Request) returns (Response);}

在上面的示例中,我们定义了一个名为MyService的service,它包含一个名为GetData的rpc方法。该方法接受一个Request类型的参数,并返回一个Response类型的结果。
通过这样的定义,我们可以使用proto生成对应语言的代码,以便在客户端和服务端之间进行RPC通信。客户端可以调用服务端上的GetData方法,并传递一个Request对象作为参数,服务端将返回一个Response对象作为结果。

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

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

相关文章

android 问题记录:gradle.kts文件引入本地jar包

在build.gradle文件中引入本地的jar文件,可以使用files方法来添加本地的jar文件到项目的依赖中。在build.gradle引入jar包我们都很熟悉了,具体代码如下 implementation files(libs/test.jar)// 或者 compile files(libs/test.jar) 但是这种写法目前在kt…

kafka 消费模式基础架构

kafka 消费模式 &基础架构 目录概述需求: 设计思路实现思路分析1.kafka 消费模式基础架构基础架构2: 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy,skip hardness,…

mainwindow.ui和mainwindow.h和ui_mainwindow.h这几个文件之间的联系是什么

在Qt应用程序开发中,mainwindow.ui, mainwindow.h, 和 ui_mainwindow.h 这三个文件之间有着紧密的联系,共同构成了使用Qt Designer设计的图形用户界面(GUI)应用程序的基础。下面是这三个文件各自的作用及它们之间的关联&#xff1…

HTML5 文件处理及应用

HTML5 文件处理及应用 目录 核心对象文件信息读取文件拖放FileReaderSyncFileWriter APIBlob URL与 revokeObjectURL()跨源资源共享 (CORS)HTML5文件File API为浏览器提供了与用户计算机上的文件进行交互的能力,使得Web应用程序能够在客户端直接处理文件数据,而无需依赖服务…

Golang:使用jszwec/csvutil读取csv文件

jszwec/csvutil 高性能、惯用的CSV记录编码和解码到本机Go结构 文档 https://github.com/jszwec/csvutil 安装 go get github.com/jszwec/csvutil要读取的文件 user.csv name,age,CreatedAt jacek,26,2012-04-01T15:00:00Z john,,2001-01-01T00:00:00Z读取示例 package m…

93.网络游戏逆向分析与漏洞攻防-游戏技能系统分析-增强技能信息显示后进行分析

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 如果看不懂、不知道现在做的什么,那就跟着做完看效果,代码看不懂是正常的,只要会抄就行,抄着抄着就能懂了 内容…

Ant Design Vue中 a-table 嵌套子表格

需求:在父表格中嵌套子表格,当点击展开某一行时,有展开的关闭当前展开行。使用a-table中的expandedRowKeys 属性和expand 方法。链接:Ant Design Vue 一、属性说明: expandedRowKeys:这个主要是控制展开某行…

都2024年了!是谁还不会优化 Hive 的小文件啊!!!速看!

文章目录 小文件产生的原因1.查询建表或者插入2.装载数据3.动态分区小文件影响解决方法针对已经存在的小文件进行优化1.小文件归档2.getmerge3.concatenate4.重写针对写入数据时的优化1.调参优化2.动态分区优化3.使用 Spark 算子控制小文件数量查看 HDFS 上的文件时,无意间点进…

【QT+VS】如何在现有VS项目中添加Qt界面?【全网最详细】

0. 前置步骤 参考如下链接文章中的 前3个步骤(1:下载Qt;2:安装Qt;3:安装Qt插件),完成环境的配置和安装。 深耕AI:如何联合Qt,VS,C++,来开发一个电脑版软件(简单有趣,详细) 本文的基础项目链接为: c++工程+图像分割预测+mmdet+实例分割+最新工程+简洁易懂+新手…

搭建自己的视频通话服务器Janus(WebRTC)

1. 安装janus apt install janus 高版本的Ubuntu已经可以直接安装了,不要编译那么麻烦了 2. 安装nginx janus 是后端,需要nginx或者其他等提供前端页面的服务器,此外因为这里并没有正式的证书,只能用自签名的证书用于https。 …

Mac 更改登陆密码,不是appleid 密码

在Mac 上更改登录密码 在Mac 上,选取苹果菜单 >“系统设置”,然后点按边栏中的“用户与群组” 。 … 点按右侧用户名旁边的“简介”按钮 。 点按“更改”。 在“旧密码”栏输入你的当前密码。 在“新密码”栏中输入新密码,然后在“确认密码…

「数据结构」队列

目录 队列的基本概念 队列的实现 头文件queue.h 实现函数接口 1.初始化和销毁 2.出队列和入队列 3.获取队头元素和队尾元素 4.队列长度判空 后记 前言 欢迎大家来到小鸥的博客~ 个人主页:海盗猫鸥 本篇专题:数据结构 多谢大家的支持啦&#xff…

Java入门基础学习笔记36——面向对象基础

面向对象编程快速入门: 计算机是用来处理数据的。 单个变量 数组变量 对象数据 Student类: package cn.ensource.object;public class Student {String name;double chinese_score;double math_score;public void printTotalScore() {System.out.pr…

【哈希】Leetcode 219. 存在重复元素 II【简单】

存在重复元素 II 给你一个整数数组 nums 和一个整数 k &#xff0c;判断数组中是否存在两个 不同的索引 i 和 j &#xff0c;满足 nums[i] nums[j] 且 abs(i - j) < k 。如果存在&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&#xff1a; 输…

偏微分方程算法之椭圆型双调和方程问题

目录 一、研究对象 二、问题解析 一、研究对象 针对双调和方程的边值问题:

达梦数据库使用dmlcvt命令找回更改前的数据

在生产系统上不小心修改了表数据后最快的方法是用闪回查询找回。但时间不能超过undo_retention&#xff08;默认90秒&#xff09;。其实最标准的处理方法是在其他机器上将数据库恢复到修改前的时刻。但数据库比较大时恢复时间较长。真实场景可能比较急。那么也可以分析归档日志…

数组序号Spinner

使用Spnner代替编辑框&#xff0c;只能选择已有的&#xff0c;不会越界&#xff0c;大大简化了代码。 String[] SA new String[list.size()]; for (int i0; i<SA.length; i) {SA[i] String.valueOf(i); } ArrayAdapter<String> adapter1 new ArrayAdapter<>(…

[国产大模型简单使用介绍] 开源与免费API

个人博客:Sekyoro的博客小屋 个人网站:Proanimer的个人网站 随着大模型技术蓬勃发展和开源社区越来越活跃,国内的大模型也如雨后春笋一般.这时,一些就会问了,有了llama3,Mistral还有Gemma等等,国外大厂接连发力,一些开源社区也会有一些不错的模型,国内怎么比?对一个人使用,oll…

下雨!大水蚁引发的水文!看比赛咯,曼联VS曼城——早读(逆天打工人爬取热门微信文章解读)

唠唠嗑 水一水 引言Python 代码结尾 引言 今天星期六 大小周 一个等了很久的双休 昨天晚上真的是吓到我了 漫天的小飞虫 我一开始还以为是一两只 没想到那些小飞虫 从阳台不断飞进来 在山卡拉下面租房子 也是太恐怖了 来个特写 他们也就一个晚上的时间 成虫 天气合适 长翅…

大语言模型发展历史

大语言模型的发展历史可以追溯到自然语言处理&#xff08;NLP&#xff09;和机器学习早期的探索&#xff0c;但真正快速发展起来是在深度学习技术兴起之后。以下是大语言模型发展的一个简要历史概述&#xff1a; 早期阶段&#xff08;20世纪50-90年代&#xff09;&#xff1a; …