了解应用程序配置概念

已完成

为分布式环境创建微服务会带来巨大挑战。 云托管的微服务通常在不同区域的多个容器中运行。 实现一个解决方案,将每个服务的代码与配置分开,从而减少所有环境中的问题会审。

在此单元中,了解如何将 ASP.NET Core 和 Docker 配置功能与 Azure 应用程序配置相集成,以有效地解决此问题。

你将了解:

  • ASP.NET Core 配置基础结构。
  • Kubernetes 配置抽象 - ConfigMap。
  • Azure 应用程序配置服务。
  • .NET 功能管理库。
  • 在应用中实现的功能标志组件。

ASP.NET Core 配置

一个或多个 .NET 配置提供程序包含 ASP.NET Core 项目中的配置配置提供程序是对特定配置源(如 JSON 文件)的抽象。 配置源的值表示为键值对的集合。

ASP.NET Core 应用可以注册多个配置提供程序,以读取来自不同源的设置。 对于默认应用程序主机,会自动注册多个配置提供程序。 以下配置源按列出的顺序提供:

  1. JSON 文件 (appsettings.json)
  2. JSON 文件 (appsettings.{environment}.json)
  3. 用户机密
  4. 环境变量
  5. 命令行

每个配置提供程序都可以提供自己的键值。 此外,任何提供程序都可以覆盖链中比自己早注册的提供程序的值。 给定前面列表中的注册顺序,UseFeatureManagement 命令行参数将覆盖 UseFeatureManagement 环境变量。 同样,可通过 appsettings.Development.json 中存储的 UseFeatureManagement 键覆盖 appsettings.json 中的 UseFeatureManagement 键。

配置键名称可以描述层次结构。 例如,表示法 eShop:Store:SeasonalSale 是指 eShop 应用的 Store 微服务中的 SeasonalSale 功能。 此结构还可以将配置值映射到对象图或数组

重要

某些平台在环境变量名称中不支持冒号。 为了确保跨平台兼容性,将使用双下划线 (__)(而不是冒号 (:))来分隔键。 例如,eShop__Store__SeasonalSaleeShop:Store:SeasonalSale 的跨平台等效表示法。

ASP.NET Core 使用 ConfigurationBinder 将配置值映射到对象和数组。 映射键名的方式不区分大小写。 例如,ConnectionStringconnectionstring 被视为等效键。 有关详细信息,请参阅键和值

Docker 配置

在 Docker 中,将配置作为键值对集合进行处理的一个抽象是容器的 YAML 文件的环境变量部分。 以下代码片段摘自应用的 docker-compose.yml 文件:

services: 

  frontend:
    image: storeimage
    build:
      context: .
      dockerfile: DockerfileStore
    environment: 
      - ProductEndpoint=http://backend:8080
      - ConnectionStrings:AppConfig=Endpoint=https://eshop-app-features.azconfig.io;Id=QWQy;Secret=V/4r/rhg/0tdy2L/AmMfBUcgTrYC4krRC7uFqbjRvDU=
    ports:
      - "32000:8080"
    depends_on: 
      - backend

该文件片段定义:

  • YAML 文件的 environment 部分中存储的变量,如前面的代码片段中突出显示的内容所示。
  • 作为环境变量提供给容器化应用。
  • 在微服务应用中保留 .NET 配置值的机制。

环境变量是一种跨平台机制,用于向托管在 Docker 容器中的应用提供运行时配置。

Azure 应用程序配置

集中式配置服务在微服务应用和其他分散式应用中特别有用。 此模块介绍 Azure 应用程序配置即服务,用于集中管理配置值(专用于功能标志)。 当使用应用部署配置时,此服务可使故障排除变得简单。

应用程序配置是一项完全托管的服务,用于加密静态和传输中的键值。 使用它存储的配置值可以实时更新,而无需重新部署或重启应用。

在 ASP.NET Core 应用中,Azure 应用程序配置注册为配置提供程序。 除了提供程序注册以外,应用不知道应用程序配置存储。 可以通过 .NET 的配置抽象 - IConfiguration 接口从中检索配置值。

事件管理库

功能管理库提供标准化的 .NET API,可用于管理应用中的功能标志。 该库通过 NuGet 以名为 Microsoft.FeatureManagementMicrosoft.FeatureManagement.AspNetCore 的两个不同包的形式分发。 后面的包提供标记帮助程序,以在 ASP.NET Core 项目的 Razor 文件中使用。 当不需要标记帮助程序或不使用 ASP.NET Core 项目时,前面的包就足够了。

库在 IConfiguration 上构建。 出于此原因,它与任何 .NET 配置提供程序兼容,包括 Azure 应用程序配置的提供程序。 由于库与 Azure 应用程序配置相分离,因此可以通过配置提供程序集成这两者。 将此库与 Azure 应用程序配置相结合,可以在不实现支持基础结构的情况下动态切换功能。

与 Azure 应用程序配置的集成

若要了解 Azure 应用程序配置和功能管理库的集成,请参阅 ASP.NET Core 项目的 Program.cs 文件中的以下摘录:

string connectionString = builder.Configuration.GetConnectionString("AppConfig");

// Load configuration from Azure App Configuration
builder.Configuration.AddAzureAppConfiguration(options => {
  options.Connect(connectionString)
    .UseFeatureFlags();
});

在前面的代码片段中:

  • 调用应用的 builder.Configuration 方法来注册 Azure 应用程序配置存储的配置提供程序。 配置提供程序通过调用 AddAzureAppConfiguration 进行注册。
  • Azure 应用程序配置提供程序的行为是使用以下选项配置的:
    • 通过传递到 Connect 方法调用的连接字符串向相应的 Azure 服务进行身份验证。 将从 connectionString 变量检索连接字符串。 已注册的配置源通过 builder.Configuration 提供。
    • 通过调用 UseFeatureFlags 启用功能标志支持。
  • Azure 应用程序配置提供程序将取代其他所有注册的配置提供程序,因为它在任何其他配置提供程序之后注册。

提示

在 ASP.NET Core 项目中,可以通过在 ConfigureAppConfiguration 内分析 configBuilder.Sources 属性来访问已注册的提供程序列表。