consul配置中心,自动导入数据
文章目录
提示:以下是本篇文章正文内容,下面案例可供参考
一、环境
在Windows上安装docker环境,并在docker上安装consul,启动consul并将端口映射到主机的8500端口
二、分析导入的过程
1)在浏览器中访问127.0.0.1:8500,进入到consul的 Key/Value 功能选项
2)点击右上角的 Create 按钮,创建键值
3)进入consul的cli窗口,运行命令:
consul kv export --http-addr=http://127.0.0.1:8500 >consul_kv.json
4)然后打开consul_kv.json文件
cat consul_kv.json
5)删除consul配置中心的值
6)运行如下命令导入数据
consul kv import --http-addr=http://127.0.0.1:8500 @consul_kv.json
7)再次查看界面效果如下
8)所以要想导入配置信息,需要先将配置文件生成 consul_kv.json 内容格式的json文件。
三、设计导入的json文件
因为需要在Linux环境下运行,所以使用了shell脚本来处理所需要的文件。
#!/bin/bash
app_name_arr=($1) # 所有的服务名称 APP_NAMES
pre_path=$2 # 服务前缀路径 ./app
save_path=$3 # 要保存的文件路径
rm -f ${save_path}
printf "[\n" >> $save_path
is_start=true
for (( i = 0; i < ${#app_name_arr[*]}; i++ )); do
app_name=${app_name_arr[$i]}
app_name=${app_name/-//} # 将 pre-server 处理成 pre/server
file_path=${pre_path}/$app_name/configs
if [ ! -d "$file_path" ]; then
echo $file_path
echo "文件夹不存在"
else
for file in ${file_path}/*; do
temp_file=`basename $file`
key="${file_path}/${temp_file}" # key = ./app/pre/server/configs/文件名.yaml
content_base64=$(cat $file|base64 --wrap=0)
if test "$is_start" = true;
then
is_start=false
else
printf ",\n" >> $save_path
fi
printf "\t{\n" >> $save_path
printf "\t\t\"key\": \"${key}\",\n" >> $save_path
printf "\t\t\"flags\": 0,\n" >> $save_path
printf "\t\t\"value\": \"$content_base64\"\n" >> $save_path
printf "\t}" >> $save_path
done
fi
done
printf "\n]" >> $save_path
1、新建 consul_source.txt 将上述脚本复制进去。然后将 txt 后缀改成sh,得到consul_source.sh文件。
2、新建generate文件夹,将consul_source.sh文件复制进去。然后将配置文件夹也复制进去。目录结构:
3、在generate文件下按住shift + 右键选择 “Git Bash Here”
4、运行如下命令:
./consul_source.sh "pre_1-svc_1 pre_1-svc_2 pre_1-svc_3 pre_2-svc_4" "./app" "./consul_source.json" /
5、查看generate文件夹下,得到 consul_source.json 文件
四、其它额外小结
1、在容器中使用docker-compose方式启动
consul:
image: consul:1.10
container_name: consul.default
restart: always
command: agent -server -bootstrap -ui -client=0.0.0.0
volumes:
- ./consul_source.json:/data/conf
ports:
- 8500:8500
- 8600:8600/udp
test-consul:
image: consul:1.10
container_name: consul.test
command: kv import -http-addr=consul.default:8500 @/data/conf
depends_on:
- consul
这个方式的意思是,当consul服务启动后,test-consul服务再启动,然后在test-consul中运行上面consul服务的命令。但是这种方式不靠谱,不推荐。原因:depends_on只能保证服务启动,不能保证启动已完成。可以考虑使用dockerfile控制服务的启动顺序,这里做个记录。
2、在docker中直接运行consul服务命令导入
docker exec -it consul服务名 sh -c 'consul kv import @/data/conf/consul_source.json'