consul–基础–08–注册服务下线问题
1、服务下线问题
1.1、配置
spring:
cloud:
consul:
host: 192.168.187.171
port: 8500
discovery:
prefer-ip-address: true
instance-id: ${spring.application.name}:${spring.cloud.client.ip-address}:${server.port}
# 健康检测API
health-check-path: '/xcoa/health'
# 健康检查频率,也就是心跳频率
health-check-interval: 2s
# 设置健康检查失败多少秒后删除本服务
health-check-critical-timeout: 3s
# 使用心跳检查push机制定期向consul server汇报自身存活情况,逾期没有汇报则server认为异常。
heartbeat:
enabled: true
我们设置健康检查失败3秒后删除本服务
1.2、问题
实际上,consul服务器上的服务,还停留了1分钟。
2、解决方案
- 使用脚本,定时删除无效服务
- 代码里面调用对应的api来处理
3、脚本
使用脚本,定时删除无效服务
3.1、consul 单机情况
3.1.1、创建脚本
cd
# 创建目录
mkdir consul-server-check
# 设置内容
vim consul-server-check/clean_server.sh
内容
#!/bin/bash
#consul的地址
# 注意:当前consul节点只能删除自己节点上的服务,也就是说,172节点上的OA服务,通过171是不能删除的
consul_address="192.168.187.171:8500"
log_dir=/home/hd/consul-server-check/logs
#判断是否存在logs目录,不存在则创建
test -d ${log_dir} || mkdir ${log_dir}
echo -e "\n---------consul服务检查开始 "$(date "+%Y-%m-%d %H:%M:%S")"----------" >> ${log_dir}/log-`date +%Y%m%d`.log
# 获取当前consul中状态为critical的serviceID,也就是获取不健康的服务
consul_critical=`curl -s -XGET http://${consul_address}/v1/health/state/critical | python -m json.tool | grep ServiceID | awk '{print $2}' |sed 's/"//g' | sed 's/,//g'`
for critical in ${consul_critical}
do
# 使用consul的API删除对应的serviceID
curl -XPUT http://${consul_address}/v1/agent/service/deregister/${critical}
echo "${critical} 已删除" >> ${log_dir}/log-`date +%Y%m%d`.log
done
echo -e "---------consul服务检查结束 "$(date "+%Y-%m-%d %H:%M:%S")"----------\n" >> ${log_dir}/log-`date +%Y%m%d`.log
3.1.2、授权
cd
chmod +x consul-server-check/clean_server.sh
3.1.3、执行
cd
./consul-server-check/clean_server.sh
3.2、consul 集群情况
3.2.1、创建脚本
cd
# 创建目录
mkdir consul-server-check
# 设置内容
vim consul-server-check/clean_server.sh
内容
#!/bin/bash
#consul的地址
all_node_address="192.168.187.171:8500 192.168.187.172:8500 192.168.187.173:8500"
# 日志文件目录
log_dir=/home/hd/consul-server-check/logs/
# 日志文件
log_file=log-`date +%Y%m%d`.log
# 通过一个consul节点地址,删除服务
function clean_critical_by_nodeAddress(){
# 设置节点地址
nodeAddress=$1
# 获取当前consul中状态为critical的serviceID,也就是获取不健康的服务
consul_critical=`curl -s -XGET http://${nodeAddress}/v1/health/state/critical | python -m json.tool | grep ServiceID | awk '{print $2}' |sed 's/"//g' | sed 's/,//g'`
for critical in ${consul_critical}
do
# 使用consul的API删除对应的serviceID
curl -XPUT http://${nodeAddress}/v1/agent/service/deregister/${critical}
echo "${critical} 已删除" >> ${log_dir}/${log_file}
done
}
# 删除所有节点
function clean_critical_by_allNodeAddress(){
for nodeAddress in ${all_node_address}
do
# 通过一个consul节点地址,删除服务
clean_critical_by_nodeAddress ${nodeAddress}
done
}
function clean_critical(){
echo -e "\n---------consul服务检查开始 "$(date "+%Y-%m-%d %H:%M:%S")"----------" >> ${log_dir}/${log_file}
#判断日志目录是否存在,不存在就创建
test -d ${log_dir} || mkdir ${log_dir}
# 删除所有节点
clean_critical_by_allNodeAddress
echo -e "---------consul服务检查结束 "$(date "+%Y-%m-%d %H:%M:%S")"----------\n" >> ${log_dir}/${log_file}
}
clean_critical
3.2.2、授权
cd
chmod +x consul-server-check/clean_server.sh
3.2.3、执行
cd
./consul-server-check/clean_server.sh
为什么同一个xcoa实例被删除了2次,原因是
当前consul节点只能删除自己节点上的服务,也就是说,172节点上的OA服务,通过171是不能删除的
4、定时任务
[root@zhoufei ~]# crontab -e
内容
*/1 * * * * /home/hd/consul-server-check/clean_server.sh
每隔一分钟执行一下脚本