一次由 DNS 反解析引发的 SpringBoot 启动卡顿问题

news/2025/11/11 9:23:53/文章来源:https://www.cnblogs.com/aaronlinv/p/19208592

TL;DR

  1. 使用 114 DNS 时,反解析内网 IP 无响应,导致 SpringBoot 启动时 Liquibase 初始化阻塞约 30 秒
  2. InetAddress.getLocalHost() 获取到的可能是127.0.0.1,而非实际的内网 IP(如 192.168.x.x)

现象

SpringBoot启动时(HikariPool 初始化后)卡顿 30s

2025-11-09 15:14:33 INFO  [main] com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting...
2025-11-09 15:14:33 INFO  [main] com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Added connection com.p6spy.engine.wrapper.ConnectionWrapper@7f6137fb
2025-11-09 15:14:33 INFO  [main] com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Start completed.

排查

通过 jstack 分析线程栈,定位到 liquibase.util.NetUtil.getLocalHostName() 阻塞

# jps
jstack 66713

下方线程栈显示阻塞点位于 Inet6AddressImpl.getHostByAddr()

"main" #1 prio=5 os_prio=31 cpu=3549.34ms elapsed=14.86s tid=0x000000010a808200 nid=0xd03 runnable  [0x000000016fa00000]java.lang.Thread.State: RUNNABLEat java.net.Inet6AddressImpl.getHostByAddr(java.base@17.0.14/Native Method)at java.net.InetAddress$PlatformNameService.getHostByAddr(java.base@17.0.14/InetAddress.java:940)at java.net.InetAddress.getHostFromNameService(java.base@17.0.14/InetAddress.java:662)at java.net.InetAddress.getHostName(java.base@17.0.14/InetAddress.java:605)at java.net.InetAddress.getHostName(java.base@17.0.14/InetAddress.java:577)at liquibase.util.NetUtil.getLocalHostName(NetUtil.java:79)at liquibase.sqlgenerator.core.LockDatabaseChangeLogGenerator.<clinit>(LockDatabaseChangeLogGenerator.java:30)

对应源码:

