confd 笔记

confd 配置文件:

 

有时候,我们不想在confd启动命令中写很长的参数,那么可以通过 -config-file 来指定配置文件,如果你喜欢将配置文件的位置定义到 /etc/confd/confd.toml ,那么一个参数也不需要,因为,这就是默认搜索的配置文件

一个confd.toml 的示例:

 

一个conf.d/upstream.toml

其中:

  1. prefix 就是要(递归)watch的结点,watch的返回值是变化结点的原值和新值
  2. keys是当发生更新时从哪些结点获取数据(来渲染模板),这里的结点必然是prefix下的,不能是prefix外部的,所以,如果期望变更不会被立即触发,而是一组变更完成后才被触发,这里是做不到的;比如: 期望同一时间更新多个upstream,而只重启一次nginx,这里做不到;除非自己实现,自己实现也要考虑很多东西,如:模板渲染如何实现?
  3. watch总是递归的,这个代码中写死的,没得配
  4. 这里的prefix最好从confd的根开始,不要指望和confd.toml中的prefix拼接使用; 如果 confd.tomal 中的prefix 是 /sa  而upstream.toml 中的prefix是 /nginx, 则-onetime执行时可以看到预期的效果(生成了期望的目标配置文件),但是watch的时候却不能达到预期的效果;非常怀疑这是个bug,因为,confd启动的时候可以渲染出来正确的目标配置文件(参考了confd.toml 中的prefix),后续watch的时候却没有参考confd.toml 中的prefix,所以自然watch不到了:tcpdump部分截图如下:
    初始渲染的请求:

    watch的请求:

模板文件示例:

注意:

  1. 模板中的指令,默认会导致生成的文件中出现多余的空行的,解决办法就是使用 -}}
  2. 模板中可以构造变量(如:通过printf拼接字符串)
  3. 参考: https://github.com/kelseyhightower/confd/blob/master/docs/templates.md

 

watch的实现:

  1. 查询请求中,wait参数为true就是watch,wait可以指定waitIndex,当然也可以不指定,不指定的话逻辑比较简单,就是有变化就响应;如果指定的waitIndex已经发生过,则直接返回曾经的变化结果(这是历史上指定版本的值,可能不是现在的);如果waitIndex是下下次的版本号,则下次变化将不会被感知到
  2. wait可以递归也可以不递归,通过参数recursive指定

 

留下评论

邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据