批量剔除consul无效服务

  • 一、剔除consul无效服务
    • 1.脚本
      • 1.1单节点删除
      • 1.2集群删除
        • 1.2.1集群删除脚本1
        • 1.2.2集群删除优化脚本2
        • 1.2.3集群删除优化脚本3
    • 2.java服务

一、剔除consul无效服务

正常情况下,若是没有设置服务的健康检查剔除时间,则 consul不会主动的去清除掉失效的服务,所以就需要手动的来清理, 但是往往一个consul上又有多个失效的服务,一个一个剔除效率又太低,那么就需要通过脚本等形式进行批量剔除。

1.脚本

1.1单节点删除

参考删除consul的无效/失效服务

vi clean_consul.sh
加入以下内容:

#!/bin/bash
# tiki 2021-06-22#consul的地址
CONSUL_ADDRESS="192.168.2.4:8500"#判断是否存在logs目录,不存在则创建
test -d logs || mkdir logsecho -e "\n---------start  "$(date "+%Y-%m-%d %H:%M:%S")"----------"
echo -e "\n---------start  "$(date "+%Y-%m-%d %H:%M:%S")"----------" >> logs/clean-consul-`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}
doecho "${critical} 已删除"echo "${critical} 已删除" >> logs/clean-consul-`date +%Y%m%d`.log# 使用consul的API删除对应的serviceIDcurl -XPUT http://${CONSUL_ADDRESS}/v1/agent/service/deregister/${critical}
done
echo -e "---------finish  "$(date "+%Y-%m-%d %H:%M:%S")"----------\n"
echo -e "---------finish  "$(date "+%Y-%m-%d %H:%M:%S")"----------\n" >> logs/clean-consul-`date +%Y%m%d`.log

但上述脚本只能删除注册在该consul节点上的无效服务,就算该节点是consul集群中的一个有效节点,也无法删除其他节点上的无效服务,
所以consul如果是个集群的话,则应该用下方脚本

1.2集群删除

1.2.1集群删除脚本1

将所有consul节点的地址都编入:

#!/bin/bash
# tiki 2021-06-22#consul的地址
CONSUL_ADDRESS="192.168.2.4:8500 192.168.3.3:8500 192.168.3.2:8500 192.168.3.1:8500 192.168.3.6:8500"#判断是否存在logs目录,不存在则创建
test -d logs || mkdir logsecho -e "\n---------start  "$(date "+%Y-%m-%d %H:%M:%S")"----------"
echo -e "\n---------start  "$(date "+%Y-%m-%d %H:%M:%S")"----------" >> logs/clean-consul-`date +%Y%m%d`.log
for ADDRESS in ${CONSUL_ADDRESS}
doecho "开始删除 ${ADDRESS} 上无效服务"echo "开始删除 ${ADDRESS} 上无效服务" >> logs/clean-consul-`date +%Y%m%d`.log# 获取当前consul中状态为critical的serviceIDCONSUL_CRITICAL=`curl -s -XGET http://${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}doecho "${critical} 已删除"echo "${critical} 已删除" >> logs/clean-consul-`date +%Y%m%d`.log# 使用consul的API删除对应的serviceIDcurl -XPUT http://${ADDRESS}/v1/agent/service/deregister/${critical}doneecho -e "${ADDRESS} 删除无效服务结束\n"echo -e "${ADDRESS} 删除无效服务结束\n" >> logs/clean-consul-`date +%Y%m%d`.log
done
echo -e "---------finish  "$(date "+%Y-%m-%d %H:%M:%S")"----------\n"
echo -e "---------finish  "$(date "+%Y-%m-%d %H:%M:%S")"----------\n" >> logs/clean-consul-`date +%Y%m%d`.log

1.2.2集群删除优化脚本2

优化了输出日志到控制台与文件后的脚本如下,但好像性能有下降,有待验证:
(若是有多个consul的单节点,又不属于同一个集群,则推荐用该脚本,相较于脚本1,脚本2只是优化了日志输出语句)

