65.9K
CodeProject 正在变化。 阅读更多。
Home

在 Azure 上现代化 Python 应用和数据(第六部分):成为云原生

2022 年 5 月 4 日

CPOL

8分钟阅读

viewsIcon

5819

如何开始让应用程序更具云原生性,并演示如何将遗留应用程序的功能迁移到 Azure Serverless Function 应用。

在本系列文章中,我们探讨了多种现代化现实世界 Django 遗留应用的方法。

第一篇文章中,我们用 PostgreSQL 替换了 SQLite 数据库,并填充了示例数据。第二篇文章演示了设置 Azure Database for PostgreSQL 并将应用数据迁移到 Azure

我们在第三篇文章中通过 Azure 门户创建了该应用,并使用 VS Code Azure App Service 扩展进行了部署。第四篇文章展示了如何将我们的 Python 遗留应用容器化,创建 AKS 群集,并使用 Visual Studio Code 进行部署

第五篇文章中,我们创建了一个 Cosmos DB 数据库,然后使用 Djongo Mapper 和 Cosmos DB 的 MongoDB API 调整了我们的应用以适应它。

在本系列的最后一篇文章中,我们将探讨如何开始使应用更加云原生。我们将演示如何将遗留应用的功能迁移到 Azure Serverless Function 应用。

您可以按照本文中的步骤来运行您的应用程序,或者下载并打开此GitHub 存储库文件夹以获取最终项目。您应该了解 Python 和 Django 才能继续学习。

Azure Serverless Functions 的优势

Microsoft Azure Functions 无服务器计算服务使开发人员能够更快地构建应用程序。他们不必担心设置或维护基础设施。无服务器应用开发还使开发人员能够创建在云平台上本地运行的代码。

定价模式是无服务器架构的另一个优势。借助 Microsoft Azure Functions,开发人员可以按需分配资源,无需前期成本或承诺。Azure Functions 可高度可用,您可以配置它们随着用户群的增长和使用量的增加而自动扩展。

Azure Functions 最适合小型应用,例如我们基于 Django 的后端应用,它可以独立于其他网站运行。

设置 Azure Function App

我们将创建 Azure Function App,可以直接通过 Azure 门户创建,也可以使用 VS Code 扩展,从而允许我们直接从我们喜欢的 IDE 与 Azure Functions 进行交互。

打开 VS Code 以访问本系列上一篇文章中的代码。单击扩展选项卡,如下图所示。然后,搜索“Azure Functions”并安装该软件包。

Title: Inserting image...

Azure Functions 扩展使您能够从 VS Code 内快速创建、调试、管理和部署无服务器应用程序。这些工具与您的 Azure 帐户无缝集成,从而实现快速开发和简单的部署。

现在是时候创建我们的 Azure Function 了。选择Azure选项卡,然后在Functions部分中单击Create Function图标。

不过,我们还没有 Azure 中的Function项目。我们将在本地创建它,稍后将其上传到云。

现在会弹出一个窗口询问您是否要创建新项目。单击Yes

Azure Functions 支持多种编程语言,如 Python、JavaScript、TypeScript、C#、PowerShell 和 Java。选择Python

现在我们选择 Function 项目的模板。有许多Azure Functions 触发器,适用于各种用途,具体取决于函数何时运行。例如,您可能希望一个函数每天早上 6 点运行一次,或者每当消息队列处理一个项目时运行。

在我们的应用中,我们需要 HTTP 触发器来响应来自Teams选项卡的 HTTP 请求,因此请选择该选项。

现在我们将 Azure 函数命名为“az-function-conduit

然后,我们提供授权级别。我们通过选择Anonymous使其公开。

接下来,弹出窗口会询问是否覆盖.gitignorerequirements.txt文件。对这两个问题都回答No

现在我们有了第一个 Azure 函数。

现在,我们选择Functions组,然后单击“部署到 Function App”按钮

我们还没有 Azure 中的 Function App,所以我们通过单击第一个选项+ Create new Function App in Azure来创建它。

将项目命名为“conduit-function-app”。

请注意,VS Code 现在会显示一个新文件夹,您可以在其中方便地浏览存储在 Azure 云中的 Function App 的数据。这包括文件、日志和设置。

单击Explorer选项卡以查看您的源代码。请注意

  • 我们的 Azure Function 位于一个单独的 Python 模块中。
  • host.json元数据文件包含 Function App 实例中我们 Function 的配置。
  • local.settings.json文件提供了应用在本地运行时所需的设置。

接下来,我们必须确保 Azure Functions 支持 Python。因此,打开requirements.txt文件并添加此行

azure-functions

现在我们的az-function-conduit函数已准备就绪,我们可以对其进行本地调试,以确保其按预期工作。单击调试图标并选择Attach to Python Functions,或按F5键。

一旦您开始调试,终端窗口就会出现,并且一个 URL 会在本地托管该函数。

在浏览器窗口中打开此 URL。由于我们的函数应用几乎是空的,浏览器会显示 Azure Functions 的标准模板消息。

在 Azure Function 中运行 Django

此时,我们在同一项目中有一个 Conduit 模块(基于 Django REST framework)和一个 Azure Function 模块。由于本文旨在演示如何将我们的 Django 应用迁移到 Azure Functions,因此我们可以将代码从 Conduit 模块迁移到az-function-conduit应用。但是,这种方法工作量很大,但收益不大。

幸运的是,Django 支持 Web Server Gateway Interface (WSGI)。部署到 Web 服务器时,WSGI 使您能够将请求转发到用 Python 编写的 Web 应用。我们可以通过将 Django 代码保留在 Conduit 模块中而不进行修改,并告诉 Azure Function 模块将调用重定向到 Django 处理器来利用 WSGI。

