package
1.5.4
Repository: https://github.com/isyscore/isc-gobase.git
Documentation: pkg.go.dev

# Packages

No description provided by the author

# README

config包

config包主要用于加载和管理项目中配置文件中的内容,配置文件为"application"开头的格式

1. 配置文件路径

默认该文件与main函数所在的类同目录

// 示例
- application.yml
- application-local.yml

2. 配置文件格式

支持yaml、yml、json、properties配置文件 优先级: json > properties > yaml > yml

3. 支持profile加载不同配置文件

格式:application-{profile}.yyy 其中profile对应的变量为:base.profiles.active 变量的设置可以有如下

  • 本地配置
  • 环境变量配置

优先级:环境变量 > 本地配置

img.png

代码中读取指定环境配置

// 配置环境
os.Setenv("base.profiles.active", "local")

// 然后再加载的时候就会加载local的配置文件
config.LoadConfig()

或者:直接加载对应{profile}的文件

// 配置环境
config.LoadFile("./application-local.yaml")

也支持叠加

// 配置环境
config.LoadFile("./application-local.yaml")
config.AppendFile("./application-append.yaml")

4. 支持直接获取配置值

config包中提供了各种类型的api,方便实时获取

// 基本类型
config.getValueInt("xxx.xxx")
config.getValueInt32("xxx.xxx")
config.getValueInt64("xxx.xxx")
config.getValueBool("xxx.xxx")
config.getValueString("xxx.xxx")
// ...

// 结构类型
config.getValueObject("xxx.xxx", &xxx)

示例:

var ServerCfg ServerConfig

// base前缀
type BaseConfig struct {
    Application AppApplication
    Data string
}

type AppApplication struct {
    Name string
}
base:
  application:
    name: "xxx-local"
  data: "test"
// 直接读取即可
config.getValueObject("base", &ServerCfg)

说明: v1.0.12版本后,支持对配置的中划线支持,此外还支持更多配置

  • 中划线:比如:data-base-user
  • 小驼峰:比如:dataBaseUser
  • 大驼峰:比如:DataBaseUser
  • 下划线:比如:data_base_user

比如:

key1:
  ok1:
    hao-de-ok: 12
    name-age: 32
  ok2:
    haoDeOk: 12
    nameAge: 32
  ok3:
    HaoDeOk: 12
    NameAge: 32
  ok4:
    hao_de_ok: 12
    name_age: 32
type SmallEntity struct {
    HaoDeOk int
    NameAge int
}

// 可以读取到
func TestSmall(t *testing.T) {
    config.LoadConfig()

    entity1 := SmallEntity{}
    config.GetValueObject("key1.ok1", &entity1)
    assert.Equal(t, entity1.NameAge, 32)
    assert.Equal(t, entity1.HaoDeOk, 12)

    entity2 := SmallEntity{}
    config.GetValueObject("key1.ok2", &entity2)
    assert.Equal(t, entity2.NameAge, 32)
    assert.Equal(t, entity2.HaoDeOk, 12)

    entity3 := SmallEntity{}
    config.GetValueObject("key1.ok3", &entity3)
    assert.Equal(t, entity3.NameAge, 32)
    assert.Equal(t, entity3.HaoDeOk, 12)

    entity4 := SmallEntity{}
    config.GetValueObject("key1.ok4", &entity4)
    assert.Equal(t, entity4.NameAge, 32)
    assert.Equal(t, entity4.HaoDeOk, 12)
}

6. 支持配置的叠加,相对路径和绝对路径

在配置已经加载完毕后,需要对一些配置进行覆盖,比如运维这边有相关的需求时候

// 相对路径
config.AppendConfigFromRelativePath(xx)

// 绝对路径
config.AppendConfigFromAbsPath(xx)

7. 支持自动读取cm文件

应用启动会默认读取/home/{base.application.name}/config/application-default.yml对应的内容并覆盖应用的配置中

也支持环境变量配置 base.config.cm.path=xxx

示例:

// 也可以代码中配置
os.Setenv("base.config.cm.path", "./application-append.yaml")

8. 支持配置的在线查看以及实时变更

如下配置开启后,就可以在线查看应用的所有配置了

base:
  endpoint:
    # 配置的动态实时变更,默认关闭
    config:
      enable: true/false
// 查看应用所有配置
curl http://localhost:xxx/{api-prefix}/{api-module}/config/values

// 查看应用所有配置(yaml结构)
curl http://localhost:xxx/{api-prefix}/{api-module}/config/values/yaml

// 查看应用的某个配置
curl http://localhost:xxx/{api-prefix}/{api-module}/config/value/{key}

// 修改应用的配置
curl -X PUT http://localhost:xxx/{api-prefix}/{api-module}/config/update -d '{"key":"xxx", "value":"yyyy"}'

提示:
修改应用的配置会发送配置变更事件"event_of_config_change",如果想要对配置变更进行监听,请监听,示例:

func xxxx() {
    // 添加配置变更事件的监听,listener.EventOfConfigChange是内置的"event_of_config_change"
    listener.AddListener(listener.EventOfConfigChange, ConfigChangeListener)
}

func ConfigChangeListener(event listener.BaseEvent) {
    ev := event.(listener.ConfigChangeEvent)
    if ev.Key == "xxx" {
        value := ev.Value
        // 你的配置变更处理代码
    }
}

注意

  • 配置实体化
    • 无法动态的变更
    • 不支持默认配置
  • api实时调用
    • 配置可以动态的变更
    • 有默认的api

建议:配置使用时候建议使用config.GetXXXX()

其中动态变更只对api实时调用的方式有效


9. 支持配置的占位符

version > 1.4.13

place:
  name: "test"
  name2: "test2"

test:
  name: ${place.name}
  name2: ${place.name2}

格式支持:yml、yaml、json和properties

{
  "place":{
    "name":"test",
    "name2":"test2"
  },
  "test":{
    "name":"${place.name}",
    "name2":"${place.name2}"
  }
}
place.name=test
place.name2=test2
test.name=${place.name}
test.name2=${place.name2}

注意:

该版本暂时不支持非叶子节点数据,比如如下的就无法获取

place:
  name: "test"
  name2: "test2"

test:
  # 如下无法读取数据
  tt: ${place}