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
    
  • 准备 IDL 文件:确保您有一个 Thrift IDL 文件(例如 service.thrift),该文件定义了要使用的数据类型和服务。

运行 Thrift 编译器

Thrift 编译器用于从 IDL 文件生成各种编程语言的源代码。以下是如何运行编译器:

  • 基本命令结构:下面给出了生成代码的基本命令。将"<language>"替换为目标编程语言,将"<path-to-idl-file>"替换为 Thrift IDL 文件的路径 −
  • thrift --gen <language> <path-to-idl-file>
    
  • Java 示例:要从"service.thrift"生成 Java 代码,请执行以下命令,这将创建一个名为"gen-java"的目录,其中包含生成的 Java 源文件 −
  • thrift --gen java service.thrift
    
  • Python 示例:要从"service.thrift"生成 Python 代码,请执行以下命令,这将创建一个名为"gen-py"的目录,其中包含生成的 Python 源文件 −
  • 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
    
  • "-d bin"指定已编译类的输出目录。
  • "-cp"指定类路径,包括 Thrift 运行时库和任何其他依赖项。

运行 Java 应用程序:

  • 编译后,您可以使用"java"命令运行 Java 应用程序。
  • 确保在类路径中包含已编译的类和必要的库。
  • 例如,如果您的主类是"com.example.Main",您可以像这样运行它 −
  • java -cp bin:path/to/thrift/lib/* com.example.Main
    
  • 此命令运行您的 Java 应用程序,允许它根据您的实现启动 Thrift 服务器或客户端。

Python执行

Python 不需要编译步骤,因为它是一种解释型语言。生成 Thrift 代码后,您可以直接执行 Python 脚本。您可以按照以下方法操作:

运行 Python 代码:

  • 确保您的 Python 脚本可以访问生成的代码,通常通过将"gen-py"目录添加到 Python 路径来实现。
  • 您可以通过从"gen-py"所在的根目录运行脚本或修改"PYTHONPATH"环境变量来实现。
  • 例如,如果您的脚本名为"client.py"且位于与"gen-py"相同的目录中,则可以像这样运行它 −
  • python client.py
    
  • 此命令将执行您的脚本,该脚本应包括从生成的代码导入并与 Thrift 服务交互(作为客户端或服务器)。

Python 路径设置:

  • 如果您需要手动设置 Python 路径,可以通过导出"PYTHONPATH"环境变量 − 来实现
  • export PYTHONPATH=$PYTHONPATH:/path/to/gen-py
    
  • 或者,在 Python 脚本中,您可以以编程方式添加路径 −
  • import sys
    sys.path.append('/path/to/gen-py')
    

验证执行

您可以验证 Java 的执行情况,如下所示:

  • 检查控制台输出以验证 Java 应用程序是否按预期运行,无论它是否正在启动Thrift 服务器或发出客户端请求。
  • 处理出现的任何异常或错误,通常与网络问题或不正确的类路径设置有关。

验证 Python 的执行情况,如下所示:

  • 检查控制台输出以确认您的 Python 脚本是否按预期执行 Thrift 服务操作。
  • 确保正确导入了所有必要的模块,并且 Thrift 服务可访问。