Confd+Consul 动态生成配置文件
一、Consul安装和配置
1、consul是什么?
consul是HashiCorp公司推出的一款工具,主要用于实现分布式系统的服务发现与配置,它提供了以下几个关键特性:
- 服务发现:Consul客户端可以提供如 api或mysql之类的服务,其他客户端使用Consul去发现一个指定服务的提供者.通过DNS或者HTTP应用程序可用很容易的找到他所依赖的服务.
- 健康检查:consul客户端可以提供任意数量的健康检查,,可以结合具体的服务(“Web服务器返回200 OK”)或本地节点(“内存利用率低于90%”)。操作者可以通过检测信息来监视群集运行状况,服务发现组件会将流量从不健康的主机路由到健康主机。
- K/V存储:应用程序可以根据需要使用consul的层级K/V存储,如动态配置,功能标记,一致性协调,leader选举等。简单的HTTP API使其易于使用。
- 多数据中心:consul支持开箱即用的多数据中心。用户不用担心需要建立额外的抽象层让业务扩展到多个区域.。
Consul面向DevOps和应用开发者友好.非常适合现代的弹性的基础设施.
2、Consul基础架构
1、consul是一个分布式,高可用性的系统。这里只是简单介绍一下基础知识,故意省略了一些不必要的细节,以便能够快速了解consul的工作原理.
2、每个提供Consul服务的节点都会运行一个consul agent。发现服务或者获取、设置key/value数据的节点不需要运行agent。agent负责对节点上运行的服务以及节点本身进行健康检查。
3、agent连接一个或者多个Consul server,Consul server存储,复制数据,选取leaader。虽然Consul server可以只运行一个,但是通常建议每个数据中心运行由3到5个consul server组成的集群,以防单点故障造成数据丢失。
4、需要发现其他服务或节点的组件可以查询任何consul server或consul agent。consul agent会自动将请求转发给consul server。
5、每个数据中心都运行一组Consul server集群。当进行跨数据中心服务发现或配置请求时,本地consul server会将请求转发到远程数据中心并返回结果。
3、Consul架构图

4、Consul安装
和其他软件一样,都支持二进制安装、源码安装等。我这里采用最简单的安装方式:二进制安装。
wget https://releases.hashicorp.com/consul/1.5.3/consul_1.5.3_linux_amd64.zip
unzip consul_1.5.3_linux_amd64.zip
mv consul /usr/bin/
安装完成。
5、Consul启动
consul agent -server -bootstrap -ui -data-dir=/var/lib/consul-data -bind=172.31.0.21 -client=0.0.0.0 -node=server01
agent:agent模式
server:server模式
ui:启用UI界面
datadir:数据目录
bind:绑定侦听地址
client:指定client
node:节点名称
6、Consul启动日志
[root@vm172-31-0-21 ~]# consul agent -server -bootstrap -ui -data-dir=/var/lib/consul-data -bind=172.31.0.21 -client=0.0.0.0 -node=server01
bootstrap = true: do not enable unless necessary
==> Starting Consul agent...
Version: 'v1.5.3'
Node ID: '381f702d-7495-1b19-d75e-9cd79b1bbf8e'
Node name: 'server01'
Datacenter: 'dc1' (Segment: '<all>')
Server: true (Bootstrap: true)
Client Addr: [0.0.0.0] (HTTP: 8500, HTTPS: -1, gRPC: -1, DNS: 8600)
Cluster Addr: 172.31.0.21 (LAN: 8301, WAN: 8302)
Encrypt: Gossip: false, TLS-Outgoing: false, TLS-Incoming: false, Auto-Encrypt-TLS: false ==> Log data will now stream in as it occurs: 2019/08/02 10:00:12 [INFO] raft: Initial configuration (index=1): [{Suffrage:Voter ID:381f702d-7495-1b19-d75e-9cd79b1bbf8e Address:172.31.0.21:8300}]
2019/08/02 10:00:12 [INFO] raft: Node at 172.31.0.21:8300 [Follower] entering Follower state (Leader: "")
2019/08/02 10:00:12 [INFO] serf: EventMemberJoin: server01.dc1 172.31.0.21
2019/08/02 10:00:12 [INFO] serf: EventMemberJoin: server01 172.31.0.21
2019/08/02 10:00:12 [INFO] consul: Adding LAN server server01 (Addr: tcp/172.31.0.21:8300) (DC: dc1)
2019/08/02 10:00:12 [INFO] consul: Handled member-join event for server "server01.dc1" in area "wan"
2019/08/02 10:00:12 [WARN] agent/proxy: running as root, will not start managed proxies
2019/08/02 10:00:12 [INFO] agent: Started DNS server 0.0.0.0:8600 (udp)
2019/08/02 10:00:12 [INFO] agent: Started DNS server 0.0.0.0:8600 (tcp)
2019/08/02 10:00:12 [INFO] agent: Started HTTP server on [::]:8500 (tcp)
2019/08/02 10:00:12 [INFO] agent: started state syncer
==> Consul agent running!
2019/08/02 10:00:19 [ERR] agent: failed to sync remote state: No cluster leader
2019/08/02 10:00:20 [WARN] raft: Heartbeat timeout from "" reached, starting election
2019/08/02 10:00:20 [INFO] raft: Node at 172.31.0.21:8300 [Candidate] entering Candidate state in term 2
2019/08/02 10:00:20 [INFO] raft: Election won. Tally: 1
2019/08/02 10:00:20 [INFO] raft: Node at 172.31.0.21:8300 [Leader] entering Leader state
2019/08/02 10:00:20 [INFO] consul: cluster leadership acquired
2019/08/02 10:00:20 [INFO] consul: New leader elected: server01
2019/08/02 10:00:20 [INFO] consul: member 'server01' joined, marking health alive
2019/08/02 10:00:22 [INFO] agent: Synced node info
7、dashboard

