配置管理
配置管理(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 文件配置,便于调试
- 测试环境: 结合内存配置和环境变量
- 生产环境: 主要依赖环境变量和外部配置服务
性能优化
- 避免频繁的配置访问,考虑缓存配置值
- 对于大型配置文件,考虑延迟加载策略