因此,打开\az-function-conduit\__init__.py文件,并用以下代码片段替换那里的代码

import logging

import azure.functions as func
from conduit.wsgi import application

def main(req: func.HttpRequest, context: func.Context) -> func.HttpResponse:
    return func.WsgiMiddleware(application).handle(req, context)

上面的代码中的WsgiMiddleware方法将 WSGI 支持的 Python 服务器框架(如 Django)适配到 Azure Functions。我们可以通过调用.handle()函数或在HttpTrigger事件中公开.main属性来使用它。

接下来,打开\az-function-conduit\function.json文件,并添加此行

"route": "{*route}"

像这样

{
  "scriptFile": "__init__.py",
  "bindings": [
    {
      "authLevel": "anonymous",
      "type": "httpTrigger",
      "direction": "in",
      "name": "req",
      "methods": [
        "get",
        "post"
      ],
      "route": "{*route}"
    },
    {
      "type": "http",
      "direction": "out",
      "name": "$return"
    }
  ]
}

然后打开\conduit\settings.py文件,并将ALLOWED_HOSTS替换为允许任何主机为应用程序提供服务

ALLOWED_HOSTS = ['*']

定义应用程序设置

使用环境变量是定义应用配置的常用方法,具体取决于其环境。

由于数据库配置取决于项目的 Azure 凭据,因此修改配置而不触及应用程序的源代码并使机密信息脱离源代码存储库是有益的。

因此,现在打开\conduit\settings.py文件,我们的数据库设置就位于此处,并使用 Python 的os模块按如下方式访问环境变量设置

DATABASES = {
    'default': {
        'ENGINE': 'djongo',
        'ENFORCE_SCHEMA': False,
        'NAME': os.getenv('DATABASE_NAME'),
        'CLIENT': {
            'host': os.getenv('DATABASE_HOST'),
            'port': 10255,
            'username': os.getenv('DATABASE_USER'),
            'password': os.getenv('DATABASE_PASSWORD'),
            'authMechanism': 'SCRAM-SHA-1',
            'ssl': True,
            'tlsAllowInvalidCertificates': True,
            'retryWrites': False
        }   
    }   
}

然后,打开 Azure 门户并找到您的 Azure Cosmos DB API for MongoDB 帐户。单击Connection String选项卡以查看我们将在应用中使用的数据库配置密钥。

返回 VS Code,单击Azure选项卡,选择conduit-function-app,然后展开Application Settings节点。

右键单击Application Settings节点并选择Add New Setting

您将在其中提供新的设置键和值。对每个应用程序设置名称及其值重复此步骤。

  • DATABASE_NAMEconduit_db
  • DATABASE_HOST:<<your-azure-cosmos-account>>.mongo.cosmos.azure.com
  • DATABASE_USER:<<your-azure-cosmos-account>>
  • DATABASE_PASSWORD:<<your-azure-cosmos-password>>

新的应用程序设置将出现在一个列表中,如下面的屏幕截图所示。

现在是时候将这些数据库配置上传到您的 Azure Function 应用了。右键单击Application Settings并选择Upload Local Settings菜单项。

测试 Azure Function App

现在我们已将数据库设置上传到云端,让我们来测试在 Azure Function 上运行的 Conduit 应用。打开 Azure 门户并搜索并单击Function App

接下来,单击您的 Azure Function App 的名称。

Overview选项卡中,单击 URL 链接。

此操作会在新的浏览器标签页中打开 Azure Functions 应用的基本地址。

要列出文章,请在 URL 末尾添加/api/articles,如下所示

https://<<YOUR-FUNCTION-APP>>.azurewebsites.net/api/articles

接下来,导航到/api/articles/create-a-new-implementation-ukwcnm路径以浏览特定文章的详细信息,如下所示

https:// <<YOUR-FUNCTION-APP>>.azurewebsites.net/api/articles/create-a-new-implementation-ukwcnm

要查看该特定文章的评论,请导航到/api/articles/create-a-new-implementation-ukwcnm/comments路径

https:// <<YOUR-FUNCTION-APP>>.azurewebsites.net/api/articles/create-a-new-implementation-ukwcnm/comments

我们的遗留应用的文章现在可以通过 Azure Function 应用在云端可用。

结论

在“现代化 Azure 上的 Python 应用和数据”系列的最后一篇文章中,我们讨论了将遗留应用迁移到 Azure Serverless Functions。这种新方法在使用 Django Rest Framework 方面与之前的文章有一些根本性的不同。我们没有将 Django 应用托管在 Azure App Service 上(我们可以构建、部署和扩展完全托管平台上的 Web 应用),而是使用 Azure Functions 来监听和响应 HTTP 请求等事件。

通过将我们的应用迁移到无服务器计算服务,我们学会了如何在 Function App 中创建和配置 Azure Function。然后,我们使用 WSGI 中间件将 Django Rest framework 应用适配到 Azure Function。

将您的 Django Rest Framework 应用集成到 Azure Function 中,可以让您编写更少的代码,维护更少的基础设施,并节省成本。您可以避免部署和维护服务器的麻烦,因为 Azure 基础设施提供了保持应用程序运行所需的所有最新资源。

将遗留应用程序迁移到云可能起初看起来令人生畏。但是,通过将任务分解为阶段并利用方便的工具,包括 Azure 的众多选项,您可以现代化您的应用程序,使其在云中易于维护、灵活、可扩展且具有弹性。

要了解有关如何在云中构建和部署 Python 应用的更多信息,请查看Python 应用开发 - Azure 上的 Python

© . All rights reserved.