Confd是一个轻量级的配置文件管理工具,可以使用你存储在etcd、consul、redis、dynamodb、dzookeeper中的数据实时的更新你的本地配置文件。重新加载应用的新配置文件。consul是什么?看这里,Confd可以来这里下载,Consul按照上篇文章安装即可。
开始实战:
1 Confd后端的数据存储,我采用consul,因为之前调研过consul,感觉consul比etcd功能上强一些,而不仅仅是一个KV系统。我的confd、consul都是源码安装在/opt目录下的。
cd /opt/consul ./consul agent -server -bootstrap-expect 1 -data-dir /tmp/consul -node=work1 -bind=172.16.1.100 -client=172.16.1.100由于只是线下测试,故采用单节点模式,不用集群模式
看着consul命令行参数是不是很烦,我们可以把这些参数集中在配置文件中,通过指定配置文件目录来启动,例如:
./consul agent -config-dir /etc/consul.d/server
2 创建confd的TOML配置文件
TOML的资源配置文件一般在/etc/confd/conf.d/目录下,但也可以自由的配置,而我的confd是源码编译的,所以我的confd的主目录在/opt/confd,我的TOML目录在/opt/confd/conf.d,关于TOML配置文件的格式可以参照这里
定义config.toml:
[template] src = "config.conf.tmpl" dest = "/tmp/config.conf" keys = ["/test"]
3 创建源模板,该文件的目录一般在confd的主目录下,和TOML文件目录平级,我的源模板在/opt/confd/templates
定义config.conf.tmpl:
[config] database_name = {{getv "/test"}}
4 给consul中插入数据,我们之前在confd中查找的是test这个key,所以我们插入一对KV值
curl -X PUT -d 'nginx' http://172.16.100:8500/v1/kv/test curl -s http://172.16.1.100:8500/v1/kv/test | python -m json.tool
consul还有良好的API支持,喜欢python的,可以直接使用python来操作consul
>>> dir(consul.Consul) ['ACL', 'Agent', 'Catalog', 'Event', 'Health', 'KV', 'Session', 'Status', '__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'connect']
5 启动confd
confd后端支持多种db,我采用的是consul,所以confd的启动命令是:
./confd -confdir="/opt/confd/" -config-file="/opt/confd/conf.d/config.toml" -onetime=false -interval=3 -backend consul -node 172.16.1.100:8500 -log-level="debug"
根据日志提示,可以看到在/tmp下面生成了新的配置文件
6 下面我们更新一下consul中test的值为nginx2,看看confd会不会实时更新本地的配置文件
curl -X PUT -d 'nginx2' http://172.16.1.100:8500/v1/kv/test
由于我们的confd设置的是3秒检查一次,所以有一点点延迟,效果如下:
可以看到,更新完毕后,配置文件没有立即变化,而是第二次查看时才变为nginx2,我们看看日志是怎么显示的:
可以看到confd检测到更新后,就立即更新了本地配置文件。