Java:使用spring-cloud-gateway的应用报DnsNameResolverTimeoutException原因和解决方法

使用spring-cloud-gateway时,有时会报DnsNameResolverTimeoutException异常。堆栈信息类似:

Caused by: java.net.UnknownHostException: Failed to resolve 'cloudconnector.linkup-sage.com'at io.netty.resolver.dns.DnsResolveContext.finishResolve(DnsResolveContext.java:1047)at io.netty.resolver.dns.DnsResolveContext.tryToFinishResolve(DnsResolveContext.java:1000)at io.netty.resolver.dns.DnsResolveContext.query(DnsResolveContext.java:418)at io.netty.resolver.dns.DnsResolveContext.access$600(DnsResolveContext.java:66)at io.netty.resolver.dns.DnsResolveContext$2.operationComplete(DnsResolveContext.java:467)at io.netty.util.concurrent.DefaultPromise.notifyListener0(DefaultPromise.java:578)at io.netty.util.concurrent.DefaultPromise.notifyListeners0(DefaultPromise.java:571)at io.netty.util.concurrent.DefaultPromise.notifyListenersNow(DefaultPromise.java:550)at io.netty.util.concurrent.DefaultPromise.notifyListeners(DefaultPromise.java:491)at io.netty.util.concurrent.DefaultPromise.setValue0(DefaultPromise.java:616)at io.netty.util.concurrent.DefaultPromise.setFailure0(DefaultPromise.java:609)at io.netty.util.concurrent.DefaultPromise.tryFailure(DefaultPromise.java:117)at io.netty.resolver.dns.DnsQueryContext.tryFailure(DnsQueryContext.java:256)at io.netty.resolver.dns.DnsQueryContext$4.run(DnsQueryContext.java:208)at io.netty.util.concurrent.PromiseTask.runTask(PromiseTask.java:98)at io.netty.util.concurrent.ScheduledFutureTask.run(ScheduledFutureTask.java:153)at io.netty.util.concurrent.AbstractEventExecutor.runTask(AbstractEventExecutor.java:174)at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:167)at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:470)at io.netty.channel.epoll.EpollEventLoop.run(EpollEventLoop.java:406)at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997)at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)at java.lang.Thread.run(Thread.java:833)
Caused by: io.netty.resolver.dns.DnsNameResolverTimeoutException: [/10.43.0.10:53] query '42865' via UDP timed out after 5000 milliseconds (no stack trace available)

比如当前使用spring-cloud-starter-gateway

		<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId><version>3.1.3</version></dependency>

若使用的spring-boot-starter-webflux的版本

		<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId><version>2.7.0</version></dependency>

则其中包含netty-resolver-dns的版本如下,报错信息就是从这个组件产生的。

		<dependency><groupId>io.netty</groupId><artifactId>io.netty.resolver.dns</artifactId><version>4.1.77.Final</version></dependency>

下面分析一下使用spring-cloud-gateway的应用,在启动过程中执行的主要代码

首先,在应用启动时,会先查找DNS服务器的地址:

io.netty.resolver.dns.DefaultDnsServerAddressStreamProvider

创建http连接时,会先从/etc/resolv.conf中获取到nameserver、search domain、ndots、timeout、attempts等参数的值,用于创建解析器

io.netty.resolver.dns.DnsNameResolver

然后,创建连接池并获取连接

reactor.netty.resources.PooledConnectionProvider

获取连接,若连接不存在,则要解析域名并建立连接

reactor.netty.transport.TransportConnector

解析域名时会先查hosts文件,如果没查到,则从nameServer中查找

io.netty.resolver.dns.DnsNameResolver

从nameServer中查找时,查看searchDomain是否存在,或ndts是否为0,或域名后是否带点。如果是,则直接查域名;如果不是,则在域名后拼上domain再查

io.netty.resolver.dns.DnsResolveContext

实际的DNS查询,以及对结果的处理也是在这里做的

通过上面的代码,我们可以推测是出DnsNameResolverTimeoutException异常的几种原因,以及相对应的解决方法:

1、DNS查询一般是UDP的,UDP不可靠,容易timeout,可以把超时时间设置长一点。

2、如果查找到的domain较多,域名会拼上这些domain查询,可能多数情况下这种查询是没有意义的,不但浪费带宽,还会增加DNS服务器的压力,从而提高了DNS查询失败的概率。

3、如果域名对应的IP地址不变,可以直接配置到hosts文件中,这样就免去了DNS查询的过程。

4、DNS查询不但可以使用UDP,也可以使用TCP,可以在UDP查询失败后,采用TCP进行补查,这样可大大提高DNS查询成功概率,但前提是DNS服务器要开启TCP查询,同时io.netty.resolver.dns还要升级到4.1.105.Final或以上版本。

