Spring Boot如何实现网络连通性检测以通过Chaos Monkey健康检查
解决方案
实现思路
- 全程不访问任何外部公网地址,仅通过读取本机网络配置、检测内部局域网网关连通性判断网络状态,完全符合安全规则
- Chaos Monkey切断互联网攻击触发时,会自动命中检测规则返回DOWN状态,网络正常时返回UP状态
修改后的代码
import org.springframework.boot.actuate.health.Health; import org.springframework.boot.actuate.health.HealthIndicator; import org.springframework.stereotype.Component; import java.net.InetAddress; import java.net.NetworkInterface; import java.util.Enumeration; @Component public class PersonalHealthIndicator implements HealthIndicator { @Override public Health health() { int errorCode = check(); // 执行健康检查逻辑 if (errorCode != 0) { // 检查失败,返回DOWN状态 return Health.down() .withDetail("Error Code", errorCode).build(); } // 检查通过,返回UP状态 return Health.up().build(); } public int check() { try { // 检测逻辑1:仅读取本地网络接口状态,不发送任何网络包,完全合规 Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces(); boolean hasValidActiveInterface = false; while (interfaces.hasMoreElements()) { NetworkInterface networkInterface = interfaces.nextElement(); // 跳过回环接口、虚拟接口、未启动的接口 if (networkInterface.isLoopback() || networkInterface.isVirtual() || !networkInterface.isUp()) { continue; } hasValidActiveInterface = true; break; } if (!hasValidActiveInterface) { // 无可用活跃网络接口,返回错误码1 return 1; } // 检测逻辑2(可选开启,不需要可注释):检测内部默认网关连通性,仅访问内部地址,不涉及外部网站 // 替换为公司实际的内部网关IP即可 InetAddress gateway = InetAddress.getByName("192.168.0.1"); // 超时时间设置为1秒,避免阻塞 if (!gateway.isReachable(1000)) { // 网关不可达,说明网络被切断,返回错误码2 return 2; } } catch (Exception e) { // 检测过程出现异常,返回错误码-1 return -1; } // 所有检查通过,返回0 return 0; } }
适配说明
- 若公司流水线对ICMP包有限制,可直接注释掉网关检测的逻辑,仅保留网卡状态检测即可满足需求
- 网关IP可根据实际部署环境的局域网配置调整,也可替换为公司内部的DNS、镜像仓库等必用基础服务的内网地址,检测准确率更高
内容的提问来源于stack exchange,提问作者Arthur Pendragon De Simone
相关产品推荐
相关产品推荐

