活动介绍

ApacheThriftIDL中的结构、联合、异常和服务详解

立即解锁
发布时间: 2025-08-19 02:31:28 阅读量: 2 订阅数: 16
PDF

Apache Thrift程序员指南:从入门到精通

### Apache Thrift IDL 中的结构、联合、异常和服务详解 在使用 Apache Thrift IDL 进行开发时,有许多重要的概念和特性需要我们深入了解,包括枚举常量、结构体、联合、异常、参数列表以及服务等。下面将详细介绍这些内容。 #### 枚举常量 枚举常量应该是非负整数。如果 IDL 编译器遇到负的枚举值,会产生警告,不过大多数语言生成器仍然会使用它们。最佳实践是为枚举常量显式分配正值,这样可以避免因编译器或 IDL 源文件版本变化导致的值生成问题,以及其他兼容性问题。 #### 结构、联合、异常和参数列表 结构、联合、异常和参数列表都允许将一组元素收集到一个关联组中。服务包含一组函数,每个函数都有一个由一组字段组成的参数列表。结构体、联合和异常也包含一组字段。Apache Thrift IDL 编译器内部使用相同的数据结构来表示结构体、联合、异常和参数列表中的字段集。 以下是结构体、联合、异常和参数列表的示例声明: ``` struct stTimeStamp { 1: i16 year 2: i16 month 3: i16 day } union unTimeStamp { 1: i16 year 2: i16 month 3: i16 day } exception exTimeStamp { 1: i16 year 2: i16 month 3: i16 day } service svTimeStamp { void fnTimeStamp (1: i16 year 2: i16 month 3: i16 day) } ``` 字段可以是任何有效类型,包括基本类型、结构体、联合、异常和容器。上述示例中的每组字段都会被编译成具有 `read()` 和 `write()` 方法的特定语言类。`read()` 方法用于读取结构体、联合、异常或参数列表的实例,`write()` 方法用于写入这些实例。读写操作都将协议作为参数,用于从协议中读取或写入数据。 #### 结构体 结构体可能是最简单的字段分组类型,也是用户构建基于 IDL 的用户定义类型(UDT)的主要方式。结构体提供了一种方便的方法,将一组相关字段收集到一个可管理的程序元素中。例如: ``` struct TimeStamp { 1: i16 year 2: i16 month 3: i16 day } ``` 在 IDL 中定义的每个结构体都会创建一个类型,并且必须给它一个名称。上述示例中,声明的结构体类型名为 `TimeStamp`。结构体的所有重要方面都由它包含的字段描述。 #### 字段 大多数与字段相关的细节对于结构体、联合、异常和参数列表是通用的。下面以结构体为例描述字段,但这些原则同样适用于联合、异常和参数列表,除非另有说明。 字段列表采用以下形式: ``` [id:] [requiredness] type FieldName [=default] [,|;] ... ``` 每个字段都有一个类型、一个名称和一个标识符(ID)。字段不能使用未定义或部分定义的类型。例如,结构体 “A” 不能包含类型为 “A” 的字段。除服务外,IDL 类型不支持继承,也不能组织成类型层次结构。 需要注意的是,目前有一个实验性的计划,旨在使 Apache Thrift IDL 支持自引用类型。例如,名为 “Node” 的结构体类型可以有 “Node &”(节点引用)类型的属性,这使得创建有向无环图(DAG),如树和单链表成为可能。但截至目前,此功能仅在 C++ 中实现,并且尚未经过大量测试。 ##### 字段 ID 字段 ID(有时称为键)是 16 位整数,可以是显式的或隐式的。Thrift 框架在许多情况下使用字段 ID 来唯一标识字段。例如,在调用 RPC 函数时,参数可以按任意顺序传递,接收方将使用字段 ID 来匹配传递的参数与正确的参数。 显式字段 ID 必须是正整数。在 `TimeStamp` 示例结构体中,字段 ID 是 1、2 和 3。显式定义字段 ID 几乎总是有利的。如果没有提供显式 ID,IDL 编译器会分配隐式字段标识符,隐式 ID 是负数(从 -1 开始递减)。如果结构体中没有显式 ID 而更改字段顺序,几乎总会破坏与现有代码的兼容性,因为新顺序生成的隐式 ID 可能与之前的不同。例如,对于 `struct {i16 a, i16 b}`,IDL 编译器将分别为 `a` 和 `b` 生成 ID -1 和 -2;而对于 `struct {i16 b, i16 a}`,则会分别生成 ID -2 和 -1。 IDL 编译器提供了 `-allow-neg-keys` 开关,允许显式分配负 ID,但这仅应用于解决与依赖预定义负 ID 的现有 Apache Thrift 系统的互操作性问题。 ##### 字段的必需性 每个字段都有一个必需性属性,该属性定义了 Apache Thrift 如何读写该字段。字段可以有三种必需性值:`required`、`default` 和 `optional`。此外,当程序在序列化结构体中发现一个它不知道的字段时,会出现第四种情况,这里称为 “undefined”,结构体读取器会忽略这些未定义的字段。 对于编写 IDL 结构体的程序,有三种可能的必需性场景(`required`、`default` 和 `optional`);而从序列化结构体中读取字段的程序可能会遇到四种必需性场景(前三种加上未定义字段)。以下是字段必需性的情况: | 字段必需性 | 写入行为 | 读取行为 | | --- | --- | --- | | Required | 必须读取,否则报错 | 始终写入 | | <default> | 若存在则读取 | 始终写入 | | Optional | 若存在则读取 | 若设置则写入 | | <undefined> | 忽略 | N/A | 考虑以下结构体: ``` struct Trade { 1: required string fish 2: double price 3: optional i32 size } ``` 这个简单的结构体展示了所有可能的 IDL 必需性值。第一个字段 `fish` 被标记为 `required`,第二个字段 `price` 没有必需性指定,默认为 `default` 必需性,第三个字段 `size` 被指定为 `optional`。 - **必需字段**:如 `fish` 字段,在结构体序列化时总是会被写入,并且在反序列化时必须被读取。如果结构体的 `read()` 方法在读取结构时找不到必需字段,将抛出 `TProtocolException`。定义必需字段时要小心,因为它们是必需性类型中灵活性最低的。例如,当你移除或添加一个必需字段时,所有通信该结构体的程序都必须更新,以避免抛出异常。 - **默认必需性字段**:如 `price` 字段,总是会被写入,但在读取操作中不必存在。这使得结构体定义可以随着时间逐步演变。例如,假设波特兰市场和西雅图市场的两个系统使用 Apache Thrift RPC 进行通信。波特兰团队需要在之前的交易结构体中添加一个 `TimeStamp` 字段,如果该字段被赋予默认必需性,波特兰系统将始终传输该字段,并且如果存在,波特兰系统会始终读取它。而当波特兰市场将交易结构
corwn 最低0.47元/天 解锁专栏
赠100次下载
继续阅读 点击查看下一篇
profit 400次 会员资源下载次数
profit 300万+ 优质博客文章
profit 1000万+ 优质下载资源
profit 1000万+ 优质文库回答
复制全文

