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  ```