學習路徑:將單體式應用程式轉換為 GKE 應用程式 - 瞭解單體式應用程式


歡迎閱讀本系列的第一個教學課程,瞭解如何將單體式應用程式拆分為多個模組、將模組容器化,以及將容器映像檔部署至 Google Kubernetes Engine (GKE) 叢集。如果您不瞭解任何字詞,請別擔心,隨著課程進行,您會瞭解這些字詞的含意。

這個學習路徑包含下列教學課程:

  1. 總覽
  2. 瞭解單體式架構 (本教學課程)
  3. 將單體應用程式模組化
  4. 準備將模組化應用程式容器化
  5. 將模組化應用程式容器化
  6. 將應用程式部署至 GKE 叢集

在本教學課程中,您將執行下列步驟,瞭解單體式架構:

  1. 在本機電腦上設定應用程式。
  2. 在瀏覽器中探索其功能。
  3. 審查程式碼。

什麼是單體式架構?

在啟動並執行 Cymbal Books 範例單體式架構之前,請務必先瞭解單體式架構。

單體式應用程式的所有元件都相互連結,無法獨立擴充。舉例來說,如果突然有大量使用者造訪應用程式的登入頁面,您無法單獨擴充登入元件。您必須擴充整個應用程式,包括產品目錄或訂單處理系統等不相關的元件。

相反地,如果應用程式分解為獨立模組,每個模組就能根據資源需求分別擴充。如果您在 GKE 叢集上代管模組化應用程式,GKE 甚至可以自動調度資源。

「單體式」並不代表程式碼組織不良,單體式架構可以結構良好,且元件可在程式碼的不同區域中實作。單體式架構的特點在於這些元件無法獨立執行或擴充。

費用

完成本教學課程不會產生任何費用。不過,按照本系列最後一個教學課程中的步驟操作,會導致您的Google Cloud 帳戶產生費用。啟用 GKE 並將 Cymbal Books 應用程式部署至 GKE 叢集後,就會開始產生費用。這些費用包括 GKE 的叢集費用 (如價格頁面所述),以及執行 Compute Engine VM 的費用。

為避免產生不必要的費用,請務必在完成本教學課程後停用 GKE 或刪除專案。

事前準備

本教學課程需要本機電腦上的 Python 3.13 版。如要查看電腦上的 Python 版本,請執行下列指令:

python3 --version

如果 Python 版本早於 3.13,請從官方 Python 網站下載並安裝最新版本。

設定環境

在本系列教學課程中,您會在不同位置執行不同版本的應用程式:

  • 本機電腦上的單體式版本
  • 本機電腦上的模組化版本
  • 容器化版本 (在 Cloud Shell 中,然後在 GKE 叢集中)

在本節中,您會在本機電腦上設定虛擬環境,以便執行單體式應用程式。

下載程式碼

  1. 在本機上開啟終端機。

  2. 將本教學課程的 GitHub 存放區複製到本機電腦:

    git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples.git
    

    資料夾 kubernetes-engine-samples/quickstarts/monolith-to-microservices 包含下列三個資料夾:monolith/modular/containerized/。在本教學課程中,您只會專注於 monolith/ 資料夾中的檔案。

建立並啟動虛擬環境

虛擬環境提供獨立空間來執行應用程式,可避免您為應用程式安裝的 Python 程式庫干擾系統上的其他 Python 專案。

請按照下列步驟建立及啟用虛擬環境:

  1. 在上一節開啟的終端機中,前往您先前複製到機器的存放區,然後進入下列資料夾:

    cd kubernetes-engine-samples/quickstarts/monolith-to-microservices
    
  2. 建立名為 book-review-env 的虛擬環境:

    python3 -m venv book-review-env
    

    建立虛擬環境是個好主意,因為您可以在這個區域獨立執行應用程式。這樣可確保應用程式的依附元件和設定不會與系統上的其他軟體或程式庫發生衝突。

  3. 使用作業系統的指令啟動虛擬環境:

    macOS 和 Linux

    source book-review-env/bin/activate
    

    Windows

    book-review-env\Scripts\activate
    
  4. 安裝單體架構的 Python 依附元件。依附元件是應用程式正常運作所需的外部 Python 程式庫。這些程式庫會列在 requirements.txt 檔案中,下列指令會在虛擬環境中安裝所有程式庫:

    pip install -r monolith/requirements.txt
    