相关推荐

郑天昊

首席网络架构师
拥有超过15年的工作经验。曾就职于某大厂,主导AWS云服务的网络架构设计和优化工作,后在一家创业公司担任首席网络架构师,负责构建公司的整体网络架构和技术规划。
最低0.47元/天 解锁专栏
赠100次下载
百万级 高质量VIP文章无限畅学
千万级 优质资源任意下载
千万级 优质文库回答免费看
立即解锁

专栏目录

最新推荐

虚拟助理引领智能服务:酒店行业的未来篇章

![虚拟助理引领智能服务:酒店行业的未来篇章](https://images.squarespace-cdn.com/content/v1/5936700d59cc68f898564990/1497444125228-M6OT9CELKKA9TKV7SU1H/image-asset.png) # 摘要 随着人工智能技术的发展,智能服务在酒店行业迅速崛起,其中虚拟助理技术在改善客户体验、优化运营效率等方面起到了关键作用。本文系统地阐述了虚拟助理的定义、功能、工作原理及其对酒店行业的影响。通过分析实践案例,探讨了虚拟助理在酒店行业的应用,包括智能客服、客房服务智能化和后勤管理自动化等方面。同时,

【C#数据绑定高级教程】:深入ListView数据源绑定,解锁数据处理新技能

![技术专有名词:ListView](https://androidknowledge.com/wp-content/uploads/2023/01/customlistthumb-1024x576.png) # 摘要 随着应用程序开发的复杂性增加,数据绑定技术在C#开发中扮演了关键角色,尤其在UI组件如ListView控件中。本文从基础到高级技巧,全面介绍了C#数据绑定的概念、原理及应用。首先概述了C#中数据绑定的基本概念和ListView控件的基础结构,然后深入探讨了数据源绑定的实战技巧,包括绑定简单和复杂数据源、数据源更新同步等。此外,文章还涉及了高级技巧,如数据模板自定义渲染、选中项

【仿真模型数字化转换】:从模拟到数字的精准与效率提升

![【仿真模型数字化转换】:从模拟到数字的精准与效率提升](https://img-blog.csdnimg.cn/42826d38e43b44bc906b69e92fa19d1b.png) # 摘要 本文全面介绍了仿真模型数字化转换的关键概念、理论基础、技术框架及其在实践中的应用流程。通过对数字化转换过程中的基本理论、关键技术、工具和平台的深入探讨,文章进一步阐述了在工程和科学研究领域中仿真模型的应用案例。此外,文中还提出了数字化转换过程中的性能优化策略,包括性能评估方法和优化策略与方法,并讨论了数字化转换面临的挑战、未来发展趋势和对行业的长远意义。本文旨在为专业人士提供一份关于仿真模型数

手机Modem协议在网络环境下的表现:分析与优化之道

![手机Modem协议开发快速上手.docx](https://img-blog.csdnimg.cn/0b64ecd8ef6b4f50a190aadb6e17f838.JPG?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBATlVBQeiInOWTpQ==,size_20,color_FFFFFF,t_70,g_se,x_16) # 摘要 Modem协议在网络通信中扮演着至关重要的角色,它不仅定义了数据传输的基础结构,还涉及到信号调制、通信流程及错误检测与纠正机制。本文首先介

FPGA高精度波形生成:DDS技术的顶尖实践指南

![FPGA高精度波形生成:DDS技术的顶尖实践指南](https://d3i71xaburhd42.cloudfront.net/22eb917a14c76085a5ffb29fbc263dd49109b6e2/2-Figure1-1.png) # 摘要 本文深入探讨了现场可编程门阵列(FPGA)与直接数字合成(DDS)技术的集成与应用。首先,本文介绍了DDS的技术基础和理论框架,包括其核心组件及优化策略。随后,详细阐述了FPGA中DDS的设计实践,包括硬件架构、参数编程与控制以及性能测试与验证。文章进一步分析了实现高精度波形生成的技术挑战,并讨论了高频率分辨率与高动态范围波形的生成方法。

【心电信号情绪识别可解释性研究】:打造透明、可靠的识别模型

# 摘要 心电信号情绪识别是一种利用心电信号来识别个体情绪状态的技术,这一领域的研究对于医疗健康、人机交互和虚拟现实等应用具有重要意义。本文从心电信号的基础理论与处理开始,深入探讨了信号采集、预处理方法以及情绪相关性分析。进一步,本文涉及了心电信号情绪识别模型的开发、训练、性能评估与可解释性分析,以及这些模型在实际应用中的设计与实现。最后,文章展望了该技术的未来趋势、面临的挑战和持续发展的路径,强调了跨学科合作、数据隐私保护和伦理合规性的重要性。 # 关键字 心电信号;情绪识别;信号预处理;机器学习;模型性能评估;伦理隐私法律问题 参考资源链接:[心电信号情绪识别:CNN方法与MATLAB

物联网技术:共享电动车连接与控制的未来趋势

![物联网技术:共享电动车连接与控制的未来趋势](https://read.nxtbook.com/ieee/potentials/january_february_2020/assets/4cf66356268e356a72e7e1d0d1ae0d88.jpg) # 摘要 本文综述了物联网技术在共享电动车领域的应用,探讨了核心的物联网连接技术、控制技术、安全机制、网络架构设计以及实践案例。文章首先介绍了物联网技术及其在共享电动车中的应用概况,接着深入分析了物联网通信协议的选择、安全机制、网络架构设计。第三章围绕共享电动车的控制技术,讨论了智能控制系统原理、远程控制技术以及自动调度与充电管理

高级地震正演技巧:提升模拟精度的6大实战策略

![dizhenbo.rar_吸收边界 正演_地震正演_地震波_地震波正演_正演模型](https://www.hartenergy.com/sites/default/files/image/2020/05/ion-geo-figure-1.jpg) # 摘要 地震正演模拟是地震学研究中的重要分支,对于理解地下结构和预测地震波传播有着不可替代的作用。本文首先概述地震正演模拟的基本概念,接着深入讨论地震数据处理的基础,包括数据采集、去噪增强、地震波的传播理论和建模技术。随后,本文探讨了提高模拟精度的数值计算方法,如离散化技术、有限差分法、有限元法和并行计算策略。此外,文章还分析了优化地震正演

零信任架构的IoT应用:端到端安全认证技术详解

![零信任架构的IoT应用:端到端安全认证技术详解](https://img-blog.csdnimg.cn/20210321210025683.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMzI4MjI4,size_16,color_FFFFFF,t_70) # 摘要 随着物联网(IoT)设备的广泛应用,其安全问题逐渐成为研究的焦点。本文旨在探讨零信任架构下的IoT安全认证问题,首先概述零信任架构的基本概念及其对Io

【多源数据整合王】:DayDreamInGIS_Geometry在不同GIS格式中的转换技巧,轻松转换

![【多源数据整合王】:DayDreamInGIS_Geometry在不同GIS格式中的转换技巧,轻松转换](https://community.esri.com/t5/image/serverpage/image-id/26124i748BE03C6A81111E?v=v2) # 摘要 本论文详细介绍了DayDreamInGIS_Geometry这一GIS数据处理工具,阐述了其核心功能以及与GIS数据格式转换相关的理论基础。通过分析不同的GIS数据格式,并提供详尽的转换技巧和实践应用案例,本文旨在指导用户高效地进行数据格式转换,并解决转换过程中遇到的问题。文中还探讨了转换过程中的高级技巧、