#!/bin/bash
# tiki 2021-06-22#consul的地址
CONSUL_ADDRESS="192.168.2.4:8500 192.168.3.3:8500 192.168.3.2:8500 192.168.3.1:8500 192.168.3.6:8500"
#日志文件名称
LOG_FILE="clean-consul.log"#判断是否存在logs目录,不存在则创建
test -d logs || mkdir logsecho "---------start  "$(date "+%Y-%m-%d %H:%M:%S")"----------" | tee -a logs/${LOG_FILE}
for ADDRESS in ${CONSUL_ADDRESS}
doecho "开始删除 ${ADDRESS} 上无效服务" | tee -a logs/${LOG_FILE}# 获取当前consul中状态为critical的serviceIDCONSUL_CRITICAL=`curl -s -XGET http://${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}doecho "${critical} 已删除" | tee -a logs/${LOG_FILE}# 使用consul的API删除对应的serviceIDcurl -XPUT http://${ADDRESS}/v1/agent/service/deregister/${critical}doneecho -e "${ADDRESS} 删除无效服务结束\n" | tee -a logs/${LOG_FILE}
done
echo -e "---------finish  "$(date "+%Y-%m-%d %H:%M:%S")"----------\n" | tee -a logs/${LOG_FILE}

参考将终端内容输出到文件中,又显示在终端

1.2.3集群删除优化脚本3

继上述输出优化后,优化consul集群节点查询,不用再手动输入所有consul集群节点,下方脚本可以通过一个节点查询出集群中的所有节点(要求是一个集群内的):

#!/bin/bash
# tiki 2021-06-23#consul的地址,集群中一个节点即可
CONSUL_ADDRESS="192.168.2.4:8500"
#日志文件名称
LOG_FILE="clean-consul.log"#判断是否存在logs目录,不存在则创建
test -d logs || mkdir logsecho "---------start  "$(date "+%Y-%m-%d %H:%M:%S")"----------" | tee -a logs/${LOG_FILE}
# 获取当前consul中所有节点的Node
CONSUL_NODE=`curl -s -XGET http://${CONSUL_ADDRESS}/v1/catalog/nodes | python -m json.tool | grep Node | awk '{print $2}' |sed 's/"//g' | sed 's/,//g'`
echo -e "consul集群所有节点如下:\n${CONSUL_NODE}\n" | tee -a logs/${LOG_FILE}
for NODE in ${CONSUL_NODE}
do#从node的第8个字符开始截取ADDRESS=${NODE:7}echo "当前节点为:${ADDRESS}" | tee -a logs/${LOG_FILE}echo "开始删除 ${ADDRESS} 上无效服务" | tee -a logs/${LOG_FILE}# 获取当前consul中状态为critical的serviceIDCONSUL_CRITICAL=`curl -s -XGET http://${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}doecho "${critical} 已删除" | tee -a logs/${LOG_FILE}# 使用consul的API删除对应的serviceIDcurl -XPUT http://${ADDRESS}/v1/agent/service/deregister/${critical}doneecho -e "${ADDRESS} 节点删除无效服务结束\n" | tee -a logs/${LOG_FILE}
done
echo -e "---------finish  "$(date "+%Y-%m-%d %H:%M:%S")"----------\n" | tee -a logs/${LOG_FILE}

其运行如下:

---------start  2021-06-23 11:30:42----------
consul集群所有节点如下:
client-192.168.3.2:8500
client:192.168.2.4:8500
server-192.168.3.3:8500
server-192.168.3.1:8500
server-192.168.3.6:8500当前节点为:192.168.3.2:8500
开始删除 192.168.3.2:8500 上无效服务
smarthome-telecomsync-srv-192-168-71-1 已删除
192.168.3.2:8500 节点删除无效服务结束当前节点为:192.168.2.4:8500
开始删除 192.168.2.4:8500 上无效服务
192.168.2.4:8500 节点删除无效服务结束当前节点为:192.168.3.3:8500
开始删除 192.168.3.3:8500 上无效服务
192.168.3.3:8500 节点删除无效服务结束当前节点为:192.168.3.1:8500
开始删除 192.168.3.1:8500 上无效服务
192.168.3.1:8500 节点删除无效服务结束当前节点为:192.168.3.6:8500
开始删除 192.168.3.6:8500 上无效服务
192.168.3.6:8500 节点删除无效服务结束---------finish  2021-06-23 11:30:43----------

