快速入门:向 Azure Functions 应用添加功能标志
在该快速入门中,你将创建一个 Azure Functions C# 代码项目并在其中使用功能标志。 可使用 Azure 应用程序配置中的功能管理集中存储所有功能标志并控制其状态。
.NET 功能管理库使用功能标志支持扩展该框架。 这些库在 .NET 配置系统的基础上构建。 它们通过其 .NET 配置提供程序与应用程序配置集成。
注意
本文目前仅支持在 .NET 6 上运行的 C# 进程中函数应用。
先决条件
- 具有活动订阅的 Azure 帐户。 创建试用版订阅。
- 应用程序配置存储区。 创建存储区。
- 包含 Azure 开发工作负载的 Visual Studio 2019。
添加功能标志
将名为“Beta”的功能标志添加到应用程序配置存储区,并将“标签”和“描述”保留为其默认值。 有关如何使用 Azure 门户或 CLI 将功能标志添加到存储区的详细信息,请转到创建功能标志。
创建 Functions 项目
Visual Studio 中的 Azure Functions 项目模板创建了一个 C# 类库项目,该项目可发布到 Azure 中的函数应用。 可使用函数应用将函数分组为逻辑单元,以便更轻松地管理、部署、缩放和共享资源。
在 Visual Studio 菜单中,选择“文件”>“新建”>“项目”。
在“创建新项目”中,在搜索框中输入“functions”,选择“Azure Functions”模板,然后选择“下一步”。
在“配置新项目”中,输入项目的“项目名称”,然后选择“创建”。 函数应用名称必须可以充当 C# 命名空间,因此请勿使用下划线、连字符或任何其他的非字母数字字符。
对于“创建新的 Azure Functions 应用程序”设置,请使用下表中的值:
设置 值 说明 .NET 版本 .NET 6 此值会创建一个函数项目,该项目在进程内使用 Azure Functions 运行时版本 4.x 运行。 有关详细信息,请参阅 Azure Functions 运行时版本概述。 函数模板 HTTP 触发器 此值会创建由 HTTP 请求触发的函数。 存储帐户(AzureWebJobsStorage) 存储模拟器 由于 Azure 中的函数应用需要存储帐户,因此在将项目发布到 Azure 时会分配或创建一个存储帐户。 HTTP 触发器不使用 Azure 存储帐户连接字符串;所有其他触发器类型需要有效的 Azure 存储帐户连接字符串。 授权级别 匿名 在未提供密钥的情况下,任何客户端都可以触发创建的函数。 通过此授权设置可以轻松测试新函数。 有关密钥和授权的详细信息,请参阅授权密钥和 HTTP 和 Webhook 绑定。
请确保将“授权级别”设置为“匿名”。 如果选择默认级别的函数,需要在请求中提供函数密钥才能访问函数终结点。
选择“创建”以创建函数项目和 HTTP 触发器函数。
连接到应用程序配置存储区
此项目将 .NET Azure Functions 中使用依赖项注入。 它将 Azure 应用程序配置添加为存储功能标志的额外配置源。
右键单击项目,然后选择“管理 NuGet 包” 。 在“浏览”选项卡中,搜索以下 NuGet 包并将其添加到项目中。
- Microsoft.Extensions.Configuration.AzureAppConfiguration 版本 4.1.0 或更高版本
- Microsoft.FeatureManagement 版本 2.2.0 或更高版本
- Microsoft.Azure.Functions.Extensions 版本 1.1.0 或更高版本
使用以下代码添加新文件 Startup.cs。 它定义了一个名为
Startup
的类,该类实现了FunctionsStartup
抽象类。 程序集属性用于指定 Azure Functions 启动期间使用的类型名称。using System; using Microsoft.Azure.Functions.Extensions.DependencyInjection; using Microsoft.Extensions.Configuration; using Microsoft.FeatureManagement; [assembly: FunctionsStartup(typeof(FunctionApp.Startup))] namespace FunctionApp { class Startup : FunctionsStartup { public override void ConfigureAppConfiguration(IFunctionsConfigurationBuilder builder) { } public override void Configure(IFunctionsHostBuilder builder) { } } }
更新
ConfigureAppConfiguration
方法,并通过调用AddAzureAppConfiguration()
将 Azure 应用程序配置提供程序添加为额外的配置源。UseFeatureFlags()
方法告知提供程序加载功能标志。 在重新检查更改之前,所有功能标志的默认缓存过期时间为 30 秒。 可以通过设置传递给UseFeatureFlags
方法的FeatureFlagsOptions.CacheExpirationInterval
属性来更新过期时间间隔。public override void ConfigureAppConfiguration(IFunctionsConfigurationBuilder builder) { builder.ConfigurationBuilder.AddAzureAppConfiguration(options => { options.Connect(Environment.GetEnvironmentVariable("ConnectionString")) .Select("_") .UseFeatureFlags(); }); }
提示
如果不想将除功能标志以外的任何配置加载到应用程序中,可以调用
Select("_")
,只加载不存在的伪键"_"
。 默认情况下,如果未调用Select
方法,则将加载应用程序配置存储中的所有配置键值。更新
Configure
方法,通过依赖项注入使 Azure 应用程序配置服务和功能管理器可用。public override void Configure(IFunctionsHostBuilder builder) { builder.Services.AddAzureAppConfiguration(); builder.Services.AddFeatureManagement(); }
打开 Function1.cs,并添加以下命名空间。
using System.Linq; using Microsoft.FeatureManagement; using Microsoft.Extensions.Configuration.AzureAppConfiguration;
添加一个构造函数,用于通过依赖项注入获得
_featureManagerSnapshot
和IConfigurationRefresherProvider
实例。 在IConfigurationRefresherProvider
中,你可以获得IConfigurationRefresher
的实例。private readonly IFeatureManagerSnapshot _featureManagerSnapshot; private readonly IConfigurationRefresher _configurationRefresher; public Function1(IFeatureManagerSnapshot featureManagerSnapshot, IConfigurationRefresherProvider refresherProvider) { _featureManagerSnapshot = featureManagerSnapshot; _configurationRefresher = refresherProvider.Refreshers.First(); }
更新
Run
方法,根据功能标志的状态更改显示的消息的值。在函数调用开始时调用
TryRefreshAsync
方法以刷新功能标志。 如果未到达缓存过期时间范围,则将是一个 no-op 操作。 如果希望在不阻止当前函数调用的情况下刷新功能标志,请删除await
运算符。 在这种情况下,以后的函数调用将获得更新的值。[FunctionName("Function1")] 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 message = await _featureManagerSnapshot.IsEnabledAsync("Beta") ? "The Feature Flag 'Beta' is turned ON" : "The Feature Flag 'Beta' is turned OFF"; return (ActionResult)new OkObjectResult(message); }
在本地测试函数
设置一个名为 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'
按 F5 测试函数。 如果系统提示,请按 Visual Studio 的请求下载和安装 Azure Functions Core (CLI) 工具。 你还需要启用防火墙例外,这样工具才能处理 HTTP 请求。
从 Azure Functions 运行时输出复制函数的 URL。
将 HTTP 请求的 URL 粘贴到浏览器的地址栏。 下图显示了指出功能标志 Beta 已被禁用的响应。
登录 Azure 门户。 选择“所有资源”,然后选择你创建的应用程序配置存储区。
选择“功能管理器”,将“Beta”密钥的状态更改为“启用”。
多次刷新浏览器。 当刷新间隔时间窗口过去后,页面将发生变化以指示功能标志 Beta 已启用,如下图所示。
注意
本教程中使用的示例代码可从 Azure 应用程序配置 GitHub 存储库下载。
清理资源
如果不想继续使用本文中创建的资源,请删除此处创建的资源组以避免产生费用。
重要
删除资源组的操作不可逆。 将永久删除资源组以及其中的所有资源。 请确保不要意外删除错误的资源组或资源。 如果在包含要保留的其他资源的资源组中创建了本文的资源,请从相应的窗格中单独删除每个资源,而不是删除该资源组。
- 登录到 Azure 门户,然后选择“资源组”。
- 在“按名称筛选”框中,输入资源组的名称。
- 在结果列表中,选择资源组名称以查看概述。
- 选择“删除资源组”。
- 系统会要求确认是否删除资源组。 重新键入资源组的名称进行确认,然后选择“删除” 。
片刻之后,将会删除该资源组及其所有资源。
后续步骤
在本快速入门中,你创建了一个功能标志,并将其用于 Azure Functions。
若要为其他类型的应用启用功能管理功能,请继续阅读以下教程。
若要详细了解如何在 Azure 应用程序配置中管理功能标志,请继续阅读以下教程。
有关 .NET 功能管理库的完整功能概要,请继续阅读以下文档。