教程:在 Azure Functions 应用中使用动态配置

应用程序配置 .NET 配置提供程序支持缓存和动态刷新由应用程序活动驱动的配置。 本教程演示如何在代码中实现动态配置更新。 它建立在本快速入门中介绍的 Azure Functions 应用之上。 在继续本教程之前,请先完成使用 Azure 应用程序配置创建 Azure Functions 应用这一教程。

在本教程中,你将了解如何执行以下操作:

  • 设置 Azure Functions 应用,使其能够更新配置以响应应用程序配置存储区中的更改。
  • 将最新配置注入到 Azure Functions 调用中。

先决条件

从应用配置重载数据

Azure Functions 支持运行进程内独立进程。 这两种模式在应用程序配置使用情况方面的主要区别在于配置的刷新方式。 在进程内模式下,必须在每个函数中调用才能刷新配置。 在独立进程模式下,支持中间件。 应用程序配置中间件 Microsoft.Azure.AppConfiguration.Functions.Worker 允许调用在执行每个函数之前自动刷新配置。

  1. 更新连接到应用程序配置的代码并添加数据刷新条件。

    打开 Startup.cs 并更新 ConfigureAppConfiguration 方法。

    public override void ConfigureAppConfiguration(IFunctionsConfigurationBuilder builder)
    {
        builder.ConfigurationBuilder.AddAzureAppConfiguration(options =>
        {
            options.Connect(Environment.GetEnvironmentVariable("ConnectionString"))
                    // Load all keys that start with `TestApp:` and have no label
                    .Select("TestApp:*")
                    // Configure to reload configuration if the registered sentinel key is modified
                    .ConfigureRefresh(refreshOptions =>
                        refreshOptions.Register("TestApp:Settings:Sentinel", refreshAll: true));
        });
    }
    

    ConfigureRefresh 方法注册一个设置,每当在应用程序中触发刷新时都会检查更改。 refreshAll 参数指示应用配置提供程序在注册设置中检测到更改时重新加载整个配置。

    对于注册刷新的所有设置,尝试新刷新之前的默认缓存到期时间为 30 秒。 可以通过调用 AzureAppConfigurationRefreshOptions.SetCacheExpiration 方法来更新它。

    提示

    在应用程序配置中更新多个键值时,通常不建议应用程序在进行所有更改之前重新加载配置。 可以注册 sentinel 密钥,并且仅在完成所有其他配置更改后更新它。 这有助于确保应用程序中配置的一致性。

    还可以执行以下操作来最大程度地降低不一致的风险:

    • 将应用程序设计为可容忍暂时性配置不一致
    • 在上线(服务请求)之前预热你的应用程序
    • 在应用程序中携带默认配置,并在配置验证失败时使用它
    • 选择一种配置更新策略,以最大限度地减少对应用程序的影响,例如,低流量计时。
  1. 更新 Configure 方法,通过依赖项注入提供 Azure 应用程序配置服务。

    public override void Configure(IFunctionsHostBuilder builder)
    {
        builder.Services.AddAzureAppConfiguration();
    }
    
  2. 打开 Function1.cs,并添加以下命名空间。

    using System.Linq;
    using Microsoft.Extensions.Configuration.AzureAppConfiguration;
    

    更新构造函数以通过依赖项注入获取 IConfigurationRefresherProvider 的实例,可以从中获取 IConfigurationRefresher 的实例。

    private readonly IConfiguration _configuration;
    private readonly IConfigurationRefresher _configurationRefresher;
    
    public Function1(IConfiguration configuration, IConfigurationRefresherProvider refresherProvider)
    {
        _configuration = configuration;
        _configurationRefresher = refresherProvider.Refreshers.First();
    }
    
  3. 更新 Run 方法,并在 Functions 调用开始时通知使用 TryRefreshAsync 方法刷新配置。 如果未到达缓存过期时间范围,则将不会进行操作。 如果希望在不阻止当前函数调用的情况下刷新配置,请删除 await 运算符。 在这种情况下,以后的函数调用将获得更新的值。

    public async Task<IActionResult> Run(
        [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req, ILogger log)
    {
        log.LogInformation("C# HTTP trigger function processed a request.");
    
        await _configurationRefresher.TryRefreshAsync(); 
    
        string keyName = "TestApp:Settings:Message";
        string message = _configuration[keyName];
    
        return message != null
            ? (ActionResult)new OkObjectResult(message)
            : new BadRequestObjectResult($"Please create a key-value with the key '{keyName}' in App Configuration.");
    }
    

在本地测试函数

  1. 设置名为“ConnectionString”的环境变量,并将其设置为应用程序配置存储区的访问键 。 如果使用 Windows 命令提示符,则请运行以下命令并重启命令提示符,这样更改才会生效:

    setx ConnectionString "connection-string-of-your-app-configuration-store"
    

    如果使用 Windows PowerShell,请运行以下命令:

    $Env:ConnectionString = "connection-string-of-your-app-configuration-store"
    

    如果使用 macOS 或 Linux,则请运行以下命令:

    export ConnectionString='connection-string-of-your-app-configuration-store'
    
  2. 若要测试函数,请按 F5。 如果系统提示,请按 Visual Studio 的请求下载和安装 Azure Functions Core (CLI) 工具 。 你还需要启用防火墙例外,这样工具才能处理 HTTP 请求。

  3. 从 Azure Functions 运行时输出复制函数的 URL。

    Quickstart Function debugging in VS

  4. 将 HTTP 请求的 URL 粘贴到浏览器的地址栏。 下图显示了浏览器中函数返回的本地 GET 请求的响应。

    Quickstart Function launch local

  5. 登录 Azure 门户。 选择“所有资源”,然后选择在快速入门中创建的应用程序配置存储。

  6. 选择“配置资源管理器”并更新以下密钥值:

    密钥
    TestApp:Settings:Message Azure 应用配置的数据 - 已更新

    然后创建 sentinel 密钥或修改其值(如果该密钥已存在),例如,

    密钥 Value
    TestApp:Settings:Sentinel v1
  7. 多次刷新浏览器。 如果缓存的设置在 30 秒后过期,则页面会显示 Functions 调用的响应已有更新的值。

    Quickstart Function refresh local

注意

本教程中使用的示例代码可从应用程序配置 GitHub 存储库下载。

清理资源

如果不想继续使用本文中创建的资源,请删除此处创建的资源组以避免产生费用。

重要

删除资源组的操作不可逆。 将永久删除资源组以及其中的所有资源。 请确保不要意外删除错误的资源组或资源。 如果在包含要保留的其他资源的资源组中创建了本文的资源,请从相应的窗格中单独删除每个资源,而不是删除该资源组。

  1. 登录到 Azure 门户,然后选择“资源组”。
  2. 在“按名称筛选”框中,输入资源组的名称
  3. 在结果列表中,选择资源组名称以查看概述。
  4. 选择“删除资源组”。
  5. 系统会要求确认是否删除资源组。 重新键入资源组的名称进行确认,然后选择“删除” 。

片刻之后,将会删除该资源组及其所有资源。

后续步骤

在本教程中,你学习了如何使 Azure Functions 应用能够动态刷新来自应用程序配置的配置设置。 若要了解如何使用 Azure 托管标识来简化对应用程序配置的访问,请继续学习下一篇教程。