在瀏覽器中執行及探索 Cymbal Books

Cymbal Books 應用程式刻意設計得簡單易用,並提供下列功能:

  • 首頁,顯示圖書館中的所有書籍。
  • 顯示書籍詳細資料的頁面。
  • 詳細資料頁面上的按鈕,點選後會顯示書評。
  • 顯示書籍封面的圖片。

首頁會顯示三本書,每本書旁邊都有「查看詳細資料」按鈕:

書籍評論應用程式的首頁

虛擬環境啟用後,應用程式的依附元件也會安裝在該環境中。現在請按照下列步驟執行應用程式:

  1. 在本機電腦上,前往 monolith 目錄:

    cd monolith/
    
  2. 啟動應用程式:

    python3 mono.py
    
  3. 開啟網路瀏覽器並前往應用程式首頁:http://127.0.0.1:8080

  4. 如要前往書籍的詳細資料頁面,請按一下「查看詳細資料」。詳細資料頁面會提供更多書籍資訊,例如作者和出版年份。

  5. 如要顯示書籍的評論清單,請在詳細資料頁面中按一下「顯示評論」。下圖顯示「Zephyr's Timepiece」的書籍詳細資料頁面和第一則書評:

    顯示書籍詳細資料和書評的圖表

探索 /monolith 資料夾中的檔案

請花點時間檢查 /monolith 資料夾中的檔案:

monolith/
├── mono.py
├── data/
│   ├── book-1.json
│   ├── book-2.json
│   ├── book-3.json
│   ├── reviews-1.json
│   ├── reviews-2.json
│   └── reviews-3.json
├── images/
│   ├── fungi_frontier.jpg
│   ├── melodic_mechanics.jpg
│   └── zephyrs_timepiece.jpg
├── static/
│   ├── styles_for_details.css
│   └── styles_for_home.css
└── templates/
    ├── book_details.html
    └── home.html

主要資料夾和檔案如下:

  • images/ 資料夾包含下列書本封面圖片,這些圖片會顯示在應用程式中:

    • fungi_frontier.jpg
    • melodic_mechanics.jpg
    • zephyrs_timepiece.jpg
  • data/ 資料夾包含下列 JSON 檔案。這些檔案包含 Cymbal Books 程式庫中三本書的評論,以及每本書的詳細資料:

    • reviews-1.jsonreviews-2.jsonreviews-3.json
    • book-1.jsonbook-2.jsonbook-3.json

雖然實際應用程式通常會使用資料庫,但將應用程式資料儲存在 JSON 檔案中可簡化實作程序。Cymbal Book 範例應用程式使用 JSON 檔案,因此您不需要處理複雜的程式碼。您可以專注於本系列教學課程的主要目標,也就是瞭解如何將單體式應用程式模組化及容器化。

您可以忽略下列資料夾,因為其中的檔案對應用程式的版面配置和設計很重要,但與應用程式的邏輯沒有直接關聯:

  • static/:包含定義應用程式樣式的 CSS 檔案。
  • templates/:包含定義應用程式版面配置和內容的 HTML 檔案。

瞭解單體式應用程式 (Flask 應用程式)

本教學課程中的單體式架構是使用 Flask 建構而成,這是用於建構網頁應用程式的 Python 程式庫。不過,Flask 通常不會用於正式環境,因為它不支援並行處理,在負載量大的情況下可能會導致效能瓶頸。Flask 應用程式也缺少健全的錯誤處理和擴充性功能。

Cymbal Books 應用程式使用 Flask,是因為這個架構簡單易用,設定也相當簡便,有助於瞭解模組化和容器化的概念。對於使用 Python 的正式版應用程式,請考慮使用 FastAPI 或 Django 等 Flask 替代方案。您也可以使用專為其他語言設計的架構,例如 Java 適用的 Spring Boot 或 Node.js 適用的 Express.js。這些架構可提供更優異的並行性、可擴充性和適用於正式環境的功能,滿足實際應用程式的需求。

檢查 mono.py