5、也可以将dns缓存的TTL设置大一点,这样可以减少DNS查询次数,缺点就是一旦域名对应的IP发生变化,客户端可能由于更新不及时造成调用失败。

以上解决方法都可以通过配置实现,下面提供一个例子:

import java.time.Duration;import org.springframework.cloud.gateway.config.HttpClientCustomizer;
import org.springframework.context.annotation.Bean;import reactor.netty.http.client.HttpClient;public class AppCfg {@Beanpublic HttpClientCustomizer httpClientCustomizer() {return new HttpClientCustomizer() {@Overridepublic HttpClient customize(HttpClient httpClient) {HttpClient newHttpClient = httpClient.resolver(spec -> {spec.queryTimeout(Duration.ofSeconds(10));spec.ndots(0);spec.retryTcpOnTimeout(true); // 需要io.netty.resolver.dns-4.1.105.Final或以上版本spec.cacheMaxTimeToLive(Duration.ofSeconds(100));});return newHttpClient;}};}
}

其它可以配置的参数可以在如下类中查到:

reactor.netty.transport.NameResolverProvider.NameResolverSpec

应用可以根据自身实际情况,配置上述配置或实现相应的接口,就能缓解甚至就解决DnsNameResolverTimeoutException异常的发生(之所以大多数据情况下只能缓解,是因为DNS查询一般是UDP的,存在丢包的可能性,不能保证UDP查询一定能成功)。

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

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

相关文章

SpringCloud概述

目录 一、概念 1.1 微服务架构 1.2 SpringCloud概念 1.3 核心价值 1.4 能力边界 1.5 微服务总体架构图 二、生态圈 2.1 不同生态圈组件对比 2.2 组件介绍 2.2.1 服务发现与注册 2.2.2 配置管理 2.2.3 API网关 2.2.4 容错与熔断 2.2.5 客户端负载均衡 2.2.6 服务…

光伏电站环境监测仪—专为光伏电站设计的气象监测设备

光伏电站环境监测仪是专为光伏电站设计的气象监测设备&#xff0c;通过实时采集关键环境参数&#xff0c;为光伏系统的发电效率评估、运维决策和安全预警提供数据支撑。监测参数太阳辐射采用高精度总辐射表&#xff0c;测量水平面总辐射和倾斜面辐射&#xff0c;精度达 2% 以内…

Node.js ≥ 18 安装教程

Windows 安装 下载安装包&#xff1a;访问 Node.js官网&#xff0c;下载最新的 LTS 版本&#xff08;确保版本 ≥ 18&#xff09;运行安装程序&#xff1a;双击下载的安装文件&#xff0c;按照向导完成安装验证安装&#xff1a;打开命令提示符或PowerShell&#xff0c;输入以下…

电脑 hdmi 没有声音问题解决

问题现象&#xff1a;电脑耳机声音正常输出&#xff0c;使用hdmi连接电视后&#xff0c;没有声音输出。&#xff08;正常会通过hdmi 在电视上播放视频和声音&#xff09;解决方案:出现该情况很可能原因是 显卡的驱动不对。网上找了各种方法都没有解决&#xff0c;最后系统升级后…

学习日记-XML-day55-9.14

1.xml基本介绍知识点核心内容重点XML定义可扩展标记语言&#xff0c;用于数据存储和传输与HTML的区别&#xff08;HTML用于展示&#xff0c;XML用于结构化数据&#xff09;XML用途1. 配置文件&#xff08;Spring的beans.xml、Tomcat的server.xml&#xff09;;2. 数据交换&#…

【系统架构设计(27)】信息安全技术集成

文章目录一、本文知识覆盖范围二、信息安全基础要素详解1、机密性保障技术2、完整性验证技术3、可用性保障技术4、可控性管理技术5、可审查性追溯技术三、网络安全威胁与防护策略1、非授权访问防护2、拒绝服务攻击防护3、恶意软件传播防护四、加密技术体系与应用1、对称加密技术…

什么是 SaaS 安全?

什么是 SaaS 安全&#xff1f; SaaS 安全专注于保护云中的数据、应用程序和用户身份。它旨在应对基于云的软件所面临的挑战&#xff0c;以确保信息的安全性和可用性。SaaS 安全致力于降低未授权访问、数据泄露等风险&#xff0c;同时增强 SaaS 应用程序的安全性。 SaaS 安全不仅…

mysql和postgresql如何选择

h5打开以查看 简单来说&#xff1a; MySQL&#xff1a;更像是一个“快速、可靠的工匠”&#xff0c;注重速度、简单和稳定性&#xff0c;尤其在读操作密集的Web应用中是经典选择。 PostgreSQL&#xff1a;更像是一个“功能强大的学者”&#xff0c;追求功能的完备性、标准的符…

Redis最佳实践——安全与稳定性保障之数据持久化详解

Redis 在电商应用的安全与稳定性保障之数据持久化全面详解一、持久化机制深度解析 1. 持久化策略矩阵策略触发方式数据完整性恢复速度适用场景RDB定时快照分钟级快容灾备份/快速恢复AOF实时追加日志秒级慢金融交易/订单关键操作混合模式RDBAOF同时启用秒级中等高安全要求场景无…

Data Augmentation数据增强

目录 数据增强是什么 为什么数据增强 数组增强分类 有监督数据增强 无监督数据增强 数据增强是什么 数据增强又称数据扩增&#xff0c;是一种通过应用合理且随机的变换&#xff08;例如图像位移、旋转&#xff09;来增加训练集多样性的技术。让有限的数据产生等价于更多数…

OpenCV:特征提取

目录 一、特征提取核心概念&#xff1a;什么是图像特征&#xff1f; 二、实战 1&#xff1a;Harris 角点检测 1.1 角点的物理意义 1.2 Harris 算法原理 1.3 OpenCV 实战代码与解析 1.4 结果分析 三、实战 2&#xff1a;SIFT 特征提取 3.1 SIFT 算法核心优势 3.2 SIFT…

MySQL的查找加速器——索引

文章目录 目录 前言 一、基础概念&#xff1a;什么是 MySQL 索引&#xff1f; 二、底层数据结构&#xff1a;为什么 InnoDB 偏爱 B 树&#xff1f; B 树的结构特点&#xff08;以短链接表short_link的short_code索引为例&#xff09;&#xff1a; B 树的优势&#xff1a…

【Vue2手录11】Vue脚手架(@vue_cli)详解(环境搭建+项目开发示例)

一、前言&#xff1a;为什么需要 Vue 脚手架&#xff1f; 手动搭建 Vue 项目存在诸多痛点&#xff08;原笔记提及&#xff09;&#xff1a; 依赖管理复杂&#xff1a;需手动下载 Vue、Babel、Webpack 等工具&#xff0c;处理版本兼容性。配置繁琐&#xff1a;Webpack 配置、E…

自签发、CA机构签发、SSH、SCP、RSYNC,SUDO详解

一、为什么&#xff1f; 1. 自建CA为什么比Lets Encrypt强&#xff1f; 不能把CA放公网&#xff01;Lets Encrypt是给公网服务用的&#xff08;比如10.0.0.30的Web服务&#xff09;&#xff0c;但内网服务&#xff08;比如OpenVPN&#xff09;必须用自签CA。 CA私钥必须物理隔…

【Python】Python解决阿里云DataWorks导出数据1万条限制的问题

【Python】Python解决阿里云DataWorks导出数据1万条限制的问题一、前言二、脚本功能概述三、核心代码解析**1. 环境配置与安全设置****2. 用户配置区****3. 数据清洗函数****4. 核心逻辑**四、完整代码演示五、总结一、前言 在日常数据分析工作中&#xff0c;团队经常需要从阿…

计算机网络(一)基础概念

本篇文章为计算机网络相关知识点整理及扩展 基于B站计算机网络课程&#xff1a;https://www.bilibili.com/video/BV1p69tYZEvN/?spm_id_from333.1007.top_right_bar_window_history.content.click 如有错误&#xff0c;还望大家不吝指正 URL&#xff08;统一资源定位符&…

Git的工作区域和文件结构

Git的工作区域和文件结构 1. Git的工作区域2. Git的文件结构 打开.git文件&#xff0c;.git的文件结构如下&#xff1a; objects 存放已经提交的文件&#xff0c;也就是使用 git commit 进行操作后的文件。 index 存放已暂存的文件&#xff0c;也就是使用了 git add 进行操作后…

前端开发易错易忽略的 HTML 的 lang 属性

前言本文主要记录&#xff1a;前端开发中&#xff0c;一个本人错了好几年&#xff0c;看似无关紧要的小错误&#xff1a;HTML 的 lang 属性设置。正文HTML 的 lang 属性在HTML中&#xff0c;lang属性用于指定文档的语言。这对于搜索引擎优化&#xff08;SEO&#xff09;、屏幕阅…

【GD32】 GPIO 超详细总结 (江科大风格课件版)

GD32 GPIO 超详细总结 (江科大风格课件版)第一部分&#xff1a;GPIO 是什么&#xff1f; 名称&#xff1a;GPIO General Purpose Input/Output (通用输入输出口)作用&#xff1a;MCU与外部世界交互的桥梁。通过程序控制引脚输出高、低电平&#xff0c;或者读取引脚的电平状态。…

《嵌入式硬件(八):基于IMX6ULL的点灯操作》

一、IMX6ULL启动代码.global _start_start:ldr pc, _reset_handlerldr pc, _undefine_handlerldr pc, _svc_handlerldr pc, _prefetch_abort_handlerldr pc, _data_abort_handlerldr pc, _reserved_handlerldr pc, _irq_handlerldr pc, _fiq_handler_undefine_handler:ldr pc, …