- VisualStudio2022插件的安装及使用-编程手把手系列文章
- pprof-在现网场景怎么用
- C#实现的下拉多选框,下拉多选树,多级节点
- 【学习笔记】基础数据结构:猫树
上次我们专门通过一个简单的HelloWorld示例来了解了gRPC的基本概念和使用方法。今天,我们将继续深入探讨gRPC,重点讨论一些在实际应用中需要特别注意的要点。实际上,gRPC的核心目标是简化远程调用的过程,它通过定义清晰的接口,利用Protocol Buffers(简称proto协议)来生成不同编程语言的接口代码,从而实现跨语言、高效的通信.
在回顾了gRPC的基本工作原理之后,我们今天将进一步扩展视野,继续探讨一些更细节的部分.
今天,我特别添加了一个新的测试接口,目的是测试在进行重新编译时,系统是否会丢失之前定义的接口和相关业务逻辑。为了简化说明,实体类部分就不再重新编写了,它与之前定义的内容完全一致。具体细节请见下图:
在我重新进行编译后,我发现除了这个特定的类需要单独手动编写之外,其他的内容都已经自动生成完毕。这意味着,我们不需要担心会因编译过程而导致已有内容被直接覆盖掉.
实际上,Maven 工具本身也可以配置,以控制在执行时是否删除目录中的某些内容并重新生成。虽然这里不作详细讨论,但从正常业务操作的角度来看,我们通常都不希望自己辛苦编写的代码在没有任何警告的情况下,因他人的误操作或一键执行而被完全删除.
在我们讨论实体类消息体中为何会出现数字时,首先要明确的是,虽然我们在定义字段时已经给它们起了具体的名字,但这远不够。特别是在使用 gRPC 进行服务通信时,你需要从传统的 JSON 格式(键值对结构)中跳脱出来,重新理解字段的表示方式.
在 gRPC 中,数据是通过 Protocol Buffers(Protobuf) 进行序列化和传输的,而 Protobuf 的一个关键概念就是 字段编号(Field Numbers)。如图所示:
其实作用最主要的就是序列化和反序列化,当 Protobuf 序列化消息时,它并不直接存储字段名(如 name、age 等),而是存储字段编号和字段值的对应关系。这样,这使得数据传输时比使用 JSON 或 XML 更加紧凑.
我们简单看下后台输出的日志,你大概就能理解了,如图所示:
我们把这些字节全拿出来看下。比如:
57
→ 'W'6f
→ 'o'72
→ 'r'6c
→ 'l'64
→ 'd'因此,57 6f 72 6c 64 对应的字符串是 "World".
同理,我们看下返回的数据也是一样的字节。然后反序列化成我们所需要的字段值,具体的我们就不探讨了。了解下他的优点即可.
这串字节 00000000150a137869616f79753a2048656c6c6f20576f726c64 可以被解释为:
00 00 00 00
和 15 0a 13
)可能是标识符、长度字段或者控制信息。"xiaoyu: Hello World"
还有一个需要注意的就是,既然他有字段编号,所以你不要轻易去修改编号,就算不用了,也要去用新的编号进行标识处理。这是因为如果有老客户端仍在继续使用,会导致无法正确解析新版消息,会出现兼容性错误.
通过今天的探讨,我们进一步加深了对gRPC和Protocol Buffers的理解,特别是在实际应用中可能遇到的一些细节和注意事项。我们了解了在重新编译时,系统如何自动生成接口代码并避免覆盖已有内容,从而减少了手动操作的风险。同时,深入探讨了Protocol Buffers中的字段编号机制,它不仅有助于数据的高效序列化和传输,也在版本兼容性上起到了至关重要的作用。尽管字段名称对开发者来说更具可读性,但最终传输的数据依赖于字段编号,而对编号的管理和修改必须小心谨慎,以确保不同版本之间的兼容性.
希望通过今天的讲解,大家能更好地理解gRPC的应用场景和实际操作中的细节.
我是努力的小雨,一名 Java 服务端码农,潜心研究着 AI 技术的奥秘。我热爱技术交流与分享,对开源社区充满热情。同时也是一位腾讯云创作之星、阿里云专家博主、华为云云享专家、掘金优秀作者.
💡 我将不吝分享我在技术道路上的个人探索与经验,希望能为你的学习与成长带来一些启发与帮助.
🌟 欢迎关注努力的小雨!🌟 。
最后此篇关于gRPC编译与字段编号的细节探讨的文章就讲到这里了,如果你想了解更多关于gRPC编译与字段编号的细节探讨的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
前言 本文主要介绍了关于MySQL主键为0与主键自排约束的关系,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。 开始不设置主键表的设计如下: 如果id的位置有好几个0
我已经阅读了一些关于将消息从一个线程冒泡到所有其他线程以正常退出的正确方法的来源(每个线程都执行它自己的退出例程)。其中,我喜欢全局原子 bool 值的想法,它可以从任何线程进行标记,所有其他线程检查
本文深入探讨Go语言中的流程控制语法,包括基本的 if-else 条件分支、 for 循环、 switch-case 多条件分支,以及与特定数据类型相关的流程控制,如 for-r
我是 MVC 和 XCode 的新手,在将我对 MVC 的概念理解转化为设计和实现具体类时遇到了困难。我希望就如何构建 Controller 和 View 以获得预期的 UI 获得一些建议。这是针对
如果我尝试在 View 中打开 DeatilFragement,我的应用程序崩溃并收到以下错误: Caused by: java.lang.IllegalStateException: Require
我正在尝试构建我的 iOS 应用程序的界面。一遍又一遍地开始新项目我仍然遇到细节 View 控件的问题(见图)。 在这里我得到了截图: 详细 View 显示当用户触摸 UITableView 行时。您
我在与我正在处理的项目的类(class)中遇到问题。该类是一个接受标签和值的 GUI 组件。这里的想法是,用户可以指定一个标签,然后从任何地方链接一个值(更具体地说,该值的 ToString 方法),
嗯.. 我在我的应用程序中设置了表格 View - 详细 View 。 主视图使用常规代码将数据传递给详细 View - (void)tableView:(UITableView *)tableVie
我有 celery 任务,队列中有 100 个输入数据,需要使用 5 个 worker 来执行。 如何获取哪个工作人员正在执行哪个输入? 每个 worker 执行了多少输入及其状态? 如果任何任务失败
我有一个 .net github 项目,它基本上是一个 Web API 的包装器。在测试项目中,我使用 API key 调用 API。我需要将此 key 保密,如何在 Visual Studio 项目
我遇到一个问题,从 Ag-Grid 导出网格只会导出主网格的详细信息,而不会导出子网格。这是一个显示问题的 plunkr: https://next.plnkr.co/edit/jVcvWDJ1NKP
我在详细 View 中有一个不会消失的额外空间。该 View 来自 NavigationLink,但我已经尝试过使用或不使用 NavigationView。我试图包装它用 NavigationView
几天来,我一直在关注猫效应和 IO。我觉得我对这种效果有一些误解,或者只是我错过了它的重点。 首先——如果IO可以替代Scala的Future,我们如何创建异步IO任务?使用 IO.shift ?使用
如何将标高添加到主视图/详细 View 的详细信息 Pane 中,以在其下方提供阴影,同时定位为部分覆盖工具栏(如下面的底部图片)?我尝试使用 android:elevation="4dp" 但这对我
我试图在我的 UISplitViewController 的细节 View 上设置一个阴影,我希望在 iOS 6 中的主 View 上可见。 在我的细节 View Controller 中: sel
我正在阅读 std::basic_string::reserve(size_type res_arg=0) 上的标准.它是这样说的: void reserve(size_type res_arg=0)
Boost 文档说 Starting with Boost release 1.53, shared_ptr can be used to hold a pointer to a dynamicall
我用 OpenGL 编写了一个简单的 24 位位图加载器。我打开一个位图文件并读取它的像素,然后从中创建一个 RGB 像素数据数组,然后将其传递给 glDrawPixels()。 问题:我需要使图像的
for x in ...循环 就是把每个元素代入变量x,然后执行缩进块的语句。 range()函数,可以生成一个整数序列,再通过list()函数可以转换为list。 比如我们想计算1-10的整数
场景 我有一个 DevExpress XtraGrid。 显示的数据采用主/详细信息格式,点击行开头的“+”可展开该主行的详细信息。 我通过将网格数据源绑定(bind)到包含自己的字典属性(以保存详细
我是一名优秀的程序员,十分优秀!