关于httpClient 使用的注意事项

关于httpClient 使用的注意事项

用例
        PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
        // 最大连接数-不设置默认20
        connectionManager.setMaxTotal(200);
        // 每个路由最大连接数-不设置默认2
        connectionManager.setDefaultMaxPerRoute(100);
        CloseableHttpClient httpClient = HttpClients.custom().setDefaultRequestConfig(
                        RequestConfig.custom()
                                // 连接服务器(握手)的超时时间
                                .setConnectTimeout(3000)
                                // 被请求服务器响应(response)的超时时间
                                .setSocketTimeout(5000)
                                // 从连接池中获取连接的超时时间
                                .setConnectionRequestTimeout(3000)
                                .build()
                ).setConnectionManager(connectionManager)
                .build();
三个连接超时时间
  1. connectionRequestTimeout:从连接池中获取连接的超时时间,超过该时间未拿到可用连接,会抛出ConnectionPoolTimeoutException: Timeout waiting for connection from pool
  2. connectTimeout:连接上服务器(握手成功)的时间,超出该时间抛出connect timeout
  3. socketTimeout:服务器返回数据(response)的时间,超过该时间抛出read timeout
连接池的大小

如果使用默认配置,连接池大小默认为20,即假设被请求接口响应时间为200ms,我们的程序每秒只能完成100个请求响应,剩余的则会陷入等待从连接池获取连接。则在某些高并发的场景中容易出现问题。

路由的大小

DefaultMaxPerRoute 是什么?

可以理解为 IP+端口的一条通路

例如连接池大小(MaxTotal)设置为300,路由连接数设置为200(DefaultMaxPerRoute),对于www.a.com与www.b.com两个路由每个路由的连接数不能超过200来说,两个路由的总连接数不能超过300。

关于setDefaultMaxPerRoute测试
// 服务端测试接口
@RestController
@RequestMapping("/test")
public class TestController {
    @RequestMapping("doTest")
    public Object test(){
        LockSupport.parkNanos(TimeUnit.SECONDS.toNanos(3));
        return "ok";
    }

    @RequestMapping("doTest1")
    public Object tes1t(){
        LockSupport.parkNanos(TimeUnit.SECONDS.toNanos(3));
        return "ok";
    }
}


// 客户端测试方法
public class ATest {

    public static Logger log = LoggerFactory.getLogger(ATest.class);
    public static void main(String[] args) {

        PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
        // 最大连接数-不设置默认20
        connectionManager.setMaxTotal(2);
        // 每个路由最大连接数-不设置默认2
        connectionManager.setDefaultMaxPerRoute(1);
        CloseableHttpClient httpClient = HttpClients.custom().setDefaultRequestConfig(
                        RequestConfig.custom()
                                // 连接服务器(握手)的超时时间
                                .setConnectTimeout(3000)
                                // 被请求服务器响应(response)的超时时间
                                .setSocketTimeout(50000)
                                // 从连接池中获取连接的超时时间
                                .setConnectionRequestTimeout(50000)
                                .build()
                ).setConnectionManager(connectionManager)
                .build();
        new Thread(()->{
            doGet(httpClient,"http://localhost:8080/test/doTest");
        }).start();
        new Thread(()->{
            doGet(httpClient,"http://localhost:8080/test/doTest1");
        }).start();

    }

