- Apache Thrift 教程
- Apache Thrift - 首页
- Apache Thrift - 简介
- Apache Thrift – 安装
- Apache Thrift - IDL
- Apache Thrift - 代码生成
- Apache Thrift - 服务实现
- Apache Thrift - 运行服务
- Apache Thrift - 传输层 & 协议层
- Apache Thrift - 序列化
- Apache Thrift - 反序列化
- Apache Thrift - 负载均衡
- Apache Thrift - 服务发现
- Apache Thrift - 安全考虑
- Apache Thrift - 跨语言兼容性
- Apache Thrift - 微服务架构
- Apache Thrift - 测试和调试
- Apache Thrift - 性能优化
- Apache Thrift - 案例研究
- Apache Thrift - 总结
- Apache Thrift 有用资源
- Apache Thrift - 有用资源
- Apache Thrift - 讨论
Apache Thrift - 代码生成
在 Apache Thrift 中生成代码
从 Apache Thrift IDL 文件生成代码是创建跨语言服务的重要步骤。
Thrift 编译器 (thrift) 获取 IDL 文件并生成目标编程语言的源代码,然后可以使用这些源代码来实现和交互定义的服务。
本教程提供了有关如何使用 Apache Thrift 生成代码的详细指南,包括设置环境、运行编译器和处理生成的代码。
设置环境
在生成代码之前,请确保已安装 Thrift 编译器并且已正确配置开发环境。
- 安装 Thrift 编译器:在“Linux/macOS”中,请按照您的操作系统的安装说明进行操作,例如对于 Ubuntu 使用“apt”,对于 macOS 使用“brew”。在“Windows”中,下载并安装预编译的二进制文件或使用 CMake 从源代码构建。
- 验证安装:确认“thrift”命令在您的系统 PATH 中可用。
thrift --version
运行 Thrift 编译器
Thrift 编译器用于从 IDL 文件生成各种编程语言的源代码。以下是运行编译器的方法
- 基本命令结构:生成代码的基本命令如下所示。将“<language>”替换为目标编程语言,并将“<path-to-idl-file>”替换为 Thrift IDL 文件的路径:
thrift --gen <language> <path-to-idl-file>
thrift --gen java service.thrift
thrift --gen py service.thrift
thrift --gen java --gen py service.thrift
理解生成的代码
生成的代码将包含各种文件,具体取决于目标语言和 IDL 文件的内容。以下是您可以期待的内容概述
Java 生成的代码
从 Thrift IDL 文件生成 Java 代码时,输出包含几个关键组件,这些组件经过组织以方便实现和使用定义的服务。以下是每个组件和目录结构的详细说明:
- 数据类型:结构体、枚举和异常的 Java 类。
- 服务接口:IDL 中定义的服务的 Java 接口。
- 客户端和服务器存根:用于客户端和服务器端通信的类。
以下是示例目录结构:
gen-java/ ├── example/ │ ├── Color.java │ ├── Person.java │ └── Greeter.java └── TBinaryProtocol.java
其中:
- gen-java/:存储所有生成的 Java 代码的根目录。
- example/:包含根据 IDL 文件中定义的命名空间组织的生成的 Java 文件的子目录。
- Color.java:包含 IDL 中定义的 Color 枚举的 Java 枚举类。
- Person.java:包含 Person 结构体的 Java 类。
- Greeter.java:包含 Greeter 服务的 Java 接口。
- TBinaryProtocol.java:一个用于处理 Thrift 二进制协议的实用程序类,该协议用于在 Thrift 中对数据进行编码和解码。
Python 生成的代码
从 Thrift IDL 文件生成 Python 代码时,输出包含各种 Python 模块,这些模块对应于 IDL 中定义的数据类型、服务接口和通信存根。
这些模块的结构支持轻松集成到您的 Python 项目中。以下是每个组件和目录结构的详细说明
- 数据类型:结构体和枚举的 Python 类。
- 服务接口:服务方法的 Python 类。
- 客户端和服务器存根:用于客户端和服务器端通信的 Python 模块。
以下生成的 Python 代码按镜像 IDL 文件中定义的命名空间的目录结构进行组织
gen-py/ ├── example/ │ ├── __init__.py │ ├── color.py │ ├── person.py │ └── greeter.py └── __init__.py
- gen-py/:存储所有生成的 Python 代码的根目录。
- example/:对应于 IDL 文件中定义的命名空间的子目录。此目录包含从 IDL 生成的 Python 模块。
- \_\_init\_\_.py:一个空文件,它使 example 目录成为一个 Python 包,允许您将生成的模块作为包导入。
- color.py:包含 Color 枚举类,该类定义 Color 类型的枚举值。
- person.py:包含 Person 类,该类定义 Person 结构体的结构和属性。
- greeter.py:包含 Greeter 服务类,包括 greet 和 getAge 等方法。
- \_\_init\_\_.py:根级别上的另一个 \_\_init\_\_.py 文件,如果将整个 gen-py 目录视为 Python 包,则可以使用该文件。
集成生成的代码
生成代码后,请按如下方式将其集成到您的项目中
对于Java 集成
- 包含生成的代码:将“gen-java”目录添加到 Java 项目的构建路径中。
- 编译和使用:将生成的代码与您的项目代码一起编译,并使用生成的类和接口来实现和交互服务。
对于Python 集成
- 包含生成的代码:将“gen-py”目录添加到 Python 路径中。
- 导入和使用:在您的 Python 代码中导入生成的模块,并使用类和方法来实现和交互服务。
编译和运行代码
从 Thrift IDL 文件生成代码后,下一步是(如果需要)编译并运行您的应用程序。
Java 编译和执行
在 Java 中,生成代码后,您需要将生成的类与您编写的任何其他 Java 代码一起编译。以下是您可以执行此操作的方法
编译 Java 代码
- 使用“javac”命令编译生成的 Java 文件和您编写的任何自定义 Java 代码。
- 在类路径中包含生成的代码路径和任何必需的 Thrift 运行时库。
- 例如,如果您有一个包含 Java 文件的“src”目录和一个包含生成的代码的“gen-java”目录,则可以像这样编译它:
javac -d bin -cp path/to/thrift/lib/* src/**/*.java gen-java/**/*.java
运行 Java 应用程序
- 编译后,您可以使用“java”命令运行 Java 应用程序。
- 确保在类路径中包含编译后的类和必要的库。
- 例如,如果您的主类是“com.example.Main”,则可以像这样运行它:
java -cp bin:path/to/thrift/lib/* com.example.Main
Python 执行
Python 不需要编译步骤,因为它是一种解释型语言。生成 Thrift 代码后,您可以直接执行 Python 脚本。以下是您可以执行此操作的方法
运行 Python 代码
- 确保您的 Python 脚本可以访问生成的代码,通常是通过将“gen-py”目录添加到 Python 路径中。
- 您可以通过从包含“gen-py”的根目录运行脚本或修改“PYTHONPATH”环境变量来实现。
- 例如,如果您的脚本名为“client.py”并且与“gen-py”位于同一目录中,则可以像这样运行它:
python client.py
Python 路径设置
- 如果您需要手动设置 Python 路径,则可以通过导出“PYTHONPATH”环境变量来实现:
export PYTHONPATH=$PYTHONPATH:/path/to/gen-py
import sys sys.path.append('/path/to/gen-py')
验证执行
您可以如下所示验证Java的执行
- 检查控制台输出以验证您的 Java 应用程序是否按预期运行,无论它是在启动 Thrift 服务器还是发出客户端请求。
- 处理出现的任何异常或错误,这些错误通常与网络问题或不正确的类路径设置有关。
验证Python的执行,如下所示
- 检查控制台输出以确认您的 Python 脚本是否按预期执行 Thrift 服务操作。
- 确保所有必要的模块都已正确导入并且 Thrift 服务可访问。