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 服務可訪問。
廣告
© . All rights reserved.