二、confd安装和配置
1、confd简介
当系统变的复杂,配置项越来越多,一方面配置管理变得繁琐,另一方面配置修改后需要重新上线同样十分痛苦。这时候,需要有一套集中化配置管理系统,一方面提供统一的配置管理,另一方面提供配置变更的自动下发,及时生效。
统一配置管理系统,大家应该比较熟悉,常见的:zookeeper、etcd、consul、git等
confd流程图

2、confd是如何工作的?

3、confd的安装
下载confd的二进制文件,下载地址为:https://github.com/kelseyhightower/confd/releases。
# Download the binary
wget https://github.com/kelseyhightower/confd/releases/download/v0.16.0/confd-0.16.0-linux-amd64 # 重命名二进制文件,并移动到PATH的目录下
mv confd-0.16.0-linux-amd64 /usr/local/bin/confd
chmod +x /usr/local/bin/confd # 验证是否安装成功
confd --help
4、confd的配置
1. 创建confdir
mkdir -p /etc/confd/{conf.d,templates}
confdir底下包含两个目录:
conf.d:confd的配置文件,主要包含配置的生成逻辑,例如模板源,后端存储对应的keys,命令执行等。templates:配置模板Template,即基于不同组件的配置,修改为符合 Golang text templates的模板文件。
2、Template Resources
模板源配置文件是TOML格式的文件,主要包含配置的生成逻辑,例如模板源,后端存储对应的keys,命令执行等。默认目录在/etc/confd/conf.d。
cat /etc/confd/conf.d/myconfig.toml
[template]
src = "myconfig.conf.tmpl"
dest = "/tmp/myconfig.conf"
keys = [
"/myapp/database/url",
"/myapp/database/user",
]
src:指定tmpl源文件
dest:指定生成目标文件
keys:tmpl会用到的变量
3、Template
emplate定义了单一应用配置的模板,默认存储在/etc/confd/templates目录下,模板文件符合Go的text/template格式。
模板文件常用函数有base,get,gets,lsdir,json等。具体可参考https://github.com/kelseyhightower/confd/blob/master/docs/templates.md。
cat /etc/confd/templates/myconfig.conf.tmpl
[myconfig]
database_url = {{getv "/myapp/database/url"}}
database_user = {{getv "/myapp/database/user"}}
4、启动confd
confd -confdir="/etc/confd/" -config-file="/etc/confd/conf.d/myconfig.toml" -onetime=false -interval=3 -backend consul -node 172.31.0.21:8500 -log-level="debug"
confdir:配置文件目录
config-file:配置文件
interval:检测文件变化间隔
backend:指定后端数据库
node:后端数据库地址
log-level:日志级别
5、启动日志
[root@vm172-31-0-21 confd]# confd -confdir="/etc/confd/" -config-file="/etc/confd/conf.d/myconfig.toml" -onetime=false -interval=3 -backend consul -node 172.31.0.21:8500 -log-level="debug"
2019-08-02T10:37:11+08:00 vm172-31-0-21.ksc.com confd[1801]: INFO Backend set to consul
2019-08-02T10:37:11+08:00 vm172-31-0-21.ksc.com confd[1801]: INFO Starting confd
2019-08-02T10:37:11+08:00 vm172-31-0-21.ksc.com confd[1801]: INFO Backend source(s) set to 172.31.0.21:8500
2019-08-02T10:37:11+08:00 vm172-31-0-21.ksc.com confd[1801]: DEBUG Loading template resources from confdir /etc/confd/
2019-08-02T10:37:11+08:00 vm172-31-0-21.ksc.com confd[1801]: DEBUG Found template: /etc/confd/conf.d/myconfig.toml
2019-08-02T10:37:11+08:00 vm172-31-0-21.ksc.com confd[1801]: DEBUG Loading template resource from /etc/confd/conf.d/myconfig.toml
2019-08-02T10:37:11+08:00 vm172-31-0-21.ksc.com confd[1801]: DEBUG Retrieving keys from store
2019-08-02T10:37:11+08:00 vm172-31-0-21.ksc.com confd[1801]: DEBUG Key prefix set to /
2019-08-02T10:37:11+08:00 vm172-31-0-21.ksc.com confd[1801]: DEBUG Got the following map from store: map[/myapp/database/url:db.example.com /myapp/database/user:rob]
2019-08-02T10:37:11+08:00 vm172-31-0-21.ksc.com confd[1801]: DEBUG Using source template /etc/confd/templates/myconfig.conf.tmpl
2019-08-02T10:37:11+08:00 vm172-31-0-21.ksc.com confd[1801]: DEBUG Compiling source template /etc/confd/templates/myconfig.conf.tmpl
2019-08-02T10:37:11+08:00 vm172-31-0-21.ksc.com confd[1801]: DEBUG Comparing candidate config to /tmp/myconfig.conf
2019-08-02T10:37:11+08:00 vm172-31-0-21.ksc.com confd[1801]: DEBUG Target config /tmp/myconfig.conf in sync
2019-08-02T10:37:14+08:00 vm172-31-0-21.ksc.com confd[1801]: DEBUG Loading template resources from confdir /etc/confd/
2019-08-02T10:37:14+08:00 vm172-31-0-21.ksc.com confd[1801]: DEBUG Found template: /etc/confd/conf.d/myconfig.toml
2019-08-02T10:37:14+08:00 vm172-31-0-21.ksc.com confd[1801]: DEBUG Loading template resource from /etc/confd/conf.d/myconfig.toml
2019-08-02T10:37:14+08:00 vm172-31-0-21.ksc.com confd[1801]: DEBUG Retrieving keys from store
2019-08-02T10:37:14+08:00 vm172-31-0-21.ksc.com confd[1801]: DEBUG Key prefix set to /
2019-08-02T10:37:14+08:00 vm172-31-0-21.ksc.com confd[1801]: DEBUG Got the following map from store: map[/myapp/database/user:rob /myapp/database/url:db.example.com]
6、查看新生成的配置文件
cat /tmp/myconfig.conf
[myconfig]
database_url = db.example.com
database_user = rob
三、整体流程图

