Skip to content

配置管理

配置管理(Configuration Management)是现代应用程序的核心基础设施,用于统一管理应用程序的设置、参数和环境相关配置信息。通过多配置源整合、类型安全访问和分层结构管理,有效解决配置分散、类型错误和环境差异等问题,提高应用程序的灵活性和可维护性。

快速启动

只需要以下 3 个步骤即可开始使用配置管理框架:

cangjie
import spire_extensions_configuration.*

main() {
    // 1. 定义配置源
    let json = ###"
    {
        "connectionString": {
            "mysql": "mysql://localhost:3306"
        }
    }
    "###

    // 2. 创建并配置管理器
    let configuration = ConfigurationManager()
        .addJsonString(json)
        .build()

    // 3. 使用配置
    println(configuration["connectionString:mysql"])
}

配置源管理

1.内存配置

适用场景:单一配置源的简单需求

cangjie
main() {
    // 内存配置方式 - 数据库连接字符串示例
    let configuration = ConfigurationManager()
        .addMemory([
            ("connectionString", "Server=localhost;Port=5432;Database=testdb;User Id=admin;Password=123456;")
        ])
        .build()
    println("connectionString:  ${configuration["connectionString"]}")
}

2.JSON 配置源

cangjie
main() {
    // JSON字符串方式
    let json = ###"
    {
        "logging": {
            "logLevel": {
                "default": "Info"
            }
        },
        "connectionString": {
            "mysql": "mysql://localhost:3306"
        }
    }
    "###

    let JsonConfiguration = ConfigurationManager()
        .addJsonString(json) // 读取JSON字符串
        .build()

    println("logging:logLevel:default:  ${JsonConfiguration["logging:logLevel:default"]}")
    println("connectionString:mysql:  ${JsonConfiguration["connectionString:mysql"]}")
}

JSON 配置规则

同级配置,后配置覆盖前配置

3.环境变量配置

适用于容器化部署和云环境。

cangjie
main(args: Array<String>) {
    // 1. 创建并配置管理器
    let builder = ConfigurationManager()
    builder.addEnvVars("spire_")      // 读取"spire_"开头的环境变量

    // 2. 构建配置
    let configuration = builder.build()

    // 3. 使用配置
    println(configuration["environment"])   // 打印环境变量spire_environment的值
}

环境变量配置说明

通过 addEnvVars("Prefix") 可指定读取特定前缀的环境变量

4.命令行参数配置

适用于运行时参数传递:

cangjie
package spire_extensions_configuration

main(args: Array<String>) {
    // 1. 创建并配置管理器
    let builder = ConfigurationManager()
    builder.addCmdArgs(args)    // 命令行参数配置

    // 2. 构建配置
    let configuration = builder.build()

    // 3. 使用配置
    println(configuration["port"])   // 打印命令行参数port的值
    println(configuration["urls"])   // 打印命令行参数urls的值
}

运行方法

构建之后,在 target\release\bin 下运行 main.exe,并带上参数 main.exe --port=8088 --urls=http:/127.0.0.1 进行配置

配置访问

基础访问方式

确保配置存在时使用:

cangjie
// 类型安全访问
let hostValue = configuration.getValue<String>("database:host").getOrThrow()
let portValue = configuration.getValue<Int32>("database:port").getOrThrow()

配置节访问

JSON 文件数据多层级的访问除了以冒号分隔的形式,还可以采用配置节的方式

cangjie
main() {
    // 1. 定义JSON字符串作为配置源,依然使用上方JSON配置示例的JSON字符串内容
    let json = ###"
    {
        "logging": {
            "logLevel": {
                "spire.lifttime.hosting": "info",
                "default": "Warn"
            }
        },
    }
    "###

    // 2. 创建配置管理器并添加JSON字符串
    let builder = ConfigurationManager()
    builder.addJsonString(json) // 读取JSON字符串作为配置源
    let configuration = builder.build()

    // 3. 获取配置节并遍历所有子项
    let section = configuration.getSection("logging:logLevel") // 获取database配置节

    for(pattern in section.getChildren()) { // 循环遍历配置数据
        println("${pattern.key}: ${pattern.value}") // 输出每个配置项的键和值
    } 
}

最佳实践

配置源选择

  • 开发环境: 优先使用 JSON 文件配置,便于调试
  • 测试环境: 结合内存配置和环境变量
  • 生产环境: 主要依赖环境变量和外部配置服务

性能优化

  • 避免频繁的配置访问,考虑缓存配置值
  • 对于大型配置文件,考虑延迟加载策略