了解应用程序配置概念
为分布式环境创建微服务会带来重大挑战。 云托管的微服务通常在不同区域中的多个容器中运行。 实现将每个服务代码与配置分开的解决方案可简化所有环境中的问题分类。
在本单元中,了解如何将 ASP.NET Core 和 Docker 配置功能与 Azure 应用配置集成,以有效方式应对这一挑战。
你将查看:
- ASP.NET 核心配置基础结构。
- Kubernetes 配置抽象——ConfigMap.
- Azure 应用配置服务。
- .NET 功能管理库。
- 在应用中实现的特性标志组件。
ASP.NET 核心配置
ASP.NET Core 项目中的配置包含在一个或多个 .NET 配置提供程序中。 配置提供程序是对特定配置源(如 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 项目中,可以通过分析 configBuilder.Sources
内部 ConfigureAppConfiguration
的属性来访问已注册的提供程序列表。