目录
这是一个由6部分组成的系列文章的第6部分,演示如何采用整体式Python应用程序,并使用Azure工具和服务逐步实现应用程序及其数据的现代化。本文讨论如何开始使应用更加云原生,并演示如何开始将旧应用的功能移动到基于Azure函数的微服务中。
在本系列中,我们探讨了如何以多种方式实现现实世界Django遗留应用程序的现代化。
在第一篇文章中,我们用PostgreSQL替换了SQLite数据库,并用示例数据填充了它。第二篇文章演示了如何为PostgreSQL设置Azure数据库并将应用的数据迁移到Azure。
我们在第三篇文章中通过Azure门户创建了应用,并使用VS Code Azure应用服务扩展部署了它。第四篇文章介绍了如何容器化我们的旧版Python应用,创建AKS群集,并使用Visual Studio Code进行部署。
在第五篇文章中,我们创建了一个Cosmos DB数据库,然后使用Djongo Mapper和Cosmos DB的MongoDB API调整了我们的应用以使用它。
在本系列的最后一篇文章中,我们将探讨如何开始使应用更加云原生。我们将演示如何将旧版应用的功能移动到Azure无服务器函数应用中。
可以按照本文中的步骤运行应用程序,也可以下载并打开此GitHub存储库文件夹以获取最终项目。你应该知道Python和Django。
Azure无服务器函数的优势
Microsoft Azure Functions无服务器计算服务使开发人员能够更快地构建应用程序。他们不必担心设置或维护基础设施。无服务器应用开发还使开发人员能够创建在云平台上本机运行的代码。
定价模型是另一个无服务器体系结构优势。借助Microsoft Azure Functions,开发人员可以按需分配资源,无需前期成本或承诺。Azure函数具有高可用性,你可以将它们配置为随着用户群的增长和使用量的增加而自动缩放。
Azure Functions最适合小型应用,例如基于Django的后端应用,它可以独立于其他网站工作。
设置Azure函数应用
我们将直接通过Azure门户或使用VS Code扩展创建Azure函数应用,允许我们直接从自己喜欢的IDE与Azure函数进行交互。
打开VS Code以访问本系列上一篇文章中的代码。单击“扩展”选项卡,如下面的屏幕截图所示。然后,搜索“Azure函数”并安装该包。
Azure Functions扩展允许你从VS Code中快速创建、调试、管理和部署无服务器应用。这些工具与Azure帐户无缝集成,可实现快速开发和直接部署。
现在是时候创建我们的Azure函数了。选择“Azure”选项卡,然后单击“函数”部分中的“创建函数”图标。
不过,我们在Azure上仍然没有Function项目。我们现在将在本地创建它,然后稍后将其上传到云端。
现在会弹出一个窗口询问您是否想要创建一个新项目。单击Yes。
Azure函数支持多种编程语言,如Python、JavaScript、TypeScript、C#、PowerShell和Java。选择“Python”。
现在,我们选择函数项目的模板。有多种形式的Azure函数触发器可用于各种用途,具体取决于函数的运行时间。例如,您可能希望函数每天早上6点运行一次,或者在消息队列处理项目时运行一次。
在我们的应用中,我们需要HTTP触发器来响应来自“团队”选项卡的HTTP请求,因此请选择该选项。
现在我们将Azure函数命名为“az-function-conduit”:
然后,我们提供授权级别。我们通过选择匿名来公开它。
接下来,弹出窗口将询问是否覆盖 .gitignore和requirements.txt文件。对这两个问题的回答“否”。
我们现在有了第一个Azure函数。
现在,我们选择“函数”组,然后单击“部署到函数应用”按钮:
Azure中仍然没有函数应用,因此我们通过单击第一个选项“+在Azure中创建新的函数应用”来创建它。
将项目命名为“conduit-function-app”。
请注意VS Code现在如何显示一个新文件夹,你可以在其中方便地浏览存储在Azure云中的函数应用中的数据。这包括文件、日志和设置。
单击“资源管理器”选项卡以查看源代码。请注意:
- 我们的Azure函数位于一个单独的Python模块中。
- host.json元数据文件包含函数应用实例中的函数配置。
- local.settings.json文件提供应用在本地运行时的设置。
接下来,我们必须确保Python对Azure Functions的支持。因此,打开requirements.txt文件并添加以下行:
azure-functions
现在我们的az-function-conduit函数已经准备好了,我们可以在本地调试它以确保它按预期工作。单击调试图标并选择附加到Python函数,或按F5键。
一旦开始调试,就会出现终端窗口,并在本地托管函数的URL。
在浏览器窗口中打开此URL。由于我们的函数应用实际上是空的,因此浏览器会显示Azure函数的标准模板消息:
在Azure函数中运行Django
此时,我们在同一项目中有一个Conduit模块(基于Django REST框架)和一个Azure Function模块。由于本文旨在演示如何将我们的Django应用程序移动到Azure Functions,因此我们可以将代码从Conduit模块迁移到az-function-conduit应用程序。但是,这种方法需要大量工作而没有多大好处。
幸运的是,Django实现了Web服务器网关接口(WSGI)。当部署到Web服务器时,WSGI使您能够将请求转发到用Python编写的Web应用程序。我们可以利用WSGI,保持Conduit模块中的Django代码不变,并告诉Azure函数模块将调用重定向到Django处理程序。
因此,打开\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门户并找到适用于MongoDB帐户的Azure Cosmos DB API。单击“连接字符串”选项卡,查看我们将在应用中使用的数据库配置密钥。
返回VS Code,单击“Azure”选项卡,选择conduit-function-app并展开“应用程序设置”节点。
右键单击“应用程序设置”节点,然后选择“添加新设置”。
您将在此处提供新的设置键和值。对每个应用程序设置名称及其值重复此步骤。
- DATABASE_NAME: conduit_db
- DATABASE_HOST:<<your-azure-cosmos-account>>.mongo.cosmos.azure.com
- DATABASE_USER:<<your-azure-cosmos-account>>
- DATABASE_PASSWORD:<<your-azure-cosmos-password>>
新的应用程序设置将显示在列表中,如下面的屏幕截图所示:
现在可以将这些数据库配置上传到Azure函数应用。右键单击应用程序设置,然后选择上载本地设置菜单项。
测试Azure函数应用
现在,我们已将数据库设置上传到云,让我们测试在Azure函数上运行的管道应用。打开Azure门户,搜索并单击“函数应用”:
接下来,单击Azure函数应用的名称。
在概述选项卡中,单击URL链接。
此操作将打开一个新的浏览器选项卡,其中包含Azure函数应用的基址。
要列出文章,请将/api/articles添加到URL,如下所示:
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函数应用在云中获取。
结论
在Azure上现代化Python应用和数据系列的最后一篇文章中,我们讨论了将旧版应用迁移到Azure无服务器函数。与之前的文章相比,这种新方法在使用Django Rest框架方面有一些根本差异。我们没有在Azure应用服务中托管Django应用,我们可以在完全托管的平台上生成、部署和缩放Web应用,而是使用Azure Functions来侦听和响应HTTP请求等事件。
在将应用移动到无服务器计算服务时,我们学习了如何在函数应用中创建和配置Azure函数。然后我们使用WSGI中间件将Django Rest框架应用程序改编为Azure Function。
将Django Rest Framework应用集成到Azure函数中,可以减少代码编写、维护较少的基础结构并节省资金。可以避免部署和维护服务器的不便,因为Azure基础结构提供了保持应用程序运行所需的所有最新资源。
起初,将旧版应用程序迁移到云中似乎令人生畏。但是,通过将任务分解为多个阶段并使用方便的工具(包括Azure的许多选项),你可以使应用现代化,使其在云中变得低维护、灵活、可缩放和可复原。
若要详细了解如何在云中生成和部署 Python 应用,请查看Python应用开发——Azure上的Python。
https://www.codeproject.com/Articles/5330687/Modernizing-Python-Apps-and-Data-on-Azure-Part-6-B