github.com/isyscore/isc-gobase@v1.5.3-0.20231218061332-cbc7451899e9/config/README.md (about) 1 ## config包 2 config包主要用于加载和管理项目中配置文件中的内容,配置文件为"application"开头的格式 3 4 ### 1. 配置文件路径 5 默认该文件与main函数所在的类同目录 6 ```go 7 // 示例 8 - application.yml 9 - application-local.yml 10 ``` 11 12 ### 2. 配置文件格式 13 支持yaml、yml、json、properties配置文件 14 优先级: json > properties > yaml > yml 15 16 ### 3. 支持profile加载不同配置文件 17 格式:application-{profile}.yyy 18 其中profile对应的变量为:base.profiles.active 19 变量的设置可以有如下 20 - 本地配置 21 - 环境变量配置 22 23 优先级:环境变量 > 本地配置 24 25 ![img.png](img.png) 26 27 #### 代码中读取指定环境配置 28 ```go 29 // 配置环境 30 os.Setenv("base.profiles.active", "local") 31 32 // 然后再加载的时候就会加载local的配置文件 33 config.LoadConfig() 34 ``` 35 或者:直接加载对应{profile}的文件 36 ```go 37 // 配置环境 38 config.LoadFile("./application-local.yaml") 39 ``` 40 也支持叠加 41 ```go 42 // 配置环境 43 config.LoadFile("./application-local.yaml") 44 config.AppendFile("./application-append.yaml") 45 ``` 46 47 ### 4. 支持直接获取配置值 48 config包中提供了各种类型的api,方便实时获取 49 ```go 50 // 基本类型 51 config.getValueInt("xxx.xxx") 52 config.getValueInt32("xxx.xxx") 53 config.getValueInt64("xxx.xxx") 54 config.getValueBool("xxx.xxx") 55 config.getValueString("xxx.xxx") 56 // ... 57 58 // 结构类型 59 config.getValueObject("xxx.xxx", &xxx) 60 ``` 61 示例: 62 ```go 63 var ServerCfg ServerConfig 64 65 // base前缀 66 type BaseConfig struct { 67 Application AppApplication 68 Data string 69 } 70 71 type AppApplication struct { 72 Name string 73 } 74 ``` 75 76 ```yaml 77 base: 78 application: 79 name: "xxx-local" 80 data: "test" 81 ``` 82 83 ```go 84 // 直接读取即可 85 config.getValueObject("base", &ServerCfg) 86 ``` 87 88 说明: 89 v1.0.12版本后,支持对配置的中划线支持,此外还支持更多配置 90 - 中划线:比如:data-base-user 91 - 小驼峰:比如:dataBaseUser 92 - 大驼峰:比如:DataBaseUser 93 - 下划线:比如:data_base_user 94 95 比如: 96 ```yaml 97 key1: 98 ok1: 99 hao-de-ok: 12 100 name-age: 32 101 ok2: 102 haoDeOk: 12 103 nameAge: 32 104 ok3: 105 HaoDeOk: 12 106 NameAge: 32 107 ok4: 108 hao_de_ok: 12 109 name_age: 32 110 ``` 111 ```go 112 type SmallEntity struct { 113 HaoDeOk int 114 NameAge int 115 } 116 117 // 可以读取到 118 func TestSmall(t *testing.T) { 119 config.LoadConfig() 120 121 entity1 := SmallEntity{} 122 config.GetValueObject("key1.ok1", &entity1) 123 assert.Equal(t, entity1.NameAge, 32) 124 assert.Equal(t, entity1.HaoDeOk, 12) 125 126 entity2 := SmallEntity{} 127 config.GetValueObject("key1.ok2", &entity2) 128 assert.Equal(t, entity2.NameAge, 32) 129 assert.Equal(t, entity2.HaoDeOk, 12) 130 131 entity3 := SmallEntity{} 132 config.GetValueObject("key1.ok3", &entity3) 133 assert.Equal(t, entity3.NameAge, 32) 134 assert.Equal(t, entity3.HaoDeOk, 12) 135 136 entity4 := SmallEntity{} 137 config.GetValueObject("key1.ok4", &entity4) 138 assert.Equal(t, entity4.NameAge, 32) 139 assert.Equal(t, entity4.HaoDeOk, 12) 140 } 141 ``` 142 143 ### 6. 支持配置的叠加,相对路径和绝对路径 144 在配置已经加载完毕后,需要对一些配置进行覆盖,比如运维这边有相关的需求时候 145 ```go 146 // 相对路径 147 config.AppendConfigFromRelativePath(xx) 148 149 // 绝对路径 150 config.AppendConfigFromAbsPath(xx) 151 ``` 152 153 ### 7. 支持自动读取cm文件 154 应用启动会默认读取/home/{base.application.name}/config/application-default.yml对应的内容并覆盖应用的配置中 155 156 也支持环境变量配置 `base.config.cm.path=xxx` 157 158 示例: 159 ```go 160 // 也可以代码中配置 161 os.Setenv("base.config.cm.path", "./application-append.yaml") 162 ``` 163 164 ### 8. 支持配置的在线查看以及实时变更 165 166 如下配置开启后,就可以在线查看应用的所有配置了 167 ```yaml 168 base: 169 endpoint: 170 # 配置的动态实时变更,默认关闭 171 config: 172 enable: true/false 173 ``` 174 175 ```shell 176 // 查看应用所有配置 177 curl http://localhost:xxx/{api-prefix}/{api-module}/config/values 178 179 // 查看应用所有配置(yaml结构) 180 curl http://localhost:xxx/{api-prefix}/{api-module}/config/values/yaml 181 182 // 查看应用的某个配置 183 curl http://localhost:xxx/{api-prefix}/{api-module}/config/value/{key} 184 185 // 修改应用的配置 186 curl -X PUT http://localhost:xxx/{api-prefix}/{api-module}/config/update -d '{"key":"xxx", "value":"yyyy"}' 187 ``` 188 189 提示:<br/> 190 修改应用的配置会发送配置变更事件"event_of_config_change",如果想要对配置变更进行监听,请监听,示例: 191 ```go 192 func xxxx() { 193 // 添加配置变更事件的监听,listener.EventOfConfigChange是内置的"event_of_config_change" 194 listener.AddListener(listener.EventOfConfigChange, ConfigChangeListener) 195 } 196 197 func ConfigChangeListener(event listener.BaseEvent) { 198 ev := event.(listener.ConfigChangeEvent) 199 if ev.Key == "xxx" { 200 value := ev.Value 201 // 你的配置变更处理代码 202 } 203 } 204 ``` 205 206 --- 207 208 #### 注意 209 210 - 配置实体化 211 - 无法动态的变更 212 - 不支持默认配置 213 - api实时调用 214 - 配置可以动态的变更 215 - 有默认的api 216 217 建议:配置使用时候建议使用config.GetXXXX() 218 219 其中动态变更只对api实时调用的方式有效 220 221 --- 222 223 ### 9. 支持配置的占位符 224 version > 1.4.13 225 ```yaml 226 place: 227 name: "test" 228 name2: "test2" 229 230 test: 231 name: ${place.name} 232 name2: ${place.name2} 233 ``` 234 格式支持:yml、yaml、json和properties 235 ```json 236 { 237 "place":{ 238 "name":"test", 239 "name2":"test2" 240 }, 241 "test":{ 242 "name":"${place.name}", 243 "name2":"${place.name2}" 244 } 245 } 246 ``` 247 ```properties 248 place.name=test 249 place.name2=test2 250 test.name=${place.name} 251 test.name2=${place.name2} 252 ``` 253 #### 注意: 254 该版本暂时不支持非叶子节点数据,比如如下的就无法获取 255 ```properties 256 place: 257 name: "test" 258 name2: "test2" 259 260 test: 261 # 如下无法读取数据 262 tt: ${place} 263 ```