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
Where,
- 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 代码时,输出包括与 IDL 中定义的数据类型、服务接口和通信存根相对应的各种 Python 模块。
这些模块的结构支持轻松集成到您的 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:一个空文件,使示例目录成为 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 服务可访问。