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
英文地址,請注明出處:http://en.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, …