Skip to content

配置源选择指南

本文档帮助您根据不同场景选择合适的配置源。

配置源分类

本地文件配置源

配置源适用场景优点缺点
JSON通用配置、结构化数据可读性好、支持嵌套、IDE 支持好不支持注释(标准 JSON)
YAMLDevOps 配置、K8s 配置支持注释、简洁、可读性好缩进敏感、解析较慢
TOMLRust/Go 项目、简单配置支持注释、类型明确嵌套结构不够直观
INI传统应用、简单键值对简单易懂、广泛支持不支持深层嵌套
XML企业应用、.NET 传统项目结构严谨、支持 Schema 验证冗长、可读性差
.env开发环境、Docker 配置简单、环境变量兼容仅支持字符串、无嵌套

数据存储配置源

配置源适用场景优点缺点
Redis高性能缓存、分布式配置高性能、支持发布订阅需要 Redis 服务
Database配置审计、多租户支持事务、可审计性能较低、需要数据库

远程配置中心

配置中心适用场景优点缺点
Consul服务发现 + 配置管理多功能、健康检查功能复杂
EtcdK8s 生态、强一致性需求强一致性、高可用资源占用较高
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 迁移到配置中心

  1. 保持本地配置作为默认值
  2. 配置中心只存储需要动态修改的配置
  3. 敏感配置使用 Vault 或环境变量
  4. 逐步迁移,先在测试环境验证

从其他配置库迁移

Apq.Cfg 兼容 Microsoft.Extensions.Configuration,可以通过 ToMicrosoftConfiguration() 方法与现有代码集成:

csharp
var cfg = new CfgBuilder()
    .AddJson("config.json", level: 0, writeable: false)
    .Build();

// 转换为 IConfiguration,兼容现有代码
IConfigurationRoot msConfig = cfg.ToMicrosoftConfiguration();

下一步

基于 MIT 许可发布