减少循环次数,优化如下(若是一个consul集群内的,则推荐用该脚本):

#!/bin/bash
# tiki 2021-06-23#consul的地址,集群中一个节点即可
CONSUL_ADDRESS="192.168.2.4:8500"
#日志文件名称
LOG_FILE="clean-consul.log"#判断是否存在logs目录,不存在则创建
test -d logs || mkdir logsecho "---------start  "$(date "+%Y-%m-%d %H:%M:%S")"----------" | tee -a logs/${LOG_FILE}
# 获取当前consul中所有节点的Node
CONSUL_NODE=`curl -s -XGET http://${CONSUL_ADDRESS}/v1/catalog/nodes | python -m json.tool | grep Node | awk '{print $2}' |sed 's/"//g' | sed 's/,//g'`
echo -e "consul集群所有节点如下:\n${CONSUL_NODE}\n" | tee -a logs/${LOG_FILE}
for NODE in ${CONSUL_NODE}
do#从node的第8个字符开始截取ADDRESS=${NODE:7}echo "当前节点为:${ADDRESS}" | tee -a logs/${LOG_FILE}echo "开始删除 ${ADDRESS} 上无效服务" | tee -a logs/${LOG_FILE}# 获取当前consul中状态为critical的serviceIDCONSUL_CRITICAL=`curl -s -XGET http://${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}doecho "${critical} 已删除" | tee -a logs/${LOG_FILE}# 使用consul的API删除对应的serviceIDcurl -XPUT http://${ADDRESS}/v1/agent/service/deregister/${critical}doneecho -e "${ADDRESS} 节点删除无效服务结束\n" | tee -a logs/${LOG_FILE}#判断无效的服务列表是否为空,为空则结束循环if [ -z "${CONSUL_CRITICAL}" ]thenecho -e "所有无效服务都已删除\n" | tee -a logs/${LOG_FILE}breakfi
done
echo -e "---------finish  "$(date "+%Y-%m-%d %H:%M:%S")"----------\n" | tee -a logs/${LOG_FILE}

执行后如下:

---------start  2021-06-23 11:49:45----------
consul集群所有节点如下:
client-192.168.3.2:8500
client:192.168.2.4:8500
server-192.168.3.3:8500
server-192.168.3.1:8500
server-192.168.3.6:8500当前节点为:192.168.3.2:8500
开始删除 192.168.3.2:8500 上无效服务
192.168.3.2:8500 节点删除无效服务结束所有无效服务都已删除---------finish  2021-06-23 11:49:45----------

若是有多个consul集群,则稍微改造上面脚本即可

2.java服务

参考consul剔除无效服务