單體的所有邏輯都包含在名為 mono.py 的單一檔案中。這個檔案會建立 Flask 應用程式。Flask 應用程式會在網頁伺服器中執行,監聽特定網址 (稱為端點),並回應對這些網址提出的要求。當使用者要求其中一個網址時 (無論是透過網頁瀏覽器造訪,還是以程式輔助方式提出要求),Flask 都會執行對應的程式碼片段來處理該要求。

下方的螢幕截圖顯示 mono.py 檔案。方塊會醒目顯示應用程式的路徑處理常式。其中一個處理常式會提供使用者可存取的首頁,其他處理常式則主要用於模組間的通訊,以 JSON 格式或靜態圖片檔案傳送資料。下節將詳細說明這些端點。

這張圖表顯示單體式程式碼中各個路徑處理常式的方塊

在螢幕截圖中,方塊會醒目顯示應用程式的路徑處理常式。路由處理常式包含兩個部分:

  • 定義網址模式的 @app.route() 行 (例如 /book/<id>/reviews)。
  • 呼叫端點時執行的函式。

端點是符合 @app.route() 行中定義模式的網址。

舉例來說,當使用者在書籍詳細資料頁面點選「顯示評論」時,應用程式會向 http://localhost:8080/book/1/reviews 發出要求。書籍評論 路徑處理常式會執行下列步驟,以回應這項要求:

  1. 系統會辨識出這個網址符合 /book/<id>/reviews 模式。
  2. 從 JSON 檔案取得書籍 1 的評論。
  3. 以 JSON 格式將這些評論傳回前端。

接著,書籍詳細資料元件會在網頁上以使用者可判讀的格式顯示這些評論。Cymbal Books 單體式架構使用名為 Flask 的 Python 程式庫,簡化路徑處理常式的實作程序。在下一個教學課程中,您會瞭解 Flask 和路徑處理常式在學習如何將單體式應用程式轉換為模組化應用程式時,扮演的重要角色。

單體端點對模組化的重要性

端點在 Flask 應用程式中扮演重要角色,包括 Cymbal Books 應用程式。不過,端點的重要性不僅限於單體式設計,因為瞭解端點是將應用程式拆分成獨立模組的必要條件。原因如下:

  • 核心功能:端點會實作應用程式的主要功能,例如顯示頁面或擷取資料。每項功能都與特定端點相關聯。
  • 模組化:端點可做為自然界線或斷層線,將應用程式劃分為較小的模組。如您在下一個教學課程中所見,模組化版本的應用程式中,每個模組都對應至一個功能,並有自己的端點。
  • 通訊:在模組化設計中,端點可讓自主模組彼此通訊。瞭解端點在 mono.py 中的實作方式,有助於在下一個教學課程中,將 Cymbal Books 應用程式模組化為獨立模組。

測試單體應用程式的路由處理常式

如要查看各個路徑處理常式傳回的資料類型,請在瀏覽器中前往下列端點:

  • 首頁路徑處理常式:前往 http://localhost:8080/,查看顯示書籍目錄的完整 HTML 網頁。
  • 書籍詳細資料路徑處理常式:前往 http://localhost:8080/book/1,查看顯示特定書籍詳細資料的 HTML 網頁。這個網頁會從伺服器擷取書籍的 JSON 資料,並使用 HTML 範本以人類可讀的形式呈現。如要查看其他書籍的詳細資料,請變更網址中的 ID 編號 (1、2 或 3)。
  • 書籍評論路徑處理常式:前往 http://localhost:8080/book/3/reviews 即可查看書籍評論的 JSON 資料。當你點選「Melodic Mechanics」書籍詳細資料頁面上的 Show Reviews 時,系統會將這項資料處理為可讀取的格式。
  • 圖片路徑處理常式:前往 http://localhost:8080/images/fungi_frontier.jpg 查看圖片檔。首頁和書籍詳細資料頁面會呼叫這個端點,顯示書籍的封面圖片。

摘要

在本教學課程中,您設定並執行了單體式 Cymbal Books 應用程式。接著,您瞭解到單體式應用程式是以 Flask 應用程式的形式實作,會監聽特定網址 (稱為端點),並回應對這些網址提出的要求。

後續步驟

在下一個教學課程「將單體式架構模組化」中,您將瞭解如何將單體式架構拆分成獨立模組。