配置源选择指南
本文档帮助您根据不同场景选择合适的配置源。
配置源分类
本地文件配置源
| 配置源 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| JSON | 通用配置、结构化数据 | 可读性好、支持嵌套、IDE 支持好 | 不支持注释(标准 JSON) |
| YAML | DevOps 配置、K8s 配置 | 支持注释、简洁、可读性好 | 缩进敏感、解析较慢 |
| TOML | Rust/Go 项目、简单配置 | 支持注释、类型明确 | 嵌套结构不够直观 |
| INI | 传统应用、简单键值对 | 简单易懂、广泛支持 | 不支持深层嵌套 |
| XML | 企业应用、.NET 传统项目 | 结构严谨、支持 Schema 验证 | 冗长、可读性差 |
| .env | 开发环境、Docker 配置 | 简单、环境变量兼容 | 仅支持字符串、无嵌套 |
数据存储配置源
| 配置源 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| Redis | 高性能缓存、分布式配置 | 高性能、支持发布订阅 | 需要 Redis 服务 |
| Database | 配置审计、多租户 | 支持事务、可审计 | 性能较低、需要数据库 |
远程配置中心
| 配置中心 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| Consul | 服务发现 + 配置管理 | 多功能、健康检查 | 功能复杂 |
| Etcd | K8s 生态、强一致性需求 | 强一致性、高可用 | 资源占用较高 |
| Nacos | 阿里云生态、微服务 | 功能丰富、中文文档好 | 依赖较重 |
| Apollo | 大型企业、多环境管理 | 权限管理、灰度发布 | 部署复杂、只读 |
| Zookeeper | 分布式协调、传统项目 | 成熟稳定、广泛使用 | 配置管理非主要功能 |
| Vault | 密钥管理、安全敏感配置 | 安全性高、审计完善 | 学习曲线陡峭 |
场景选择建议
1. 单体应用 / 小型项目
推荐配置:
csharp
var cfg = new CfgBuilder()
.AddJson("config.json", level: 0, writeable: false)
.AddJson($"config.{env}.json", level: 1, writeable: false, optional: true)
.AddEnvironmentVariables(level: 2, prefix: "APP_")
.Build();理由:简单、无外部依赖、与 ASP.NET Core 配置模式一致。
2. 微服务架构
推荐配置:
csharp
var cfg = new CfgBuilder()
.AddJson("config.json", level: 0, writeable: false)
.AddSource(new ConsulCfgSource(options => {
options.Address = "http://consul:8500";
options.KeyPrefix = $"services/{serviceName}/";
options.EnableHotReload = true;
}, level: 10))
.Build();理由:Consul 同时提供服务发现和配置管理,减少基础设施复杂度。
3. Kubernetes 环境
推荐配置:
csharp
var cfg = new CfgBuilder()
.AddJson("config.json", level: 0, writeable: false)
.AddSource(new YamlFileCfgSource("/config/app-config.yaml", level: 1,
writeable: false, optional: false, reloadOnChange: true))
.AddEnvironmentVariables(level: 2)
.Build();理由:ConfigMap 挂载为 YAML 文件,环境变量注入敏感配置。
4. 阿里云 / 国内云环境
推荐配置:
csharp
var cfg = new CfgBuilder()
.AddJson("config.json", level: 0, writeable: false)
.AddSource(new NacosCfgSource(options => {
options.ServerAddresses = "mse-xxx.nacos.mse.aliyuncs.com:8848";
options.AccessKey = Environment.GetEnvironmentVariable("NACOS_AK");
options.SecretKey = Environment.GetEnvironmentVariable("NACOS_SK");
options.DataId = "app-config";
options.EnableHotReload = true;
}, level: 10))
.Build();理由:Nacos 是阿里云 MSE 原生支持的配置中心,中文文档完善。
5. 多环境 / 灰度发布
推荐配置:
csharp
var cfg = new CfgBuilder()
.AddJson("config.json", level: 0, writeable: false)
.AddSource(new ApolloCfgSource(options => {
options.AppId = "my-app";
options.MetaServer = "http://apollo-meta:8080";
options.Cluster = Environment.GetEnvironmentVariable("APOLLO_CLUSTER") ?? "default";
options.Namespaces = new[] { "application", "common" };
options.EnableHotReload = true;
}, level: 10))
.Build();理由:Apollo 提供完善的多环境、多集群、灰度发布支持。
6. 安全敏感配置 / 密钥管理
推荐配置:
csharp
var cfg = new CfgBuilder()
.AddJson("config.json", level: 0, writeable: false)
.AddSource(new VaultCfgSource(
address: "https://vault.example.com:8200",
roleId: Environment.GetEnvironmentVariable("VAULT_ROLE_ID")!,
roleSecret: Environment.GetEnvironmentVariable("VAULT_SECRET_ID")!,
enginePath: "kv",
path: "apps/my-app/secrets",
kvVersion: 2,
level: 10
))
.Build();理由:Vault 专为密钥管理设计,提供审计、轮换、访问控制等安全特性。
7. 传统企业应用 / 遗留系统
推荐配置:
csharp
var cfg = new CfgBuilder()
.AddSource(new XmlFileCfgSource("app.config", level: 0, writeable: false))
.AddSource(new IniFileCfgSource("settings.ini", level: 1, writeable: false))
.AddSource(new DatabaseCfgSource(options => {
options.Provider = "SqlServer";
options.ConnectionString = connectionString;
options.Table = "AppConfig";
}, level: 2))
.Build();理由:兼容现有配置格式,数据库配置便于审计和管理。
8. 开发环境 / 本地调试
推荐配置:
csharp
var cfg = new CfgBuilder()
.AddJson("config.json", level: 0, writeable: false)
.AddJson("config.Development.json", level: 1, writeable: false, optional: true)
.AddSource(new EnvFileCfgSource(".env", level: 2, optional: true))
.AddSource(new EnvFileCfgSource(".env.local", level: 3, optional: true))
.AddEnvironmentVariables(level: 4, prefix: "APP_")
.Build();理由:.env 文件便于本地开发,不会提交到版本控制。
配置源组合最佳实践
层级设计原则
level 0-9: 本地文件配置(基础配置)
level 10-19: 远程配置中心(动态配置)
level 20+: 环境变量/命令行(覆盖配置)推荐的通用模式
csharp
var cfg = new CfgBuilder()
// 基础配置(打包在应用中)
.AddJson("config.json", level: 0, writeable: false)
// 环境特定配置(可选)
.AddJson($"config.{env}.json", level: 1, writeable: false, optional: true)
// 本地覆盖(开发用,不提交版本控制)
.AddJson("config.local.json", level: 2, writeable: true, optional: true, isPrimaryWriter: true)
// 远程配置中心(生产环境)
.AddSource(new ConsulCfgSource(options => { /* ... */ }, level: 10))
// 密钥管理(敏感配置)
.AddSource(new VaultCfgSource(options => { /* ... */ }, level: 15))
// 环境变量(最高优先级覆盖)
.AddEnvironmentVariables(level: 20, prefix: "APP_")
.Build();性能对比
| 配置源 | 首次加载 | 读取性能 | 热重载延迟 |
|---|---|---|---|
| JSON | ~1ms | ~20ns | ~100ms |
| YAML | ~5ms | ~20ns | ~100ms |
| Redis | ~10ms | ~100μs | ~10ms |
| Consul | ~50ms | ~20ns | ~100ms |
| Etcd | ~50ms | ~20ns | ~50ms |
| Nacos | ~100ms | ~20ns | ~100ms |
| Vault | ~100ms | ~20ns | ~30s (轮询) |
决策流程图
需要配置管理?
├── 单体应用 → JSON + 环境变量
├── 微服务
│ ├── 已有 Consul → Consul
│ ├── K8s 环境 → Etcd 或 ConfigMap
│ └── 阿里云 → Nacos
├── 需要灰度发布 → Apollo
├── 需要密钥管理 → Vault
└── 传统企业应用 → Database迁移建议
从 config.json 迁移到配置中心
- 保持本地配置作为默认值
- 配置中心只存储需要动态修改的配置
- 敏感配置使用 Vault 或环境变量
- 逐步迁移,先在测试环境验证
从其他配置库迁移
Apq.Cfg 兼容 Microsoft.Extensions.Configuration,可以通过 ToMicrosoftConfiguration() 方法与现有代码集成:
csharp
var cfg = new CfgBuilder()
.AddJson("config.json", level: 0, writeable: false)
.Build();
// 转换为 IConfiguration,兼容现有代码
IConfigurationRoot msConfig = cfg.ToMicrosoftConfiguration();