你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

快速入门:向 Azure Functions 应用添加功能标志

在本快速入门中,你将创建一个 Azure Functions 应用并使用其中的功能标志。 可使用 Azure 应用程序配置中的功能管理集中存储所有功能标志并控制其状态。

Prerequisites

添加功能标志

将名为“Beta”的功能标志添加到应用程序配置存储区,并将“标签”和“描述”保留为其默认值。 有关如何使用 Azure 门户或 CLI 将功能标志添加到存储区的详细信息,请转到创建功能标志

启用名为 Beta 的功能标志

创建函数应用

通过选择 Azure Functions (C#) 模板,使用 Visual Studio 创建 Azure Functions 应用。 此模板指导你配置项目的基本设置。 有关详细说明,请参阅 使用 Visual Studio 开发 Azure Functions

创建 Function App 时,请使用下表作为关键参数的参考。

设置
函数辅助角色 .NET 8.0(独立)
功能 HTTP 触发器
授权级别 匿名

注意

Azure Functions 可与 Azure 应用程序配置配合使用,无论是在 独立进程模型 还是 进程内模型 中。 本快速入门以独立辅助角色模型为例。 可以在 Azure 应用配置 GitHub 存储库中找到这两个模型的完整代码示例。

连接到应用程序配置存储区

你可以使用 Microsoft Entra ID(推荐)或连接字符串连接到应用程序配置存储区。

  1. 右键单击项目,然后选择“管理 NuGet 包”。 在“ 浏览 ”选项卡上,搜索以下 NuGet 包的最新稳定版本并将其添加到项目中。

    • Microsoft.Azure.AppConfiguration.Functions.Worker
    • Microsoft.FeatureManagement
    • Azure.Identity
  2. 打开 Program.cs 并更新代码,如下所示。 通过调用 AddAzureAppConfiguration 该方法,将 Azure 应用配置添加为额外的配置源。

    使用 DefaultAzureCredential 向应用程序配置存储区进行身份验证。 按照说明为凭据分配“应用程序配置数据读取者”角色。 运行应用程序前,请务必留出足够的时间让权限生效。

    using Azure.Identity;
    using Microsoft.Azure.Functions.Worker.Builder;
    using Microsoft.Extensions.Configuration;
    using Microsoft.Extensions.Hosting;
    using Microsoft.FeatureManagement;
    
    var builder = FunctionsApplication.CreateBuilder(args);
    
    // Connect to Azure App Configuration
    builder.Configuration.AddAzureAppConfiguration(options =>
    {
        Uri endpoint = new(Environment.GetEnvironmentVariable("AZURE_APPCONFIG_ENDPOINT") ?? 
            throw new InvalidOperationException("The environment variable 'AZURE_APPCONFIG_ENDPOINT' is not set or is empty."));
        options.Connect(endpoint, new DefaultAzureCredential())
               // Load all feature flags with no label. To load feature flags with specific keys and labels, set via FeatureFlagOptions.Select.
               // Use the default refresh interval of 30 seconds. It can be overridden via FeatureFlagOptions.SetRefreshInterval.
               .UseFeatureFlags();
    });
    

    该方法 UseFeatureFlags() 指示提供程序加载功能标志。 默认情况下,不带标签的所有功能标志都会每 30 秒加载和刷新一次。 功能标志的选择和刷新行为是独立于其他配置键值进行配置的。 可以通过将 FeatureFlagOptions 操作传递给 UseFeatureFlags 方法来自定义这些行为。 使用 FeatureFlagOptions.Select 指定要加载的功能标志的键和标签,使用 FeatureFlagOptions.SetRefreshInterval 替代默认刷新间隔。

    提示

    如果不想将除功能标志以外的任何配置加载到应用程序中,可以调用 options.Select("_") 只加载不存在的伪键 "_"。 默认情况下,如果未调用任何 Select 方法,则会加载应用配置存储中所有没有标签的配置键值。

  3. 更新 Program.cs 文件,以通过添加 Azure 应用配置中间件在每个函数执行上启用自动功能标志刷新。 你还会注册功能管理服务,以便稍后在函数代码中注入和使用它。

    // Connect to Azure App Configuration
    builder.Configuration.AddAzureAppConfiguration(options =>
    {
        // Omitted the code added in the previous step.
    });
    
    // Add Azure App Configuration middleware and feature management to the service collection.
    builder.Services
        .AddAzureAppConfiguration()
        .AddFeatureManagement();
    
    // Use Azure App Configuration middleware for dynamic configuration and feature flag refresh.
    builder.UseAzureAppConfiguration();
    
    builder.ConfigureFunctionsWebApplication();
    
    builder.Build().Run();
    
  4. 打开 Function1.cs,并添加以下命名空间。

    using Microsoft.FeatureManagement;
    

    更新构造函数以获取通过依赖项注入的 IVariantFeatureManagerSnapshot 实例。

    private readonly IVariantFeatureManagerSnapshot _featureManager;
    private readonly ILogger<Function1> _logger;
    
    public Function1(IVariantFeatureManagerSnapshot featureManager, ILogger<Function1> logger)
    {
        _featureManager = featureManager;
        _logger = logger;
    }
    
  5. 更新Run方法,使其能够根据功能标志的状态返回响应消息。

    [Function("Function1")]
    public async Task<IActionResult> Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequest req)
    {
        _logger.LogInformation("C# HTTP trigger function processed a request.");
    
        // Read feature flag
        string featureName = "Beta";
        bool featureEnabled = await _featureManager.IsEnabledAsync(featureName, req.HttpContext.RequestAborted);
    
        return new OkObjectResult(featureEnabled
            ? $"The Feature Flag '{featureName}' is turned ON!"
            : $"The Feature Flag '{featureName}' is turned OFF");
    }
    

在本地测试函数

  1. 设置 环境变量。

    将名为 AZURE_APPCONFIG_ENDPOINT 的环境变量设置为 Azure 门户中应用商店的“概述”下找到的应用程序配置存储区的终结点

    如果使用 Windows 命令提示符,则请运行以下命令并重启命令提示符,这样更改才会生效:

    setx AZURE_APPCONFIG_ENDPOINT "<endpoint-of-your-app-configuration-store>"
    

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

    $Env:AZURE_APPCONFIG_ENDPOINT = "<endpoint-of-your-app-configuration-store>"
    

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

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

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

    在 VS 中的函数调试快速入门

  4. 将 HTTP 请求的 URL 粘贴到浏览器的地址栏中。 下图显示了指出功能标志 Beta 已被禁用的响应。

    已禁用快速入门函数功能标志

  5. 在 Azure 门户中,导航到应用程序配置存储。 在 “操作”下,选择 “功能管理器”,找到 Beta 功能标志,并将 “已启用” 开关设置为 “打开”

  6. 多次刷新浏览器。 刷新间隔时间窗口过后,页面将更改以指示功能标志 Beta 处于打开状态,如下图所示。

    已启用快速入门函数功能标志

清理资源

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

重要说明

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

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

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

Next steps

在本快速入门中,你创建了一个功能标志,并将其用于 Azure Functions 应用。

有关 .NET 功能管理库的完整功能概要,请继续阅读以下文档。

若要详细了解如何在 Azure 应用程序配置中管理功能标志,请继续阅读以下教程。