Spring RestTemplate配置DNS解析超时

RestTemplate 常用的超时设置方法可以设置连接超时、接口请求超时、接口响应超时,但是对于DNS解析超时往往没有简单的方法可以设置。本文介绍设置DNS解析超时时间的方法,具体的代码参照 示例项目 https://github.com/qihaiyan/springcamp/tree/master/spring-rest-template-log

一、概述

在spring中使用RestTemplate调用远程接口时往往需要设置超时时间,否则当对方接口过慢时,很容易把自己系统堵死。连接超时、发送请求超时、接收响应超时都有直接的方法可以进行调用设置,设置DNS解析超时需要通过相对复杂的方法进行处理。

二、自定义 CustomDnsResolver

首先RestTemplate配置使用apache httpclient进行http接口调用,apache httpclient内部通过默认的DnsResolver进行DNS解析,我们可以通过自己实现DnsResolver方法来设置DNS解析超时时间。

以下代码为自定义 CustomDnsResolver 实现 DnsResolver。

public static class CustomDnsResolver implements DnsResolver {private final DnsResolver systemDnsResolver;private final Integer connectTimeout;public CustomDnsResolver(Integer connectTimeout) {this.systemDnsResolver = SystemDefaultDnsResolver.INSTANCE;this.connectTimeout = connectTimeout;}@Overridepublic InetAddress[] resolve(final String host) {try {return CompletableFuture.supplyAsync(() -> {try {return systemDnsResolver.resolve(host);} catch (UnknownHostException e) {throw new RuntimeException(e);}}).get(connectTimeout, TimeUnit.SECONDS);} catch (InterruptedException | ExecutionException | TimeoutException e) {throw new RuntimeException(e);}}@Overridepublic String resolveCanonicalHostname(String host) throws UnknownHostException {return systemDnsResolver.resolveCanonicalHostname(host);}}

DNS解析的方法为resolve,我们resolve方法中通过CompletableFuture.supplyAsync调用系统的DNS解析方法,然后通过CompletableFuture.get方法进行超时控制。

三、配置apache httpclient使用自定义的CustomDnsResolver

PoolingHttpClientConnectionManager常用的构造方法只有一个Registry参数,该方法无法指定自定义 DnsResolver ,所以我们需要改用支持指定DnsResolver的构造方法。

    PoolingHttpClientConnectionManager poolingConnectionManager = new PoolingHttpClientConnectionManager(registry,PoolConcurrencyPolicy.STRICT,PoolReusePolicy.LIFO,TimeValue.NEG_ONE_MILLISECOND,null,new CustomDnsResolver(2),null);

构造方法的第6个参数就是DnsResolver,我们在初始化DnsResolver类时指定了超时时间为2,单位为秒。更灵活的方式应该是将该超时时间参数放到配置文件中。

通过自定义的CustomDnsResolver类,同时在PoolingHttpClientConnectionManager构造方法中传入CustomDnsResolver对象,就能够对DNS解析超时进行控制。

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

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

相关文章

2-15 基于matlab的蚁群,模拟退火,遗传,神经网络,禁忌搜索等智能优化算法对TSP问题

基于matlab的蚁群,模拟退火,遗传,神经网络,禁忌搜索等智能优化算法对TSP问题。五种优化算法对多个城市路径进行规划,通过优化速度、距离可比较五种方法的优劣。程序已调通,可直接运行。 2-15 蚁群优化算法 …

智能屏幕人体雷达感应开关模块,飞睿智能低功耗毫米波雷达技术,让冰箱更节能

在智能家居日益普及的今天,各种创新技术层出不穷,极大地提升了人们的生活品质。其中,人体雷达感应开关模块作为一种创新的传感器技术,正在逐步改变我们对家电设备的传统认知。本文将深入探讨飞睿智能人体雷达感应开关中的毫米波雷…

qml自定义组件

不管是component还是分文件编写的一个自定义组件,遵循如下: a:不管哪一级的子对象 都可以直接调根节点下的方法和属性 b:不管哪一级的子对象 调用非根节点的方法和属性,前面要加上该节点的id,即id.方法()或id.属性的形式 import QtQuick 2.…

使用插件和微调优化 GPT 模型

文章目录 LLM 用例和示例产品警惕 AI 幻觉:限制与考虑使⽤插件和微调优化 GPT 模型 OpenAI 在其网站上展示了许多激励人心的客户故事,我们需要了解这些模型如何改变我们的社会并为商业和创造力开辟新机遇。正如你将看到的,许多企业已经开始使…

web学习笔记(六十七)项目总结

目录 1.使用弹性布局来实现元素水平垂直居中 2. 实现vant组件样式穿透 3.通过请求返回的数据动态设置类名 4.设置元素溢出隐藏为省略号 5. z-index的使用 6.利用弹性布局实现横向滚动 7.盒子内的两个元素无法实现底部对齐 8.如何设置文本显示两行,且在第二行结…