public class LockDatabaseChangeLogGenerator extends AbstractSqlGenerator<LockDatabaseChangeLogStatement> {@Overridepublic ValidationErrors validate(LockDatabaseChangeLogStatement statement, Database database, SqlGeneratorChain sqlGeneratorChain) {return new ValidationErrors();}protected static final String hostname;protected static final String hostaddress;protected static final String hostDescription = (System.getProperty("liquibase.hostDescription") == null) ? "" :("#" + System.getProperty("liquibase.hostDescription"));static {try {// NetUtil.getLocalHostName() 导致阻塞hostname = NetUtil.getLocalHostName();hostaddress = NetUtil.getLocalHostAddress();} catch (Exception e) {throw new UnexpectedLiquibaseException(e);}}// ...
}

分析

NetUtil.getLocalHostName() 获取机器 IP:遍历网卡,调用 InetAddress.getHostName() 对内网 IP (192.168.10.2)做反解析,114 DNS(114.114.114.114)无响应,则导致阻塞 30s

package liquibase.util;// ...public class NetUtil {// .../*** @return Machine's host name. This method can be better to call than getting it off {@link #getLocalHost()} because sometimes the external address returned by that function does not have a useful hostname attached to it.* This function will make sure a good value is returned.*/public static String getLocalHostName() {if (hostName == null ) {try {// 遍历所有网络接口,找出 已启用 的 非点对点 网络接口,然后打印这些接口上每个非本地地址对应的主机名(hostname)InetAddress localHost = getLocalHost();if(localHost != null) {// 使用指定的 DNS 反解析获取的 IPhostName = localHost.getHostName();if (hostName.equals(localHost.getHostAddress())) {//sometimes the external IP interface doesn't have a hostname associated with it but localhost always doesInetAddress lHost = InetAddress.getLocalHost();if (lHost != null) {hostName = lHost.getHostName();}}}else {hostName = UNKNOWN_HOST_NAME;}} catch (Exception e) {Scope.getCurrentScope().getLog(NetUtil.class).fine("Error getting hostname", e);if (hostName == null) {hostName = UNKNOWN_HOST_NAME;}}}return hostName;}
}

大多数公共 DNS(如阿里、Google)在无法解析内网地址时返回 NXDOMAIN,而 114 DNS 无响应,导致 Java 原生反解析方法阻塞

# 耗时:0.228s
nslookup 192.168.10.2 223.5.5.5
Server:		223.5.5.5
Address:	223.5.5.5#53** server can't find 2.10.168.192.in-addr.arpa: NXDOMAIN
# 耗时:15.137s
nslookup 192.168.10.2 114.114.114.114
;; connection timed out; no servers could be reached

遍历网卡的原因

获取机器 IP 常用的方法:InetAddress.getLocalHost() 获取到的可能是127.0.0.1(与 JDK 实现有关),是一个本地回环地址(loopback address)。而非对外通信用的实际的网络 IP(例如 192.168.x.x 或 10.x.x.x)

为了获取 实际的网络 IP,一般使用类似上面 NetUtil.getLocalHostName() 的方式,遍历网卡获取实际 IP

参考:JDK-4665037 : InetAddress.getLocalHost() ambiguous on Linux systems

解决方案

最有效的解决方法是更换合适的 DNS。官方 issue 中有反馈类似的问题

参考:Slow NetUtil.getLocalHostName in Windows WSL2 #2440

参考资料

oepnjdk Inet6AddressImpl.c
liquibase NetUtil.java

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/962053.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年航空警示球厂家权威推荐榜单:有机复合材料手孔井/树脂穿线井/复合弱点手孔井源头厂家精选

在航空安全和工业管道运输领域,航空警示球作为关键的视觉警示设备,对保障低空飞行安全和架空管线标识起着至关重要的作用。本文将基于企业技术实力、产品质量、市场份额及客户反馈等多维度数据,为您解析航空警示球行…

平面最近对(p1429)

P1429 平面最近点对(加强版) 题目背景 P7883 平面最近点对(加强加强版) 题目描述 给定平面上 \(n\) 个点,找出其中的一对点的距离,使得在这 \(n\) 个点的所有点对中,该距离为所有点对中最小的。 输入格式 第一行…

用Jmeter向测试接口发送快递查询请求

用Jmeter向测试接口发送快递查询请求原理:向服务器发送数据包,以获取相应快递信息 准备工作: 1.在测试计划中添加线程组;在线程组中添加HTTP请求;在线程组中添加结果树。 2.在http请求中填写各项信息 如图即为所示…

查询天气预报

1 一在万维在线调试二 在jmeter

基于PCA白化和K均值聚类的轴承故障诊断系统

基于PCA白化和K均值聚类的轴承故障诊断系统。方法结合了降维、去相关和聚类分析,能够有效识别不同的故障模式。 1. 轴承故障数据生成与特征提取 classdef BearingFaultData% 轴承故障数据生成与特征提取propertiessam…

五城渠道招商会圆满收官,纷享销客全国生态布局再提速!

近日,纷享销客 2025 年渠道招商闭门会在东莞、武汉、郑州、长沙、重庆五城相继落下帷幕。活动以 “智享未来・领创 CRM 新纪元”为主题,吸引了各地伙伴深度参与,共探数字化浪潮下的业务突破新路径。作为智能型 CRM …

2025年11月空气能热泵厂家推荐:知名机构榜与口碑评价对比指南

一、引言 空气能热泵在“双碳”战略与北方清洁采暖政策叠加的2025年,已成为工商业与家庭热源升级的首选技术路线。中国节能协会热泵专业委员会发布的《2025中国热泵供暖行业白皮书》指出,行业年复合增长率保持在18.7…

2025年苏州吊车租赁公司权威推荐榜单:龙门吊租赁/升降机租赁/高空作业车租赁公司精选

在苏州及长三角地区的工业建设和项目施工中,吊车租赁服务的专业化与可靠性直接影响着工程效率与安全。本文将基于设备规模、服务案例、资质认证及客户口碑等多维度数据,为您呈现苏州地区吊车租赁行业的权威推荐榜单。…

查询快递

1.在万维易源的易源精选中,选择全球快递物流查询。 2.购买次数,在线调试,将已有信息删除,nu=JDAZ22019040560(要查询的快递单号),调用接口 3.在jmeter中新建一个线程组,http请求,填上信息4.保存,添加查看结果…

在JMeter中查询天气和快递

一.查询天气 1.打开JMeter,新建测试计划——新建添加——线程——线程组——添加取样器——http请求 2.服务名称或id:输入route.showapi.com,路径输入:/9-2 3.下方添加:appKey对应的填入2E910e4ced5B432dA675573e…

快递查询,-jmeter

1.添加 线程组 --->http请求---->查看树 2.添加信息:com:快递公司,不知填auto nu:快递单号

JMeter查询天气

1.新建线程组,添加http请求 2.服务器名称或ip:route.showapi.com 路径:/9-2?appKey=a8A46001BB6B42c08B87FffbCBd141c8 3.添加参数 area 烟台 4.添加结果树 保存 运行 5.点击http请求 查看相应数据 response body

第八周第三天8.3

所用时间:90分钟 代码量(行):223 了解到的知识点: 1.知识产权 软件知识产权是软件开发者对自身研发的计算机软件相关智力劳动成果依法享有的无形财产权,包括著作权、专利权、商标权、商业秘密权。 2.权利归属规则…

2025年防爆正压柜厂家权威推荐榜单:防爆正压箱/粉尘防爆柜/防爆正压型小屋源头厂家精选

在石油、化工、军工等高风险工业领域,防爆正压柜作为保障安全生产的核心设备,其技术性能和可靠性直接关系到人员生命和财产安全。本文将基于市场占有率、技术专利数量、客户口碑及行业认证等多维度数据,为您解析防爆…

树莓派语言设置

解决方案 方法1:直接修复locale设置编辑locale配置文件: sudo nano /etc/default/locale将文件内容修改为以下内容: LANG="en_US.UTF-8" LANGUAGE="en_US:en" LC_ALL="en_US.UTF-8"保…

在jmx中查询快递

在万维易源中点击全国快递物流查询,输入相应数据打开jmx,新建线程组,http请求,在其中输入与万维易源中相对应同等信息的数据新建监听器中查看结果数,得出数据

2025年靠谱的加热器厂家最新权威推荐排行榜

2025年靠谱的加热器厂家最新权威推荐排行榜行业背景与市场趋势随着全球工业化和城市化进程的加速,加热器作为工业生产、建筑供暖和家用电器中的核心部件,市场需求持续增长。据《2024-2029年全球电加热器市场研究报告…

2025年皮带称厂家权威榜单:转子秤/螺旋秤/称重给料机源头厂家精选

在工业计量领域,精准高效的物料计量不仅是生产成本控制的关键,更是提升整体生产效率的核心支柱。 在工业自动化与智能化高速发展的当下,电子皮带秤作为物料连续计量的核心设备,其精准度与稳定性直接影响企业生产效…

2025年热门的灰铁铸件热门厂家推荐榜单

2025年热门的灰铁铸件热门厂家推荐榜单行业背景与市场趋势灰铁铸件作为机械制造行业的基础材料,在机床、汽车、工程机械等领域具有广泛应用。根据中国铸造协会最新发布的《2024-2025年中国铸造行业发展报告》,2024年…

JMeter查询快递

https://route.showapi.com/2650-3?appKey={your_appKey}分成三部分 服务器名称或ip:route.showapi.com 路径:/2650-3?appKey={your_appKey} your appkey需查询出来 下方添加必要参数查看结果树 保存 运行