使用 Azure Functions 和 .NET 解决方案构建无服务器应用程序
已发表: 2023-09-21无服务器计算是一种云执行模型,使开发人员能够构建和运行应用程序和服务,而无需考虑服务器。 通过无服务器,应用程序不依赖于保持服务器运行——云提供商动态管理服务器的分配和配置。 这使得开发人员能够专注于编写业务逻辑而不是服务器管理。
Microsoft Azure Functions 是一种无服务器计算服务,用于构建和托管 Web 端点和后台处理作业,而无需预配或管理服务器。 借助 Azure Functions,你可以按需运行代码来响应事件,而无需显式预配或管理基础结构。 在这篇博文中,我们将探讨如何使用 .NET 解决方案通过 Azure Functions 构建无服务器应用程序,包括利用ASP.NET 开发服务。
什么是 Azure 函数?
Azure Functions 允许您在云中运行代码,而无需部署或管理基础设施。 使用 Functions,您只需编写解决当前问题所需的代码,而无需担心管理服务器。 Azure 为你管理所有基础设施和服务器。
Azure Functions 的一些关键方面和优势:
- 事件驱动:函数由来自许多 Azure 和第三方服务的事件触发。 其中包括 HTTP 请求、计时器、队列、无服务器 API 等。 您可以运行代码来响应这些事件。
- 自动扩展:Azure 根据传入请求率和处理负载自动管理和扩展功能。 您无需手动配置和扩展服务器。
- 按执行付费:您只需为运行代码所需的计算资源付费。 当您的功能未运行时,不会产生闲置费用。
- 多种语言:Functions 支持 C#、JavaScript、Python、PowerShell、Java 等。 您可以用您喜欢的语言开发功能。
- 无服务器体验:使用 Functions,您可以专注于编写代码,并让 Azure 处理所有服务器预配、配置和管理。 您将获得真正的无服务器体验。
本地开发 .NET 函数
要在本地开发 .NET 函数,您需要 Azure Functions Core Tools,它是一个命令行界面,用于在本地和 Azure 上开发、测试和部署 Azure Functions。
设置开发环境:
- 安装.NET Core SDK最新版本
- 使用 dotnet tool install -g Microsoft.Azure.WebJobs.Script.WebHost 安装 Azure Functions Core Tools
- 为函数应用程序项目创建一个目录并运行 func init
- 这将使用函数模板搭建一个示例函数项目
现在,您可以添加函数代码,在本地测试它并使用 func CLI 发布到 Azure。 为 HTTP 触发的 C# 函数添加 run.csx 文件:
来源 {csharp}
复制
#r“Newtonsoft.Json”
使用 Microsoft.AspNetCore.Mvc;
使用 Microsoft.Extensions.Primitives;
使用 Newtonsoft.Json;
使用System.Net;
使用 System.Threading.Tasks;
公共静态异步任务 <IActionResult> Run(HttpRequest req,ILogger 日志)
{
log.LogInformation(“C# HTTP 触发函数处理了一个请求。”);
字符串名称 = req.Query[“名称”];
string requestBody = wait new StreamReader(req.Body).ReadToEndAsync();
动态数据 = JsonConvert.DeserializeObject(requestBody);
名字=名字?? 数据?.名称;
返回名称!= null
? (ActionResult)new OkObjectResult($”你好,{name}”)
: new BadRequestObjectResult(“请在查询字符串或请求正文中传递名称”);
}
通过运行 func host start 在本地测试它,这会在本地主机上启动功能网关。 现在您可以使用 Postman 或浏览器通过 http://localhost:7071/api/HttpExample?name=John 触发它。
选择 Azure Functions 触发器和绑定
Azure Functions 支持许多不同的事件源和目标,称为触发器和绑定。 根据您的用例选择正确的触发器和绑定非常重要。
函数中的一些常见触发器是:
- HTTP 触发器:用于构建 REST API 和 Web 端点。 代码由 HTTP 请求触发。
- 计时器触发器:适用于按计划运行的预定作业,例如每 5 分钟运行一次。
- 队列触发器:用于处理来自存储队列的消息。
- Blob 触发器:用于对 Azure Blob 存储中的新的或更新的 Blob 做出反应。
绑定允许函数与外部数据存储和服务交互。 常见的绑定包括:
- 存储队列:用于将消息输出到存储队列。
- Blob 存储:用于读取和写入 Azure Blob 存储。
- Cosmos DB:用于查询和修改 Azure Cosmos DB 数据库服务中的文档。
- 服务总线:用于处理来自 Azure 服务总线队列和主题的消息。
选择正确的触发器和绑定有助于通过将不同的功能与数据和服务集成来构建端到端解决方案。
使用耐用功能
持久函数允许编写有状态函数,即使在发生故障或重新启动的情况下,也可以可靠地执行操作序列。 它允许您将长期运行的工作流程构建为状态机。
例如,您可以使用 Durable Functions 构建一个工作流程,其中包括:
- Orchestrator 功能:充当状态机,以正确的顺序协调活动功能的执行。
- 活动函数:可以由协调器函数调用的小型独立工作单元。
使用耐用功能的好处包括:
- 可靠的重试:如果活动函数失败,Durable Functions 会自动重试活动函数。
- 异步调用:orchestrator 函数可以异步运行活动函数并等待其完成。
- 检查点:状态会连续设置检查点,因此即使在应用程序重新启动或失败后也可以恢复工作流程。
让我们看看一个协调两个活动的简单工作流程:
来源 {csharp}
复制
[函数名称(“协调器”)]
公共静态异步任务 RunOrchestrator(
[OrchestrationTrigger] IDurableOrchestrationContext 上下文)
{
var output1 = wait context.CallActivityAsync<string>(“DotNetActivity”, “Hello”);
varoutput2=awaitcontext.CallActivityAsync<string>(“DotNetActivity”,output1);
// 返回结果
返回输出2;
}
[函数名称(“DotNetActivity”)]
公共静态任务<字符串>运行(
[ActivityTrigger] 字符串输入,
ILogger日志)
{
log.LogInformation($”处理的DotNetActivity函数:{input}”);
返回 Task.FromResult(input.ToUpper());
}
耐用功能允许将复杂的流程分解为可靠的工作流程。
Azure Functions 开发的最佳实践
Azure Functions 开发应遵循的一些最佳实践:
- 使用依赖项注入:依赖项将服务注入到函数中以获得更好的可测试性。
- 避免长时间运行的进程:函数旨在在小型处理单元上运行代码。 保持代码执行简短。
- 使用不可变数据类型:函数是无状态的,因此请避免可能导致问题的可变类型/副作用。
- 集中错误处理:添加通用的错误处理逻辑,而不是在各处单独处理错误。
- 结构化日志记录:标准化日志记录有助于调试、监控和审计跟踪。
- 限制和重试:通过实施指数退避重试来处理限制错误。
- 版本控制:强版本触发器、绑定和输入/输出以避免重大更改。
- 监控和检测:使用 Application Insights 等工具进行日志记录、监控性能和使用情况分析。
- 使用上下文绑定:利用上下文绑定来访问应用程序设置等内容,而无需额外的依赖项。
遵循这些最佳实践有助于使用 Azure Functions 构建强大、可靠且可扩展的无服务器应用程序。
将功能部署到 Azure
函数准备就绪后,您可以通过 Azure CLI、PowerShell、Visual Studio 或直接从 Azure Functions 核心工具 CLI 将它们部署到 Azure:
复制
func azure functionapp 发布 <函数应用名称>
这会将函数项目文件夹发布到 Azure Function App。 将功能部署到 Azure 的几个主要好处包括:
- 自动扩展 – 功能根据传入请求量或时间触发进行扩展。
- 高可用性 – 跨数据中心的多个实例提供高可用性。
- 监控和日志记录 – 使用 Application Insights 等工具来监控性能、错误等。
- 无服务器平台 – 无需配置/管理服务器。 您只需专注于代码。
- 持续部署 – 使用 CI/CD 管道对代码更改进行自动部署。
Azure 处理所有基础设施,避免闲置成本,并提供完全无服务器平台来可靠地大规模运行无服务器应用程序。
结论
使用 Azure Functions 的无服务器计算使开发人员能够专注于业务逻辑,同时将所有基础设施和运营管理卸载到 Azure。 本机 .NET 开发支持(包括雇用 ASP.NET Core 开发人员的选项)允许使用 C# 轻松构建强大的无服务器解决方案。 借助触发器、绑定和持久函数,开发人员可以将端到端事件驱动的架构和工作流程构建为无状态和有状态函数。 与最佳实践相结合,Azure Functions 允许简单且可扩展地构建无服务器应用程序并将其部署到云中。