Go-micro config作为配置库,它也是动态的可插拔的。

应用程序中的大多数配置都是静态配置的,或者包括从多个源加载的复杂逻辑。Go Config使这变得简单、可插拔和合并。您再也不用以同样的方式处理配置了。

特性

  • 动态加载 - 动态按时按需从多资源加载配置。Go-micro config会在后台监视配置资源,动态在内存中合并、更新。

  • 可插拔资源 - 可选择从任意数量的资源中加载、合并配置,后台资源在内部被抽象成标准格式并通过编码器解码。资源可以是环境变量、参数flag、文件、etcd、k8s configmap等等。

  • 可合并配置 - 假设指定了多个配置源,格式不限,它们会被合并划一。 这样大大简化了配置的优先级与环境的变动。

  • 观察变动 - 可以选择观测指定配置值的变动。使用Go Config观测器热加载,可以随时查看配置值的变动情况。

  • 安全修复 - 某些情况如配置加载失败或者被擦除时,可以指定回退值。这可以保证在发生事故时,我们能读取完整的默认值。

开始

  • Source - 后台获取加载的位置
  • Encoder - 负责处理资源配置编码、解码
  • Reader - 将多个编码处理后的资源合并成单一的格式

Sources

Source 也即后台加载的配置,同时可以使用多资源。

官方支持以下格式:

  • cli - 即命令行参数
  • env - 从环境变量中读取
  • etcd - 从etcd v3中读取
  • file - 从配置文件读取
  • flag - 从flags中读取
  • memory - 从内存中读取
  • grpc - 从grpc服务器读取

社区支持一下格式:

  • configmap - k8s configmap
  • consul - 从consul中读取

ChangeSet变更集

Sources以变更集的方式返回配置。对于多个后台配置,变更集是单一的内部抽象。

type ChangeSet struct {// Raw encoded config dataData      []byte// MD5 checksum of the dataChecksum  string// Encoding format e.g json, yaml, toml, xmlFormat    string// Source of the config e.g file, consul, etcdSource    string// Time of loading or updateTimestamp time.Time
}

Encoder

Encoder 负责资源配置编码、解码。后台资源可能会存在不同的格式,编码器负责处理不同的格式,默认的格式是Json。

编码器支持以下格式:

  • json
  • yaml
  • toml
  • xml
  • hcl

Reader

Reader 负责把多个changeset集合并成一个可查询的值集。

type Reader interface {// Merge multiple changeset into a single formatMerge(...*source.ChangeSet) (*source.ChangeSet, error)// Return return Go assertable valuesValues(*source.ChangeSet) (Values, error)// Name of the reader e.g a json readerString() string
}

读取器使用编码器将更改集解码为 map[string]interface{}Values, 然后将它们合并到单个更改集中。它通过 Format 字段以确定编码器。然后更改集表示为一组,具有重新备份 Go 类型和无法加载值的回退功能.


// Values is returned by the reader
type Values interface {// Return raw dataBytes() []byte// Retrieve a valueGet(path ...string) Value// Return values as a mapMap() map[string]interface{}// Scan config into a Go typeScan(v interface{}) error
}

Value 接口支持使用构建、类型断言转化成go类型的值,默认使用回退值。

type Value interface {Bool(def bool) boolInt(def int) intString(def string) stringFloat64(def float64) float64Duration(def time.Duration) time.DurationStringSlice(def []string) []stringStringMap(def map[string]string) map[string]stringScan(val interface{}) errorBytes() []byte
}

Config

Config 管理所有配置、抽象后的资源、编码器及reader。

读取、同步、监视多个后台资源,把资源合并成单一集合以供查询。

// Config is an interface abstraction for dynamic configuration
type Config interface {// provide the reader.Values interfacereader.Values// Init the configInit(opts ...Option) error// Options in the configOptions() Options// Stop the config loader/watcherClose() error// Load config sourcesLoad(source ...source.Source) error// Force a source changeset syncSync() error// Watch a value for changesWatch(path ...string) (Watcher, error)
}

使用

  • 文件中读取配置
  • 新配置
  • 加载文件
  • 读取配置
  • 读取值
  • 路径监控
  • 多源
  • 设置源编码器
  • 添加读取器编码器

文件中读取配置

文件源从文件中读取配置。

它使用文件扩展名来确定格式,例如config.yaml具有yaml格式。它不使用编码器或插入文件数据。如果不存在文件扩展名,源格式将默认为选项中的编码器。

json配置示例:

{"database": {"address": "10.0.0.1","port": 3306}
}

新增配置

指定文件源和文件路径。路径是可选的,默认为config.json

新增配置(直接使用默认的配置对象也可)

fileSource := file.NewSource(file.WithPath("/tmp/config.json"),
)

文件格式

要加载不同的文件格式,例如yaml、toml、xml,只需用它们的扩展名指定它们

fileSource := file.NewSource(file.WithPath("/tmp/config.yaml"),
)

如果您想指定一个没有扩展名的文件,请确保将编码器设置为相同的格式

e := toml.NewEncoder()fileSource := file.NewSource(file.WithPath("/tmp/config"),source.WithEncoder(e),
)

加载配置文件

将源加载到配置中

// Create new config
conf := config.NewConfig()// Load file source
conf.Load(fileSource)

读取多个值

如果将配置写入结构

type Host struct {Address string `json:"address"`Port int `json:"port"`
}var host Hostconfig.Get("hosts", "database").Scan(&host)// 10.0.0.1 3306
fmt.Println(host.Address, host.Port)

读取独立的值

// Get address. Set default to localhost as fallback
address := config.Get("hosts", "database", "address").String("localhost")// Get port. Set default to 3000 as fallback
port := config.Get("hosts", "database", "port").Int(3000)

