Etcd

ETCD配置源

配置

## 配置中心相关
asjard:
  config:
    ## etcd配置中心配置
    etcd:
      ## 配置中心名称
      ## 依赖asjard.stores.etcd.clients.{client}的配置
      # client: default
      ## 分隔符
      ## etcd中多个key之间分隔符
      # delimiter: "/"

配置优先级

从上向下优先级依次递增,多个字段之间以英文/分隔,不以/结尾

  • /{app}/configs/: 项目相关全局配置

  • /{app}/configs/{env}/: 项目相关全局配置

  • /{app}/configs/service/{service}/: 服务相关配置

  • /{app}/configs/service/{service}/{region}/: 服务region相关配置

  • /{app}/configs/service/{service}/{region}/{az}/: 服务region,az配置

  • /{app}/configs/{env}/service/{service}/: 服务相关配置

  • /{app}/configs/{env}/service/{service}/{region}/: 服务region相关配置

  • /{app}/configs/{env}/service/{service}/{region}/{az}/: 服务region,az配置

  • /{app}/configs/runtime/{instance.ID}/: 实例配置

如果同一前缀下存在文件,则文件中所有配置优先级均为该前缀的优先级

建议不要key/value方式和文件同时使用, 因为同一个前缀下优先级一样,启动时配置覆盖和运行时配置覆盖逻辑产生分歧

例如:

## key/value的方式配置examples.timeout为5ms
/examples/configs/examples/timeout
5ms

## 文件的方式配置examples.timeout为6ms
/examples/configs/global.yaml
examples:
  timeout: 6ms

# 启动时按照assic排序先加载/examples/configs/examples/timeout
# 后加载/examples/configs/global.yaml 会覆盖前面加载的
# 所以你获取到的examples.timeout为6ms
# 但是
# 当你修改时
# 由于他们的值属于同一优先级,就会出现,修改那个获取到的值就是那个
# 如果那天你修改了/examples/configs/examples/timeout后,不重启获取时正常的
# 但是重启服务后发现他没有生效,是因为同一个配置出现在了同一个优先级不同文件中
# 导致运行时的逻辑和启动时的逻辑产生了分歧

使用

添加配置,文件配置可查看这里

# key/value方式添加配置
etcdctl put /examples/configs/examples/timeout 5ms

# 按照文件方式添加配置key的结尾以json,yaml,yml,toml,props,properties结尾
# 否则以文本方式处理
etcdctl put /examples/configs/examples.yaml 'examples:
  timeout: 6ms'

import (
	// 导入etcd配置源
	_ "github.com/asjard/asjard/pkg/config/etcd"
)

config.GetDuration("examples.timeout", time.Second)

最后更新于