consul-KV配置中心与template模板
1.1 配置中心 什么是配置中心?
配置中心管理的是系统启动需要的参数和依赖的各类外部信息,比如 laravel 里的配置项,一般情况都 是。用 key-value 来存取,也可以做成是一个有层次结构的key-value。配置中心一般用来控制系统的启 动,运行时的部分参数的调整,比如进程数、缓存类型等。这些数据的特点是,一般情况下变化不大, 但是需要考虑不同环境(有时也叫组)的隔离性,同时需要考虑存在很多套不同的配置,不同环境的系统通 过这样的一个配置中心来去拉取自己的参数。这一块基本上常见的apollo、zk、etcd都支持的很好。
配置中心的作用?
管理系统启动、运行期间需使用的配置信息,从而做到动态的配置管理。
怎么做配置中心?
我们采用Consul模板工具基于Consul KV数据集来渲染配置文件
参考文献:https://www.cnblogs.com/yx88/p/11550146.html
1.2 什么是Consul模板
Consul模板命令启动后,它将读取一个到多个模板文件,并向Consul发出查询,加载它们所需的所有数 据。通常, consul-template 作为守护程序运行,一开始获取初始值,之后持续监控更新,在集群中发 生任何相关更改时都会重新加载模板。更新过程完成后,模板还可以运行后置命令。例如,它可以在进 行配置更改后将HUP信号发送到负载均衡器服务。
模板部署方式:根据使用情况,用户可能在少数几个主机上只有一个consul-template实例,或者也可能 需要在每个主机上运行多个实例。每个Consul模板过程都可以管理多个不相关的文件,如果这些文件共 享数据依赖项,则将根据需要对提取的内容进行重复数据删除,这样可以减少Consul服务器上可能共享 的负载。
单次模板加载:用户也可以使用 -once 标志仅加载一次模板,这在测试或者由其他脚本触发时比较有用。
Conusl模板有啥用途?
- 更新配置文件 : Consul模板工具可用于更新服务配置文件,一种常见的用法是管理负载均衡配置 文件,这些文件需要在许多无法直接连接到Consul群集的计算机上定期动态更新;
- 发现有关Consul群集和服务的数据 :可以收集有关Consul群集中服务的信息。例如,用户可以收集 群集上运行的所有服务的列表,或者可以发现Redis所有服务的地址。注意,这个操作在生产环境 有所限制。
1.3 安装Consul模板
在开发者模式下使用本地Consul代理,先执行 consul agent -dev ,Consul代理正常运行后才能进行 以下其他步骤。 Consul模板工具本身不包含在Consul二进制文件中,需要单独安装。可以直接安装预 编译的二进制文件,也可以下载源代码自行编译,我们将安装预编译的二进制文件。
首先,先下载 consul-template 二进制文件:
下载地址:https://releases.hashicorp.com/consul-template/
这里采用:https://releases.hashicorp.com/consul-template/0.26.0/consul-template_0.26.0_linux_386.zip
1 . 3 .1 安装步骤
# 1. 解压缩
$ unzip consul-template_0.26.0_linux_386.zip
# 2. 将执行文件(解压缩之后的文件夹),复制到/usr/local/bin文件夹下
cp consul-template /usr/local/bin
# 3. 设置环境变量,输入命令:
vim /etc/profile
# 4. 将这里的代码添加到 profile 文件末尾(这里覆盖之前consul的配置)
export CONSUL_TEMPLATE_HOME=/usr/local/bin/consul-template
export PATH=$PATH:$CONSUL_HOME:$CONSUL_TEMPLATE_HOME;
# 5. 执行命令使环境变量生效
source /etc/profile
# 6. 验证软件是否安装成功
consul-template -v
1.4 Consul-template 配置文件生成
步骤:
- Consul-template 定义模板文件: demo_consul.tpl
#创建模板
touch demo_consul.tpl
#定义模板内容项
{{ key "/demo/demo_consul" }}
注意:key的内容就是consul中的key名称
- consul-template读取KV数据,用于渲染生成配置文件
#运行consul-template命令,同时指定要使用的模板和需要更新的文件:
consul-template -consul-addr 192.168.238.137:8500 -template="demo_consul.tpl:demo_consul.conf" -once
命令说明:
- -consul-addr: 指定Consul的API接口 ,默认是8500端口。 如果是本机执行,则无需这个参数。
- -template:模板参数,第一个参数是模板文件位置,第二个参数是结果输出位置。
- -once:只运行一次就退出,如果没有这个参数,则为后台挂起,起到动态监听的作用。
查看结果:
结论:template模板就是动态监听consul,把consul中输入的value内容动态渲染到本地,并生成想要的配置文件,这里输出的是nginx.conf,也可以是.env之类的配置信息。
-
想要动态更新模板的值
可以采用kv指令更新 ,
consul kv put demo/demo_consul "you_values"
hashicorp/street_address 值,可以看到该文件立即更新。有啥用? 比如用户可以用相同的过程来 更新HAProxy负载均衡器配置。
1 . 5 Consul-template 服务配置生成
步骤:
- 定义模板文件: all-services.tpl
{{range services}} # {{.Name}}{{range service .Name}}
{{.Address}}:{{.Port}} max_fails=3 fail_timeout=60 weight=1; {{end}}
{{end}}
- 运行 consul-template 命令指定我们刚刚创建的模板,并使用 -once 标志,仅运行一次
consul-template -consul-addr 192.168.238.137:8500 -template="all-services.tpl:all-services.conf" -once
运行结果:
注意:这里输出的服务信息是consul注册成功而且节点健康的服务配置信息。
当前注册的服务有下:
userService中的服务配置有下:
结论:consul-template模板可以动态的输出consul服务中所注册的服务配置信息,拿userService举例,这里注册了两台功能一样,都是用来提供用户信息服务,这里可以根据注册的服务器数量进行nginx的负载均衡配置。
1 . 5 . 1 根据consul-template进行nginx的负载均衡配置
1 . 创建模板:userSerivce.tpl
#service后面的是consul注册成功的服务名,这里用userSerivce
#如果服务是userSerivce,则进行生产userSerivce的nginx.conf的配置信息
{{if service "userService"}}
server {
listen 80;
server_name ~^wallet\.(.+\.)?wudimanong\.(com|cn)$;
access_log /data/logs/nginx/wallet-access.log ;
error_log /data/logs/nginx/wallet-error.log ;
client_max_body_size 1000m;
location / {
include proxy.conf;
proxy_pass http://userService;
}
}
upstream userService {
{{range service "userService"}}
server {{.Address}}:{{.Port}};
{{end}}
}
{{end}}
2 . 生成模板
consul-template -consul-addr 192.168.238.137:8500 -template="userService.tpl:userService.conf" -once
3 . 结果
userService中的服务配置有下:
**注意:**如果此时我们关掉userService微服务的一个实例,相应地我们就会从生成的Nginx配置中看到下线的实例的服务地址和端口就被剔除掉,如下。
1 . 6 Consul-KV
什么是consul的KV数据?
Consul 提供了一个简单的键值存储(KV store)。它可以用于保存动态配置、辅助服务间协作、建立领导 选举以及其他开发者想要实现的功能。可以把 consul 理解为简单的 Redis ,根据 KV 来进行键值对的数 据存储。
为什么使用Consul的KV数据?
consul的kv功可以用来做动态配置。
kv的增加修改删除查询除了可以通过consul-cli客户端,还可以通过 http-api和consul的ui。
1 . 6 . 1 consul-cli请求操作
1 . 获取kv结果值
consul kv get demo/demo_consul
用 -detailed 标识可以获取 Consul 保存的详细元数据
consul kv get -detailed demo/demo_consul
-recurse 选项可以递归查询子键,结果按字典序排列
consul kv get -recurse
2 . 添加与编辑
consul kv put -flags=42 demo/new_test '{"serviceName":"order_consul","IP": "192.168.48.129","prot": "9503"}'
3. 删除一个键值对
consul kv delete demo/new_test
1 . 6 . 2 Http-api请求操作
使用 HTTP GET ,URL 如下,IP为运行consul agent的机器ip,port默认为8500,key注意如果有path的 话需要带上。
格式:
http://ip:port/v1/kv/key
1 . 获取kv信息(get)
http://192.168.48.128:8500/v1/kv/demo/new_test
#demo/new_test 为key的路径值,获取内容如下
#value是经过base64加密过的数据,需要进行解密
[
{
"LockIndex": 0,
"Key": "config/db/data",
"Flags": 0,
"Value": "ewoic2lnbiI6Indpbm5lciIsCiAgImRyaXZlciI6InJlZGlzIgp9",
"CreateIndex": 21275,
"ModifyIndex": 21286
}
]
2 . 新增/修改数据(put)
http://192.168.48.128:8500/v1/kv/demo/test
3 . 删除数据 (DELETE)
http://192.168.48.128:8500/v1/kv/demo/test