学习路线:将单体式应用转换为 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 虚拟机的费用。

为避免产生不必要的费用,请务必在完成本教程后停用 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 应用的设计简洁明了,具有以下功能:

  • 显示书库中所有图书的首页。
  • 显示图书详细信息的页面。
  • 详细信息页面上的一个按钮,点击后会显示图书评价。
  • 能够显示图书封面图片。

首页会显示三本图书,每本图书旁边都会显示一个“View Details”(查看详细信息)按钮:

图书评价应用的首页

现在,虚拟环境处于活跃状态,并且应用的依赖项已安装在该环境中,请按照以下步骤运行应用:

  1. 在本地机器上,进入单体式应用目录:

    cd monolith/
    
  2. 启动应用:

    python3 mono.py
    
  3. 打开网络浏览器并前往应用的首页:http://127.0.0.1:8080

  4. 如需前往图书的详细信息页面,请点击 View Details(查看详细信息)。详细信息页面会提供有关图书的更多信息,例如作者和出版年份。

  5. 如需显示图书评价列表,请在详细信息页面上点击 Show Reviews(显示评价)。下图显示了图书《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 构建的,Flask 是一个用于构建 Web 应用的 Python 库。不过,Flask 通常不用于生产环境,因为它不支持并发,这可能会导致在高负载下出现性能瓶颈。Flask 应用还缺少强大的错误处理和可伸缩性功能。

Cymbal Books 应用使用 Flask 是因为它简单易用且只需进行极少的设置,可让您更轻松地理解模块化和容器化的概念。对于使用 Python 的生产级应用,请考虑使用 Flask 的替代方案,例如 FastAPI 或 Django。您还可以使用针对其他语言量身定制的框架,例如适用于 Java 的 Spring Boot 或适用于 Node.js 的 Express.js。这些框架可以提供更好的并发性、可伸缩性和可用于生产用途的功能,以满足实际应用的需求。

检查 mono.py

单体式应用的所有逻辑都包含在一个名为 mono.py 的文件中。此文件会创建一个 Flask 应用。Flask 应用在 Web 服务器内运行,监听特定网址(称为端点)并响应向这些网址发出的请求。当有人向其中某个网址发出请求(通过在网络浏览器中访问该网址或以编程方式发出请求)时,Flask 会运行相应的代码段来处理该请求。

以下屏幕截图显示了 mono.py 文件。方框突出显示了应用的路由处理程序。一个处理程序用于处理面向用户的首页,而其他处理程序主要用于模块间通信(提供 JSON 格式的数据或静态图片文件)。后续部分将更详细地介绍这些端点。

在单体式代码中各种路由处理程序周围显示方框的示意图

在屏幕截图中,方框突出显示了应用的路由处理程序。路由处理程序由两部分组成:

  • 定义网址格式(例如 /book/<id>/reviews)的 @app.route() 行。
  • 在调用端点时运行的函数。

端点是指与 @app.route() 行中定义的格式匹配的网址。

例如,当用户在图书详细信息页面上点击 Show Reviews(显示评价)时,应用会向 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 应用的形式实现的,该应用会监听特定网址(称为端点),并响应向这些网址发出的请求。

后续步骤

在下一个教程将单体式应用模块化中,您将了解如何将单体式应用分解为独立的模块。