JSON.parse(JSON.stringify())导致的响应式属性丢失

console.log("formdata赋值前", this.formdata);console.log("row",row);console.log("row序列化后", JSON.parse(JSON.stringify(row)));this.formdata JSON.parse(JSON.stringify(row)); console.log("formdata赋值后", this.formd…

加密的记事本app哪个好用 记事本哪款好用能上锁

随着科技的进步,越来越多的人开始倾向于使用记事本app来记录生活中的点点滴滴。相较于传统的纸质记事本,这些app不仅记录内容丰富,而且安全性更高。其中,敬业签就是一款备受好评的记事本软件。 敬业签以其强大的功能和出色的安全…

【C++进阶之路】C++11——正则表达式

序言 正则表达式,简而言之就是用来匹配指定模式字符串的工具,在计算机的世界中,它发挥着很大的作用,比如编译器的词法分析,注册时验证密码的复杂度,爬虫爬取固定格式的数据时等场景都要用到。那么本篇的目的…

【SpringCloud-Seata源码分析3】

文章目录 事务的提交客户端提交流程服务端提交流程客户端删除undo_log 事务回滚客户端事务回滚服务端回滚事务 事务的提交 前面两篇我们分析了seata的TC初始化和TM,RM初始化,并且事务准备阶段源码及业务Sql执行,下面我们分析事务的提交源码。 客户端提…

数据库 触发器、游标应用

1. 利用SQL Server Management Studio创建一个存储过程ProcNum,查询每个班级中学生的人数,按班级号升序排序。 答案: create procedure procnumasbeginselect classid, count(*) as 学生人数from studentgroup by classidorder by class…

《昇思 25 天学习打卡营第 5天 | 网络构建 》

《昇思 25 天学习打卡营第 5天 | 网络构建 》 活动地址:https://xihe.mindspore.cn/events/mindspore-training-camp 签名:Sam9029 网络构建 概念: 神经网络模型是由神经网络层和 Tensor 操作构成的,mindspore.nn 提供了常见神经…

如何应对 Android 面试官 -> MVVM 实战一个新闻客户端 (中)

前言 本章我们基于重构的方式进行一个 MVVM 的实战,我们将一个新闻列表的普通实现,一步一步的改造成 MVVM 的架构模式,一共分为上中下三个章节,本章继续上一章,开始中篇的讲解; 控件化 我们本章向控件化进…

区块链行业DDOS防护痛点在哪

区块链行业DDOS防护痛点在哪?随着区块链技术的迅猛发展,其应用场景已经从最初的数字货币扩展到了金融、供应链、物联网等多个领域。然而,随着区块链行业的快速崛起,其所面临的网络安全威胁也日益严重,尤其是DDoS(分布…

2024年华东杯B题数学建模论文:基于车辆运动学转弯模型的自动驾驶规划问题

摘要 随着自动驾驶技术的发展,车辆转弯问题成为关键挑战。本文针对自动驾驶车辆在转弯过程中的数学建模、路径规划及避障策略进行了深入研究,旨在提升自动驾驶车辆的行驶安全性与效率。 针对问题1,对于四轮前轮驱动车辆的转弯问题&#xff0c…

【C++LeetCode】【热题100】两数相加【中等】-不同效率的题解【1】

题目: 暴力方法: /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, ListNo…

网络编程(九)本地通信(UNIX域套接字)

文章目录 一、概念二、本地通信使用的结构体三、TCP本地通信四、UDP本地通信 一、概念 二、本地通信使用的结构体 注: 三、TCP本地通信 服务器: 创建套接字 socket( ) 填充服务器本地信息结构体 sockaddr_un 将套接字与服务器本地信息结构体绑定 bin…

常见硬件工程师面试题(二)

大家好,我是山羊君Goat。 对于硬件工程师,学习的东西主要和电路硬件相关,所以在硬件工程师的面试中,对于经验是十分看重的,像PCB设计,电路设计原理,模拟电路,数字电路等等相关的知识…

ps基础入门

1.基础 1.1新建文件 1.2创建指定形状 1.4移动工具 1.41移动画布中的任意元素 1.42移动画布 1.43修改画布大小 1.44修改图像大小 1.5框选工具 1.6矩形工具 1.7图层 1.71图层颜色修改 1.72…

Spring事务介绍、Spring集成MyBatis

目录 1.Spring的事务1.1 什么是事务?1.2 事务的特性(ACID)1.3 Spring 事务实现方式有哪些?1.4 Spring事务管理接口介绍1.4.1 PlatformTransactionManager:事务管理接口1.4.2 TransactionDefinition:事务属性事务管理器接口1.4.3 T…

《昇思25天学习打卡营第1天|ghqt》

参与这个类活动,我会坚持完成它的。目前MindSpore文档里面的内容还看的不是很懂,希望自己在能不断进步。 第一天学到的内容—— 昇腾应用使能:华为各大产品线基于MindSpore提供的AI平台或服务能力MindSpore:支持端、边、云独立的…