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

其中:

  • 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
    
  • “-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 服务可访问。
广告