使用 Azure Functions 开发 Serverless 应用:详解与实战

news/2024/9/21 14:15:13 标签: azure, serverless, flask

使用 Azure Functions 开发 Serverless 应用:详解与实战

随着云计算的发展,Serverless(无服务器架构)已成为构建现代应用的重要模式。它能够让开发者专注于业务逻辑,而不需要关注底层的服务器管理、扩展等问题。Azure Functions 是微软提供的 Serverless 计算服务,具有高度的可扩展性和易用性。本篇博客将详细介绍如何使用 Azure Functions 开发 Serverless 应用,并展示从入门到高深的技术实践。

一、什么是 Serverless 以及 Azure Functions?

Serverless 并不意味着没有服务器,而是服务器的管理、扩展、维护都被云平台(如 Azure)自动化处理。开发者只需编写代码,其他由平台负责。Serverless 应用的优点包括:

  • 按需付费:只为实际运行时间和资源消耗付费。
  • 自动扩展:无需手动管理服务器,自动根据请求负载扩展和缩减。
  • 减少运维工作:无需配置服务器或容器,只需专注于代码。

Azure Functions 是微软 Azure 平台中的一种 Serverless 计算服务,用于运行事件驱动的代码。它支持多种触发器和语言(如 C#、JavaScript、Python、Java、PowerShell),并可以与 Azure 的其他服务(如 Blob Storage、Event Hub、Service Bus)无缝集成。

二、Azure Functions 开发环境的设置
2.1 安装工具

为了在本地开发和调试 Azure Functions,你需要安装以下工具:

  • Azure Functions Core Tools:用于在本地创建、调试和测试函数应用。
  • Visual Studio/Visual Studio Code:支持 Azure Functions 的开发环境。
  • Azure CLI:用于与 Azure 交互的命令行工具。

你可以通过以下命令安装 Azure Functions Core Tools:

npm install -g azure-functions-core-tools@4 --unsafe-perm true
2.2 创建 Azure Functions 项目

我们将使用 Visual Studio Code 创建一个简单的 Azure Functions 应用。确保你安装了 Azure Functions 扩展,并选择 C# 作为开发语言。

  1. 打开 Visual Studio Code,点击 View -> Command Palette
  2. 输入 Azure Functions: Create New Project,并选择一个目录。
  3. 选择 .NET 作为语言,选择 HttpTrigger 作为函数模板。
  4. 选择授权级别(如 FunctionAnonymous)。

生成的代码会类似如下:

using System.IO;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;

public static class HttpTriggerFunction
{
    [FunctionName("HttpTriggerFunction")]
    public static async Task<IActionResult> Run(
        [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
        ILogger log)
    {
        log.LogInformation("C# HTTP trigger function processed a request.");

        string name = req.Query["name"];

        if (string.IsNullOrEmpty(name))
        {
            return new BadRequestObjectResult("Please pass a name on the query string or in the request body");
        }

        return new OkObjectResult($"Hello, {name}");
    }
}

这是一个简单的 HTTP 触发器函数,它可以接收 GETPOST 请求,并返回一个简单的消息。

2.3 本地调试 Azure Functions

在本地调试 Azure Functions 十分方便。你可以直接在 Visual Studio 或 Visual Studio Code 中按下 F5 启动调试模式,Azure Functions Core Tools 会启动一个本地的开发服务器来运行函数。

你可以通过浏览器访问 http://localhost:7071/api/HttpTriggerFunction?name=Azure,函数会返回 Hello, Azure

三、触发器和绑定:扩展 Azure Functions 的能力

触发器 是 Azure Functions 的核心概念,定义了函数如何被调用。Azure Functions 支持多种触发器,包括:

  • HTTP Trigger:响应 HTTP 请求。
  • Timer Trigger:按计划执行任务。
  • Blob Trigger:当 Blob 存储中的文件发生变化时触发。
  • Queue Trigger:当消息被添加到 Azure Storage 队列时触发。
  • Event Hub/Service Bus Trigger:响应 Azure Event Hub 或 Service Bus 中的消息。

此外,Azure Functions 还支持 输入/输出绑定,允许函数直接与其他 Azure 服务交互,无需手动编写代码。例如,你可以使用绑定将函数的输出自动写入 Blob 存储,或将输入从 Service Bus 队列中读取。

以下是一个包含 Blob 触发器和输出绑定的示例:

[FunctionName("BlobTriggerFunction")]
public static void Run(
    [BlobTrigger("input-container/{name}", Connection = "AzureWebJobsStorage")] Stream myBlob, 
    string name, 
    ILogger log,
    [Blob("output-container/{name}", FileAccess.Write, Connection = "AzureWebJobsStorage")] Stream outputBlob)
{
    log.LogInformation($"C# Blob trigger function Processed blob\n Name:{name} \n Size: {myBlob.Length} Bytes");

    // 将输入 Blob 的数据复制到输出 Blob
    myBlob.CopyTo(outputBlob);
}

这个函数会在 Blob 被上传到 input-container 时触发,并将其复制到 output-container 中。

四、高深实践:自动化与CI/CD集成
4.1 使用 Azure DevOps 实现 CI/CD

为了在开发过程中保持高效的自动化部署,Azure DevOps 提供了完整的 CI/CD 流水线支持。以下是一个简单的 Azure DevOps 流水线配置示例,用于自动化部署 Azure Functions 应用:

trigger:
- main

pool:
  vmImage: 'windows-latest'

steps:
- task: UseDotNet@2
  inputs:
    packageType: 'sdk'
    version: '7.x.x'
    installationPath: $(Agent.ToolsDirectory)/dotnet

- task: DotNetCoreCLI@2
  inputs:
    command: 'restore'
    projects: '**/*.csproj'

- task: DotNetCoreCLI@2
  inputs:
    command: 'build'
    projects: '**/*.csproj'

- task: AzureFunctionApp@1
  inputs:
    azureSubscription: 'YourAzureSubscription'
    appType: 'functionApp'
    appName: 'YourFunctionAppName'
    package: '$(System.DefaultWorkingDirectory)/bin/Release/net7.0/publish'

这个流水线会在 main 分支发生变化时触发,自动编译、打包并将代码部署到 Azure Functions。

4.2 使用 Application Insights 进行监控和日志分析

Azure Functions 与 Application Insights 集成,可以对函数的执行情况进行实时监控、日志收集和性能分析。你可以通过 Application Insights 监控:

  • 函数的执行时间、错误率等性能指标。
  • HTTP 请求的详细跟踪。
  • 自定义日志输出。

通过在函数中注入 ILogger 并记录日志,你可以轻松将日志推送到 Application Insights:

public static async Task<IActionResult> Run(
    [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
    ILogger log)
{
    log.LogInformation("Processing request...");

    try
    {
        // Your function logic
        return new OkObjectResult("Success");
    }
    catch (Exception ex)
    {
        log.LogError(ex, "An error occurred.");
        throw;
    }
}

通过 Azure 门户中的 Application Insights,你可以查看详细的日志和执行报告,快速定位问题和优化性能。

五、扩展与最佳实践
5.1 使用 Durable Functions 实现复杂工作流

如果你的函数涉及到长时间运行或需要跨多个函数协调工作,可以使用 Durable Functions。Durable Functions 允许定义有状态的工作流,通过 Orchestrator 模式来协调多个 Azure Functions 的执行。

例如,以下是一个简单的 Durable Functions 示例,展示如何使用 Orchestrator 来依次调用多个函数:

[FunctionName("OrchestratorFunction")]
public static async Task<List<string>> RunOrchestrator(
    [OrchestrationTrigger] IDurableOrchestrationContext context)
{
    var outputs = new List<string>();

    outputs.Add(await context.CallActivityAsync<string>("SayHello", "Tokyo"));
    outputs.Add(await context.CallActivityAsync<string>("SayHello", "Seattle"));
    outputs.Add(await context.CallActivityAsync<string>("SayHello", "London"));

    return outputs;
}

[FunctionName("SayHello")]
public static string SayHello([ActivityTrigger] string name, ILogger log)
{
    log.LogInformation($"Saying hello to {name}.");
    return $"Hello, {name}!";
}

Durable Functions 可以用于实现复杂的状态管理、长时间运行任务和并行任务执行。

5.2 最佳实践
  • 最小化启动时间:函数的冷启动时间可能会影响性能,尤其是在高负载情况下

。可以通过使用高级计划或尽量减少依赖项来优化启动时间。

  • 异步编程:Azure Functions 支持异步编程模型,建议在 I/O 密集型操作(如数据库访问、网络请求)时使用 async/await,以提高性能。
  • 自动扩展:根据负载自动扩展是 Serverless 应用的关键优势之一。确保你的函数能够处理水平扩展,同时使用合适的重试策略。
六、结论

通过 Azure Functions,开发者能够以最低的运维成本构建强大的 Serverless 应用。从简单的 HTTP 请求处理,到复杂的工作流自动化,Azure Functions 提供了丰富的功能和无缝的 Azure 集成能力。在现代云原生架构中,Azure Functions 是实现敏捷开发、快速迭代的重要工具。希望通过本文,你能够深入理解并掌握 Azure Functions 的开发技巧,并在实际项目中灵活运用。


http://www.niftyadmin.cn/n/5668914.html

相关文章

前端CSS学习框架

⭐️ CSS &#x1f4ac; 描述&#xff1a;层叠样式表&#xff0c;用于设计风格和布局。 &#x1f4da; 资源&#xff1a;学习使用 CSS 为 HTML 添加样式 - 学习 Web 开发 | MDN ⭐️ 基本语法 ⭐️ 引入方式 行内样式 内部样式表 外部样式表 ⭐️ 选择器 通用选择器 标签…

解决ubuntu22.04 gnome-terminal 无法启动的问题

22.04下面默认的python 版本是3.10. 如果你安装了3.8或其它版本&#xff0c;尽量不要去ln -s python3.8 python3修改默认python3版本&#xff0c;不然Terminal会打不开。猜测Terminal可能用到了python的_gi这个库。 可以在xterm或putty远程连上&#xff0c;输入 sudo gnome-te…

C#自定义曲线绘图面板

一、实现功能 1、显示面板绘制。 2、拖动面板&#xff0c;X轴、Y轴都可以拖动。 3、显示面板缩放&#xff0c;放大或者缩小。 4、鼠标在面板中对应的XY轴数值。 5、自动生成的数据数组&#xff0c;曲线显示。 6、鼠标是否在曲线上检测。 二、界面 拖动面板 鼠标在曲线上…

改进拖放PDF转换为图片在转换为TXT文件的程序

前段时间我写了Python识别拖放的PDF文件再转成文本文件-CSDN博客 最近有2点更新&#xff0c;一是有一些pdf文件转换出来的图片是横的&#xff0c;这样也可以识别文字&#xff0c;但是可能会影响效果&#xff0c;另一个是发现有一些文字识别不出来&#xff0c;看了关于提高Padd…

day21JS-npm中的部分插件使用方法

1. 静态资源目录 静态资源目录就是访问服务器的某些路劲时候&#xff0c;服务器可以吐出一个写好的指定页面。 实现思路&#xff1a; 1、先判断要找的路径是否是文件&#xff0c;如果是文件&#xff0c;就加载发给对方。 2、如果是文件夹&#xff0c;找到这个文件夹所在路径中…

unity 高性能对象池解决方案

对于一个高性能对象池应该有的功能&#xff1a; 支持多种对象、同步加载、异步加载、隐藏方式、自动收缩&#xff08;使用LRU缓存机制&#xff0c;最近最久未使用来进行收缩&#xff09;、异步删除 所以我针对这几个功能讲一下原理&#xff1a; 支持多种对象&#xff1a; G…

SAP HCM 每月生成年假解决方案(PT_QTA00)

每月生成年假定额&#xff1a;HCM复杂的模块&#xff0c;年假生成就是一个比较复杂的模块&#xff0c;每次做项目都比较怕做年假、余假生成的业务&#xff0c;因为企业业务复制&#xff0c;SAP的这块配置也很复杂&#xff0c;因为这里面涉及的知识面很多&#xff0c;工龄计算、…

mac 怎么查看CPU核数

在 macOS 系统中&#xff0c;可以通过以下几种方法查看 CPU 核心数&#xff1a; 1. 使用“关于本机”查看 点击左上角的苹果图标&#xff08;&#xff09;。选择“关于本机”。在弹出的窗口中&#xff0c;系统会显示 Mac 的基本信息&#xff0c;包括 CPU 的类型和核心数。比…