了解应用程序配置概念
为分布式环境创建微服务会带来巨大挑战。 云托管的微服务通常在不同区域的多个容器中运行。 实现一个解决方案,将每个服务的代码与配置分开,从而减少所有环境中的问题会审。
在此单元中,了解如何将 ASP.NET Core 和 Docker 配置功能与 Azure 应用程序配置相集成,以有效地解决此问题。
你将了解:
- ASP.NET Core 配置基础结构。
- Kubernetes 配置抽象 - ConfigMap。
- Azure 应用程序配置服务。
- .NET 功能管理库。
- 在应用中实现的功能标志组件。
ASP.NET Core 配置
一个或多个 .NET 配置提供程序包含 ASP.NET Core 项目中的配置。 配置提供程序是对特定配置源(如 JSON 文件)的抽象。 配置源的值表示为键值对的集合。
ASP.NET Core 应用可以注册多个配置提供程序,以读取来自不同源的设置。 对于默认应用程序主机,会自动注册多个配置提供程序。 以下配置源按列出的顺序提供:
- JSON 文件 (appsettings.json)
- JSON 文件 (appsettings.{environment}.json)
- 用户机密
- 环境变量
- 命令行
每个配置提供程序都可以提供自己的键值。 此外,任何提供程序都可以覆盖链中比自己早注册的提供程序的值。 给定前面列表中的注册顺序,UseFeatureManagement
命令行参数将覆盖 UseFeatureManagement
环境变量。 同样,可通过 appsettings.Development.json 中存储的 UseFeatureManagement
键覆盖 appsettings.json 中的 UseFeatureManagement
键。
配置键名称可以描述层次结构。 例如,表示法 eShop:Store:SeasonalSale 是指 eShop 应用的 Store 微服务中的 SeasonalSale 功能。 此结构还可以将配置值映射到对象图或数组。
重要
某些平台在环境变量名称中不支持冒号。 为了确保跨平台兼容性,将使用双下划线 (__
)(而不是冒号 (:
))来分隔键。 例如,eShop__Store__SeasonalSale
是 eShop:Store:SeasonalSale
的跨平台等效表示法。
ASP.NET Core 使用 ConfigurationBinder 将配置值映射到对象和数组。 映射键名的方式不区分大小写。 例如,ConnectionString
和 connectionstring
被视为等效键。 有关详细信息,请参阅键和值。
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=<ID>;Secret=<SECRET>
ports:
- "32000:8080"
depends_on:
- backend
该文件片段定义:
- YAML 文件的
environment
部分中存储的变量,如前面的代码片段中突出显示的内容所示。 - 作为环境变量提供给容器化应用。
- 在微服务应用中保留 .NET 配置值的机制。
环境变量是一种跨平台机制,用于向托管在 Docker 容器中的应用提供运行时配置。
Azure 应用程序配置
集中式配置服务在微服务应用和其他分散式应用中特别有用。 此模块介绍 Azure 应用程序配置即服务,用于集中管理配置值(专用于功能标志)。 当使用应用部署配置时,此服务可使故障排除变得简单。
应用程序配置是一项完全托管的服务,用于加密静态和传输中的键值。 使用它存储的配置值可以实时更新,而无需重新部署或重启应用。
在 ASP.NET Core 应用中,Azure 应用程序配置注册为配置提供程序。 除了提供程序注册以外,应用不知道应用程序配置存储。 可以通过 .NET 的配置抽象 - IConfiguration
接口从中检索配置值。
事件管理库
功能管理库提供标准化的 .NET API,可用于管理应用中的功能标志。 该库通过 NuGet 以名为 Microsoft.FeatureManagement
和 Microsoft.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
属性来访问已注册的提供程序列表。