监控目录

观测目录的变化。当文件有改动时,新值便可生效。

w, err := config.Watch("hosts", "database")
if err != nil {// do something
}// wait for next value
v, err := w.Next()
if err != nil {// do something
}var host Hostv.Scan(&host)

多资源

可以加载和合并多个源。合并优先级顺序相反.

config.Load(// base config from envenv.NewSource(),// override env with flagsflag.NewSource(),// override flags with filefile.NewSource(file.WithPath("/tmp/config.json"),),
)

设置资源编码器

资源需要编码器才能将配置编码与解码成所需的changeset格式。

默认编码器是JSON格式,也可以使用yaml、xml、toml等选项。

e := yaml.NewEncoder()s := consul.NewSource(source.WithEncoder(e),
)

新增Reader编码器

Reader使用各种编码器来解码不同格式源的数据。

默认的Reader支持json、yaml、xml、toml、hcl,合并配置后会把其转成json格式。

也可指定给其特定的编码器:

e := yaml.NewEncoder()r := json.NewReader(reader.WithEncoder(e),
)

go-micro配置文件相关推荐

  1. 在.Net Micro Framework中显示汉字

    摘要:MF平台支持的字体是专有格式,扩展名为tinyfnt,需要用专门的转化工具才能把windows平台上的字体转换为tinyfnt字体.在.Net Micro Framework SDK中提供了一个 ...

  2. Devstack 配置文件说明手册

    本文为minxihou的翻译文章,转载请注明出处Bob Hou: http://blog.csdn.net/minxihou JmilkFan:minxihou的技术博文方向是 算法&Open ...

  3. Centos设置静态IP及修改Centos配置文件

    Centos设置静态IP及修改Centos配置文件 - 51CTO.COM Centos设置静态IP及修改Centos配置文件 2010-01-13 10:48 佚名 CSDN 我要评论(0) 字号: ...

  4. C# 修改配置文件进行窗体logo切换

    01 - 前言:题外的话 大家可能发现这个号现在原创越来越少了,其实小编并没有放弃持续更新,只是把一手原创放到了 [dotnet编程大全]这个号了,那个号目前原创主要更新的是wpf mvvm方面的知识 ...

  5. 用于MCU,基于FreeRTOS的micro(轻量级)ROS

    编辑整理:strongerHuang 作者:Francesca Finocchiaro 关注我的读者中应该有部分是做ROS相关的工作,今天就来分享一个基于FreeRTOS的micro(微型)ROS. ...

  6. OpenHarmony HDF Input框架模块 按键控制LED基于小熊派micro

    文章目录 摘要 开发环境 KEY驱动程序 KeyConfigInstance: RegisterKeyDevice 中断处理函数 KeyIrqHandle RegisterInputDevice:注册 ...

  7. micro、M3O微服务系列(三)

    文章目录 概述 安装 主机上(本地安装) go方式 docker binary kubernetes 服务器 特征 用法 帮助 基础命令 命令行 内置命令 signup login 动态命令 User ...

  8. GO micro V3环境搭建

    ​​​​​​​https://github.com/micro/micro 目前用上面的micro代码工具micro new来创建目录 https://github.com/asim/go-micro ...

  9. mysql 密码 enc_配置文件的属性ENC加密

    在micro service体系中,有了config server,我们可以把配置存放在git.svn.数据库等,普通的web项目也基本上是把配置存放在配置文件中.如果我们把大量的配置信息都放在配置文 ...

  10. Caliburn.Micro简介

    Caliburn.Micro简介 Caliburn.Micro的定位是一个轻量级的MVVM框架,事实上是Caliburn框架精简了90%的代码(当然,据说保留了90%的功能).CM由C#编写,可用于. ...

最新文章

  1. 思维dp ---- K步最短路 D. Explorer Space
  2. C++Exponential search指数搜索的实现算法(附完整源码)
  3. 从龙门镖局看自动化测试
  4. 改革收入分配体制 网络电话成通信省钱先锋
  5. 朴素贝叶斯算法--过滤垃圾短信
  6. OJ1180: 成绩统计(结构体专题)(C语言)
  7. 操作系统系列题型分析(更新中~)
  8. c#获取本地ip地址网关子网掩码_C#--WinForm获取本机网卡的型号,IP地址,子网掩码和网关-阿里云开发者社区...
  9. OpenSSL 修复高危的无限循环漏洞
  10. 字典 python 引用_Python字典引用的应用
  11. json转map几种方法
  12. 读取cpu温度的api_获取CPU的温度的方法
  13. php连接mssql的一些相关经验和总结
  14. 英语四六级网站服务器繁忙,英语四六级成绩公布这些问题很常见
  15. 2021-2025年中国共享Web托管服务行业市场供需与战略研究报告
  16. android 重力感应代码,Android编程实现的重力感应示例代码
  17. Http request传输图片和附属信息(old)
  18. python 消息 推送服务器,从客户端发送字符串消息到服务器Python
  19. 关于MUI框架中的警告框
  20. 三十岁了,还是身无分文,一事成无该怎么补救?

热门文章

  1. R语言学习以及我对R语言的理解。
  2. 摄影初学者挑选相机的常见问题[转]_我是亲民_新浪博客
  3. zabbix添加邮件报警机制
  4. 让OCS 2007 R2 的呼叫正确显示Call ID
  5. python基础课程学习笔记-第二节课
  6. CCF 模拟题 有趣的数 (数位DP)
  7. aplus翻译_promise/A+规范翻译以及手写实现
  8. HTML5+CSS3基础学习笔记:2
  9. 中国5G产业发展的五大优势
  10. 净空法师:同修净土与般若