    private static void doGet(CloseableHttpClient httpClient,String url) {
        HttpGet httpGet = new HttpGet(url);
        try {
            log.info("start");
            CloseableHttpResponse response = httpClient.execute(httpGet);
            log.info("message={}", EntityUtils.toString(response.getEntity()));
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

结果

在这里插入图片描述

配置setDefaultMaxPerRoute value为1 ,即同一个ip+端口只能存在一个连接,服务端模拟请求耗时3s,thread-0在请求3s后完成获得响应,并且我们可以看到thread-1实际是在等待thread-0完成请求释放连接后才开始请求,在请求6s后才获得响应

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深度解析Java中的ReadWriteLock:高效处理并发读写操作

第1章:引言 大家好,我是小黑,今天咱们聊聊读写锁。当多个线程同时对同一数据进行读写操作时,如果没有合理的管理,那数据就乱套了。就好比小黑在写日记,突然来了一帮朋友,大家都想往日记本上写点…

linux 网络基础配置

将Linux主机接入到网络,需要配置网络相关设置一般包括如下内容: 主机名 iP/netmask (ip地址,网关) 路由:默认网关 网络连接状态 DNS服务器 (主DNS服务器 次DNS服务器 第三个DNS服务器) 一、…

工作每天都在用的 DNS 协议,你真的了解么?

我们经常访问一些网址的时候,浏览器里输入类似于 www.baidu.com 这样的地址,那么在浏览器里输入这个地址---> 百度服务器给我们返回这个百度的页面,中间的过程是什么样的呢? 带着这个问题,我们一起来解析一下其中的…

java通过HttpClient方式实现https请求的工具类(绕过证书验证)

目录 一、引入依赖包二、HttpClient方式实现的https请求工具类三、测试类 一、引入依赖包 引入相关依赖包 <!--lombok用于简化实体类开发--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><option…

C++内存管理机制(侯捷)笔记2

C内存管理机制&#xff08;侯捷&#xff09; 本文是学习笔记&#xff0c;仅供个人学习使用。如有侵权&#xff0c;请联系删除。 参考链接 Youtube: 侯捷-C内存管理机制 Github课程视频、PPT和源代码: https://github.com/ZachL1/Bilibili-plus 下面是第二讲allocator具体实…

React 18中新钩子 useDeferredValue 使用

React是一个流行的用于构建用户界面的JavaScript库,它不断发展以为开发人员提供优化性能的工具。 React 18中引入的此类工具之一是useDeferredValue钩子,它旨在通过优先渲染更新来提高应用程序的性能。 useDeferredValue钩子是什么? useDeferredValue钩子是React性能优化工…

【AI视野·今日Sound 声学论文速览 第四十四期】Tue, 9 Jan 2024

AI视野今日CS.Sound 声学论文速览 Tue, 9 Jan 2024 Totally 27 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Sound Papers DJCM: A Deep Joint Cascade Model for Singing Voice Separation and Vocal Pitch Estimation Authors Haojie Wei, Xueke Cao, Wenbo Xu…

PCIe进阶之Gen3 Physical Layer Transmit Logic(二)

1 文章概述 本文是接着上面一篇文章《Gen3 Physical Layer Transmit Logic(一)》继续对Gen3 Physical Layer Transmit Logic做进一步的解析,具体包含Byte Striping和Scrambling以及Serializer。 1.1 Byte Striping Gen3 x1 Ordered Set Construction如下所示: Ordered …

Vue入门五(Vue-CLI项目搭建|vue项目目录介绍|vue项目开发规范|es6导入导出语法)

文章目录 一、Vue-CLI 项目搭建介绍node环境搭建1) 下载与安装2&#xff09;测试是否安装成功 安装vue-cli安装vue脚手架 创建Vue项目1&#xff09;使用命令创建项目2&#xff09;使用图形化界面创建项目 二、vue项目目录介绍1.命令行运行vue项目2.Pycharm中运行项目3.目录结构…

k8s的策略

集群调度&#xff1a; Scheduler的调度算法&#xff1a; 预算策略 过滤出合适的节点 优先策略 选择部署的节点 NodeName&#xff1a;硬策略&#xff0c;不走调度策略&#xff0c;node1 nodeSelector&#xff1a;根据节点的标签选择&#xff0c;会走一个调度算法 只要是…

激活/注册navicat15

一、获取软件 链接&#xff1a;https://pan.baidu.com/s/1F_tiLuLvVFMEz8pDfIvDjw?pwdjjfj 提取码&#xff1a;jjfj 二、安装 安装的过程我就不放了&#xff0c;重点如下 安装完不要打开软件&#xff01; 安装完不要打开软件&#xff01; 安装完不要打开软件&#xff01;…

【阅读笔记】Chain of LoRA

一、论文信息 1 论文标题 Chain of LoRA: Efficient Fine-tuning of Language Models via Residual Learning 2 发表刊物 arXiv2023 3 作者团队 Department of Computer Science, Princeton University School of Computer Science and Engineering, Nanyang Technologic…

Unity获取系统语言

大家好&#xff0c;我是阿赵。   在使用Unity引擎做多语言的游戏时&#xff0c;很有可能需要根据用户的手机或者电脑的当前语言来设置游戏的默认语言。   Unity的API里面默认就有可以获取系统语言的方法&#xff1a; Application.systemLanguageUnity的API例子&#xff1a…

leetcode动态规划(零钱兑换II、组合总和 Ⅳ)

518.零钱兑换II 给定不同面额的硬币和一个总金额。写出函数来计算可以凑成总金额的硬币组合数。假设每一种面额的硬币有无限个。 示例 1: 输入: amount 5, coins [1, 2, 5] 输出: 4 解释: 有四种方式可以凑成总金额: 55 5221 52111 511111 示例 2: 输入: amount 3, coi…

R730服务器做了raid的硬盘,插在R720上面可以用吗?

环境 戴尔R720 戴尔R730 问题描述 R730服务器做了raid的硬盘&#xff0c;插在R720上面可以用吗&#xff1f; 解决方案 1.直接在 R730服务器做了raid的硬盘&#xff0c;卸下来在插在r720上面使用 &#xff0c;读不到硬盘 2.前往R730服务器上面&#xff0c;去清除RAID配置的…

数字化转型之路为何道阻且长?

数字化转型是企业在数字化时代下的整体转型&#xff0c;是一个系统、长期、艰巨的过程。其本质不仅仅是技术的升级&#xff0c;更多的是涉及业务流程&#xff0c;用数据来重构和升级企业的商业模式和运营模式。但为什么很多企业的数字化转型难以成功呢&#xff1f; 战略缺位&am…

Spring配置类以及扫描过程源码解析

书接上文 文章目录 一、 拾遗1. 回顾2. 源码分析 二、 配置类扫描源码分析1. 源码分析2. BeanDefinition覆盖问题3. full配置类和lite配置类的区别 一、 拾遗 1. 回顾 前面我们分析了Spring框架器启动过程要做的事情&#xff0c;着重分析了ApplicationContext的refresh方法。…

只有金蝶用户,才懂金蝶BI方案的含金量

资深金蝶系统用户都看得明明白白&#xff0c;金蝶系统侧重于企业资源的计划和管理&#xff0c;而当前企业数字化运营决策不仅需要高效合理的流程管理&#xff0c;更需要一套完善的数据分析方案&#xff08;金蝶BI方案&#xff09;&#xff0c;无缝对接金蝶系统&#xff0c;智能…

【Kafka-3.x-教程】-【五】Kafka-监控-Eagle

【Kafka-3.x-教程】专栏&#xff1a; 【Kafka-3.x-教程】-【一】Kafka 概述、Kafka 快速入门 【Kafka-3.x-教程】-【二】Kafka-生产者-Producer 【Kafka-3.x-教程】-【三】Kafka-Broker、Kafka-Kraft 【Kafka-3.x-教程】-【四】Kafka-消费者-Consumer 【Kafka-3.x-教程】-【五…

软件测试|Python如何将列表从大到小排序

简介 在编程中&#xff0c;对列表进行排序是一个常见的操作&#xff0c;有时候我们需要将列表按照从大到小的顺序进行排列。Python 提供了多种方法来实现这一目标。在本文中&#xff0c;我们将深入探讨几种将列表从大到小排序的方法&#xff0c;帮助您根据不同情况选择最合适的…