Vert.x 配置 IPv6 DNS 初始化失败,检查端口拆分
Vert.x 5.1.7把DNS服务器字符串最后一个冒号当端口分隔符,裸IPv6可能被截错。明确传入该解析器需要的完整地址和端口,再核对真实DNS端点与查询。
给 Vert.x 的 AddressResolverOptions 设置 IPv6 DNS 地址后,解析器在初始化时就失败,甚至出现 NumberFormatException 或地址格式异常。先检查配置的是 DNS 服务器地址,不是待解析域名;裸 IPv6 中的最后一个冒号可能被当成端口分隔符。
Vert.x 5.1.7 的 DNS provider 仍采用这条解析路径。它查找最后一个 :,把前半段当 IP,后半段交给 Integer.parseInt()。因此“不写端口就用53”的规则,在带多个冒号的裸 IPv6 上不能按 IPv4 的经验理解。
先看初始化失败的位置
例如把 2001:4860:4860::8888 直接传给 addServer(),解析器会尝试把最后的 8888 当端口,剩下的 2001:4860:4860: 又不是原本的 IPv6 地址。末段含非十进制字符时,还可能更早在端口转换处报 NumberFormatException。
这条路径没有成功建立预期的 DNS 服务器端点。增加域名查询超时、刷新 A/AAAA 缓存,或把业务目标域名换成 IP,都不会修正这个配置解析步骤。
在已核对的旧解析器中明确写出端口
对上述采用“最后一个冒号分端口”的实现,可以把真正的端口追加在完整 IPv6 后面。以下是 Java 配置片段,类型来自 io.vertx.core 与 io.vertx.core.dns:
AddressResolverOptions resolver = new AddressResolverOptions()
.addServer("2001:4860:4860::8888:53");
Vertx vertx = Vertx.vertx(new VertxOptions()
.setAddressResolverOptions(resolver));
在这条解析规则下,最后的 53 被拆成端口,前面的 2001:4860:4860::8888 保持为完整服务器地址。这是传给该版本 addServer() 的字符串形状,不是要求把 DNS 服务器本身改成另一个 IPv6,也不是可复制到任意 URL 配置中的通用格式。
地址仅用于展示语法。实际程序应保留组织允许使用的 DNS 服务器、端口和网络策略,不要把私有域名查询转发到未经批准的公共解析器。若地址由平台注入,核对最终传入 Java API 的字符串,避免配置层已经追加一次端口,应用又追加第二次。
另一个选择是让程序继续使用既有系统 DNS 配置,但只有系统解析路径符合应用要求时才适用。不要单纯为了绕过地址解析关闭所需的解析功能,或顺便更改 IP 地址族偏好。
升级和验收要检查实际端点
其他 Vert.x 版本的解析实现可能不同,不能只看到“支持 IPv6”就认定裸地址与带端口地址都按预期接受;升级后重新核对该版本的 API 输入规则和实际行为,保留原来的配置值便于回退。
验证顺序是解析器能初始化、最终 DNS 端点的完整 IPv6 和端口正确,再在受控域名上确认查询成功。初始化通过不代表该 IPv6 路由一定可达,也不证明服务器能解析内部域名。若后续才出现查询超时,再检查网络与服务器响应,而不是继续改地址字符串。