Confd+Consul 动态生成配置文件的更多相关文章
- confd动态生成配置文件
下载安装confd $ mkdir -p $GOPATH/src/github.com/kelseyhightower $ git clone https://github.com/kelseyhig ...
- log4j2 不使用配置文件,动态生成logger对象
大家平时使用Log4j一般都是在classpath下放置一个log4j的配置文件,比如log4j.xml,里面配置好Appenders和Loggers,但是前一阵想做某需求的时候,想要的效果是每一个任 ...
- Python PageFactory-使用配置文件动态生成页面PageObject
需求 在Python Selenium 的 PageObject模式中,一般每个页面需要写一个类, 一种PageObject的写法如下: class BaiduPageObject(object): ...
- docker:nginx+confd动态生成配置
docker:nginx+confd动态生成配置 当我们项目越来越多时手动去服务器修改nginx配置是一件很麻烦而且可能出错的事情.我们可以通过nginx+confd+配置中心实现一套方案避免出错并减 ...
- 【Java EE 学习 77 上】【数据采集系统第九天】【通过AOP实现日志管理】【通过Spring石英调度动态生成日志表】【日志分表和查询】
一.需求分析 日志数据在很多行业中都是非常敏感的数据,它们不能删除只能保存和查看,这样日志表就会越来越大,我们不可能永远让它无限制的增长下去,必须采取一种手段将数据分散开来.假设现在整个数据库需要保存 ...
- 分享我基于NPOI+ExcelReport实现的导入与导出EXCEL类库:ExcelUtility (续3篇-导出时动态生成多Sheet EXCEL)
ExcelUtility 类库经过我(梦在旅途)近期不断的优化与新增功能,现已基本趋向稳定,功能上也基本可以满足绝大部份的EXCEL导出需求,该类库已在我们公司大型ERP系统全面使用,效果不错,今天应 ...
- 基于webpack的前端工程化开发解决方案探索(一):动态生成HTML(转)
1.什么是工程化开发 软件工程的工程化开发概念由来已久,但对于前端开发来说,我们没有像VS或者eclipse这样量身打造的IDE,因为在大多数人眼中,前端代码无需编译,因此只要一个浏览器来运行调试就行 ...
- MVC 5 + EF6 入门完整教程14 -- 动态生成面包屑导航
上篇文章我们完成了 动态生成多级菜单 这个实用组件. 本篇文章我们要开发另一个实用组件:面包屑导航. 面包屑导航(BreadcrumbNavigation)这个概念来自童话故事"汉赛尔和格莱 ...
- 模拟Hibernate动态生成SQL语句
这里有一个xml配置文件,也就是Hibernate框架中会用到的POJO和数据库的映射文件 <?xml version="1.0" encoding="utf-8& ...
随机推荐
- 用vue-cli搭建vue项目
首先需要明确的是:Vue.js 不支持 IE8 及其以下 IE 版本,一般用与移动端,基础:开启最高权限的DOS命令(否则会出现意外的错误提示) 一.安装node.js,检测版本node -v,还要检 ...
- vue创建项目(推荐)
上一节我们介绍了vue搭建环境的情况,并使用一种方式搭建了一个项目,在这里为大家推荐另一种创建项目的方式. vue init webpack-simple vuedemo02 cd vuedemo02 ...
- Unity shader error: “Too many texture interpolators would be used for ForwardBase pass”
Unity shader error: "Too many texture interpolators would be used for ForwardBase pass" 解决 ...
- 【DATAGUARD】物理dg配置客户端无缝切换 (八.2)--Fast-Start Failover 的配置
[DATAGUARD]物理dg配置客户端无缝切换 (八.2)--Fast-Start Failover 的配置 一.1 BLOG文档结构图 一.2 前言部分 一.2.1 导读 各 ...
- day 04 预科
目录 变量 什么是变量 变量的组成 变量名的命名规范 注释 单行注释 多行注释 turtle库的使用 今日内容 数据类型基础 变量 具体的值 存不是目的,取才是目的 为了描述世界万物的状态,因此有了数 ...
- Spring中获取被代理的对象
目录 Spring中获取被代理的对象 获取Spring被代理对象什么时候可能会用到? Spring中获取被代理的对象 Spring中获取被代理的对象 ### 获取Spring被代理对象的JAVA工具类 ...
- 04-JavaScript的操作
本篇主要介绍获取元素的方法.操作元素.数组和字符串的操作方法.定时器和封闭函数.以及贪吃蛇案例: 一.获取元素的方法 1.document.getElementById:可以使用内置对象documen ...
- 【Code Tools】AB性能测试工具(一)
一.工具下载 yum -y install httpd-tools 二.AB工具使用 格式: ab [options] [http://]hostname[:port]/path 例如:ab -n - ...
- synchronized的使用方法和作用域
文章地址:https://mp.weixin.qq.com/s?__biz=MzI4NTEzMjc5Mw==&mid=2650554746&idx=1&sn=8e45e741c ...
- Python入门篇-数据结构树(tree)篇
Python入门篇-数据结构树(tree)篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.树概述 1>.树的概念 非线性结构,每个元素可以有多个前躯和后继 树是n(n& ...