news 2026/2/19 23:29:58

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
一次由 DNS 反解析引发的 SpringBoot 启动卡顿问题

TL;DR

使用 114 DNS 时,反解析内网 IP 无响应,导致 SpringBoot 启动时 Liquibase 初始化阻塞约 30 秒

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: RUNNABLE

at 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> {

@Override

public 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 反解析获取的 IP

hostName = localHost.getHostName();

if (hostName.equals(localHost.getHostAddress())) {

//sometimes the external IP interface doesn't have a hostname associated with it but localhost always does

InetAddress 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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/18 20:34:15

5分钟掌握GitHub入门教程优化:从零基础到高效协作

5分钟掌握GitHub入门教程优化&#xff1a;从零基础到高效协作 【免费下载链接】introduction-to-github Get started using GitHub in less than an hour. 项目地址: https://gitcode.com/GitHub_Trending/in/introduction-to-github 想要快速掌握GitHub的使用技巧&…

作者头像 李华
网站建设 2026/2/18 4:11:42

快速上手:Color Thief智能配色方案实战指南

快速上手&#xff1a;Color Thief智能配色方案实战指南 【免费下载链接】color-thief Grab the color palette from an image using just Javascript. Works in the browser and in Node. 项目地址: https://gitcode.com/gh_mirrors/co/color-thief 面对品牌视觉统一和网…

作者头像 李华
网站建设 2026/2/7 11:53:03

A16z 谈 AI 留存的「水晶鞋效应」:第一个月,决定了一切 都是一次认真“试鞋”的机会:这一次,能不能真的解决我手里的问题?

A16z 谈 AI 留存的「水晶鞋效应」&#xff1a;第一个月&#xff0c;决定了一切 原创 Cubo Group 矩阵魔方AI出海 2025年12月12日 19:45 陕西 在传统 SaaS 时代&#xff0c;有一条几乎没人怀疑的共识&#xff1a;产品早期留存差&#xff0c;是正常现象。 MVP 功能不全&#…

作者头像 李华
网站建设 2026/2/12 13:40:57

5、深入了解 Ubuntu 网络配置与 X Window 系统

深入了解 Ubuntu 网络配置与 X Window 系统 1. Ubuntu 无线网络配置 在过去,为 Linux 系统配置无线网络是一件非常繁琐的事情,需要执行许多复杂的步骤才能连接到无线网络。不过,现在情况有了很大的改善。Ubuntu 系统中包含了一个名为 Network Manager 的实用工具,它让连接…

作者头像 李华
网站建设 2026/2/5 4:51:46

分享几则中年夫妻关系的有益建议

著名演员何晴去世了&#xff0c;很震惊&#xff0c;她是我最喜欢的女演员&#xff0c;曾经出演过四大名著。分享几则中年夫妻关系的有益建议&#xff1a; 1、可以容忍对方的生活习惯。包括拉S放P、不叠被、不洗衣&#xff0c;但要管好自己&#xff0c;还是尽量别过份坦荡。 2、…

作者头像 李华
网站建设 2026/2/7 5:58:21

(108页PPT)园区大数据治理解决方案(附下载方式)

篇幅所限&#xff0c;本文只提供部分资料内容&#xff0c;完整资料请看下面链接 &#xff08;108页PPT&#xff09;园区大数据治理解决方案.pptx_智慧园区总体规划PPT资源-CSDN下载 资料解读&#xff1a;《园区大数据治理解决方案》 详细资料请看本解读文章的最后内容。 在数…

作者头像 李华