批量剔除consul无效服务相关推荐

  1. consul删除无效服务

    curl http://server_ip:8500/v1/agent/service/deregister/paas-portal-sit-9003 -X PUT 删除无效服务: paas-port ...

  2. 使用Consul做服务发现的若干姿势

    作者:波斯码 来源:http://blog.bossma.cn/consul/consul-service-register-and-discovery-style/?hmsr=toutiao.io& ...

  3. Api网关Kong集成Consul做服务发现及在Asp.Net Core中的使用

     1622219047536 写在前面   Api网关我们之前是用 .netcore写的 Ocelot的,使用后并没有完全达到我们的预期,花了些时间了解后觉得kong可能是个更合适的选择. 简单说下 ...

  4. 一个故事,一段代码告诉你如何使用不同语言(GolangC#)提供相同的能力基于Consul做服务注册与发现

    文章目录 引言 什么是微服务 传统服务 微服务 什么是服务注册与服务发现 为什么要使用不同的语言提供相同的服务能力 服务协调器 服务注册 Golang C#(.NetCore3.1) 服务发现 通过H ...

  5. .NET Core微服务之基于Consul实现服务治理

    一.Consul基础介绍 Consul是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置.与其他分布式服务注册与发现的方案,比如 Airbnb的SmartStack等相比,Co ...

  6. .NET Core微服务之基于Consul实现服务治理(续)

    Tip: 此篇已加入.NET Core微服务基础系列文章索引 上一篇发布之后,很多人点赞和评论,不胜惶恐,这一篇把上一篇没有弄到的东西补一下,也算是给各位前来询问的朋友的一些回复吧. 一.Consul ...

  7. Asp.Net Core Ocelot Consul 微服务

    做一个简单的微服务架构如下图: 这个图表示的是一个网关代理Consul的两个服务,consul每个服务注册集群 安装 Consul的服务,这里安装单机版的,集群版配置最低要求(3个Consul ser ...

  8. .net core grpc consul 实现服务注册 服务发现 负载均衡(二)

    在上一篇 .net core grpc 实现通信(一) 中,我们实现的grpc通信在.net core中的可行性,但要在微服务中真正使用,还缺少 服务注册,服务发现及负载均衡等,本篇我们将在 .net ...

  9. Node.js + Consul 实现服务注册、健康检查、配置中心

    Node.js + Consul 实现服务注册.健康检查.配置中心 在这篇文章中: 初始化 Consul 客户端 服务注册与健康检查 配置Consul管理控制台 服务配置中心实现 在Nodejs中进行 ...

  10. golang 使用 consul 做服务发现

    原文地址:golang 使用 consul 做服务发现 当我们服务越来越多,如果服务配置了弹性伸缩,或者当服务不可用时,我们需要随时动态掌握可以使用的服务数量,并向可提供响应的服务发送请求.这时我们需 ...

最新文章

  1. Git相关二三事(git reflog 和彩色branch)【转】
  2. python3.7如何使用enum_我如何用Python表示‘Enum’?
  3. 【Flutter】Dart 面向对象 ( 类定义 | 类的继承 | 私有变量 | 可选参数 | 默认参数 | 初始化列表 )
  4. 数据中心小母线与列头柜供配电系统的综合比较
  5. poj 2749 2-SAT问题
  6. Hacker(22)----解除系统中的密码
  7. selenium操作cookies实现免密登录,自动发微博
  8. [CodeJam 2019 Round 3] Rancake Pyramid(笛卡尔树)
  9. vue动态监听窗口高度 - 全背景banner
  10. python四种可变类型_Python的可变类型与不可变类型
  11. 织梦dede所有标签调用方法大全
  12. opencv 编译安装时出现报错 modules/videoio/src/cap_ffmpeg_impl.hpp:585:34: error: ‘AVStream {aka struct AVStre
  13. 天堂2单机版如何架设mysql_天堂2单机版 L2J-som-rotm 安装全过程及常用工具 一步到位...
  14. 方舟生存进化服务器存档位置,方舟生存进化如何转移存档
  15. mocha java mv_代码覆盖Mocha
  16. Webtoos 仿Q+云桌面框架
  17. 52GB!网曝网易邮箱数据又泄露?还是葫芦娃?
  18. python django + uwsgi+Nginx宝塔centos7的部署方案
  19. aptio设置图解教程2012中文_u盘装系统bios设置图解|u盘重装系统设置bios教程
  20. uniapp微信小程序使用vant-weapp详细操作步骤(各种坑)

热门文章

  1. centos php安装 pecl,pecl是什么?如何在centos下安装pecl?
  2. Autovue 集成
  3. arduino IED2.0实现Serial.println打印结果
  4. 【吐槽】Android 第一步,雀氏纸尿裤
  5. docker之网络管理
  6. 启动springboot报错:程序包org.springframework.boot不存在
  7. HCNA 实验指南(Ensp V350)
  8. 全国省份、城市关联表 mysql(含城市名拼音)
  9. oracle to_char 进制转换_〖Oracle 转载〗Oracle的数据类型转换 to_char
  10. Anaconda基本教程及常用命令(介绍、安装、基本操作、管理环境、管理包、conda和pip以及借助pqi换源)