HttpComponentsClientHttpRequestFactory

HttpComponentsClientHttpRequestFactory

文章目录

  • HttpComponentsClientHttpRequestFactory
    • 介绍
    • **配置 PoolingHttpClientConnectionManager 时,可以使用如下的方法来设置最大连接数:**
    • **defaultMaxPerRoute**
    • 示例
    • RestTemplate的负载均衡策略是什么,怎么修改他的负载均衡策略
      • 使用 Spring Cloud Netflix Ribbon
      • 使用 Spring Cloud Load Balancer

介绍

HttpComponentsClientHttpRequestFactory 是 Spring Framework 中用来封装 Apache HttpComponents HttpClient 的一个工厂类,用于创建基于 HttpClient 的 ClientHttpRequest 实例。然而,关于默认的最大连接数,这个信息通常是由底层使用的 Apache HttpClient 的配置决定的,而不是由 HttpComponentsClientHttpRequestFactory 类本身直接设定。

Apache HttpClient 默认的最大连接数(即最大并发连接数)通常取决于所使用的 HttpClient 版本以及具体的连接管理器(Connection Manager)实现。在 HttpClient 4.x 及以上版本中,最常用的连接管理器是 PoolingHttpClientConnectionManager。

对于 PoolingHttpClientConnectionManager,其默认的最大连接数取决于具体的实现版本和配置方式,但通常情况下,如果没有显式配置,其默认的最大连接数可能是以下情况之一:

  1. 200个并发连接:在某些版本或默认配置下,PoolingHttpClientConnectionManager 的默认最大连接数可能设为 200。这是 HttpClient 在没有明确限制时可能采用的一个常见值。
  2. 每个路由默认为2个并发连接:如果没有为整个连接池指定总的并发连接数,PoolingHttpClientConnectionManager 可能会根据每个路由(route)来设置默认并发连接数。每个路由通常对应一个特定的主机名加端口组合。默认情况下,每个路由可能允许最多2个并发连接。
  3. 未明确指定时的行为:随着 HttpClient 版本的更新和优化,其默认行为可能会有所变化。在一些版本中,如果没有显式配置最大连接数,实际的最大连接数可能会被设置为一个相对保守的值,或者依赖于底层操作系统对并发连接的限制。

实际

  • defaultMaxPerRouter=5
  • maxTotal=10

配置 PoolingHttpClientConnectionManager 时,可以使用如下的方法来设置最大连接数:

PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
connectionManager.setMaxTotal(maxTotalConnections); // 设置整个连接池的最大并发连接数
connectionManager.setDefaultMaxPerRoute(defaultMaxPerRoute); // 设置每个路由的默认最大并发连接数
// ... 其他配置项CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(connectionManager).build();HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient);

其中,maxTotalConnections 和 defaultMaxPerRoute 应替换为你希望设置的具体数值。这样,你就能够精确地控制HttpComponentsClientHttpRequestFactory 使用的 HttpClient 实例的最大连接数了。

defaultMaxPerRoute

defaultMaxPerRoute 是 Apache HttpClient 的 PoolingHttpClientConnectionManager 类中的一个重要参数,用于控制对同一路由(route)的最大并发连接数。在理解 defaultMaxPerRoute 的含义和作用时,我们需要先了解以下几个关键概念:

1.路由(Route)

在 HttpClient 的上下文中,路由(route)是指一个特定的网络路径,通常由以下三个要素组成:

  • Scheme(协议):例如 http 或 https。
  • Host(主机名):例如 www.example.com。
  • Port(端口号):例如 80 或 443。

一个路由可以简单理解为一个特定的服务器地址,用于标识网络请求的目标。不同的路由之间即使指向同一个主机名,但如果协议或端口号不同,也会被视为独立的路由。

2.最大并发连接数(Max Per Route)

最大并发连接数(Max Per Route),即 defaultMaxPerRoute,定义了 HttpClient 对于任何一个特定路由(如 http://www.example.com:80)允许同时打开的最大 HTTP 连接数量。这个限制有助于防止过度消耗目标服务器资源,尤其是在进行大量并发请求时。

3.defaultMaxPerRoute 的作用

  • 限制对单个主机的并发请求

    设置 defaultMaxPerRoute 可以限制对单一主机(或同一路由)的同时活跃连接数,从而避免因短时间内发起过多请求导致目标服务器过载,或者触发其反爬虫机制。这对于遵守服务提供商的使用协议,以及维持良好的网络礼仪非常重要
    
  • 平衡资源分配

    在多主机或多路由的场景下,defaultMaxPerRoute 可以帮助平衡各个路由之间的资源分配。例如,如果你的应用需要向多个不同的网站发送请求,defaultMaxPerRoute 可以确保不会因为某个网站的请求过多而占用所有可用的连接,从而影响到其他网站的请求处理。
    
  • 配合全局最大连接数

    defaultMaxPerRoute 通常与 PoolingHttpClientConnectionManager 的另一个参数 maxTotal(整个连接池的最大并发连接数)一起使用。maxTotal 设定了整个 HttpClient 实例允许的最大并发连接总数,而 defaultMaxPerRoute 则细化到每个路由。这两个参数共同约束了 HttpClient 的连接管理策略
    
  • 配置 defaultMaxPerRoute

    在创建 PoolingHttpClientConnectionManager 实例时,可以通过 setDefaultMaxPerRoute() 方法来设置 defaultMaxPerRoute 的值。例如:

PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
connectionManager.setDefaultMaxPerRoute(5); // 设置每个路由的最大并发连接数为5// 或者针对特定路由单独设置
HttpRoute specificRoute = new HttpRoute(new HttpHost("www.example.com", 80, "http"));
connectionManager.setMaxPerRoute(specificRoute, 10); // 为特定路由设置最大并发连接数为10// 其他配置...

在这个例子中,我们设置了默认情况下每个路由的最大并发连接数为 5。这意味着,对于任何未经特殊配置的路由(如 http://www.example.com:80),同时最多只能有 5 个活跃的 HTTP 连接。如果需要为特定路由单独设置最大并发连接数,可以使用 setMaxPerRoute() 方法,如示例中的 specificRoute。

总结来说,defaultMaxPerRoute 是 Apache HttpClient 中 PoolingHttpClientConnectionManager 的一个关键配置项,用于控制对每个路由的最大并发连接数,旨在保护目标服务器资源、平衡请求分布,并与全局最大连接数配合,共同实现高效的连接管理。在实际使用 HttpClient 时,应根据应用需求和目标服务器的承受能力,合理设置 defaultMaxPerRoute 和 maxTotal 参数。

示例

以下是一个使用 Spring 的 RestTemplate 配合 HttpComponentsClientHttpRequestFactory 的使用案例。在这个例子中,我们将创建一个 RestTemplate 实例,将其配置为使用 HttpComponentsClientHttpRequestFactory,并设置 PoolingHttpClientConnectionManager 来控制并发连接数。然后,我们将使用这个配置好的 RestTemplate 发起一个简单的 GET 请求。

import org.apache.http.client.config.RequestConfig;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;public class RestTemplateExample {public static void main(String[] args) {// 创建并配置PoolingHttpClientConnectionManagerPoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();connectionManager.setMaxTotal(100); // 设置整个连接池的最大并发连接数connectionManager.setDefaultMaxPerRoute(20); // 设置每个路由的最大并发连接数// 创建并配置CloseableHttpClientRequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(3000) // 设置连接超时时间(毫秒).setSocketTimeout(5000) // 设置读取超时时间(毫秒).build();CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(connectionManager).setDefaultRequestConfig(requestConfig).build();// 创建HttpComponentsClientHttpRequestFactory并设置HttpClient实例HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient);// 创建并配置RestTemplateRestTemplate restTemplate = new RestTemplate(requestFactory);// 使用RestTemplate发起GET请求String url = "https://api.example.com/data";String response = restTemplate.getForObject(url, String.class);System.out.println("Response: " + response);}
}

在这个案例中:

  1. 我们首先创建了一个 PoolingHttpClientConnectionManager 实例,并设置了全局最大并发连接数(maxTotal)为 100,每个路由的最大并发连接数(defaultMaxPerRoute)为 20。
  2. 接下来,我们创建了一个 CloseableHttpClient 实例,为其配置了 PoolingHttpClientConnectionManager,并设置了请求的连接超时时间和读取超时时间。这些配置可以根据实际需求进行调整。
  3. 然后,我们创建了一个 HttpComponentsClientHttpRequestFactory 实例,并将之前配置好的 CloseableHttpClient 实例传递给它。这样,RestTemplate 将使用这个工厂来创建基于 HttpComponents 的 ClientHttpRequest 实例。
  4. 使用构造函数 new RestTemplate(requestFactory) 创建了一个 RestTemplate 实例,将其与已配置好的 HttpComponentsClientHttpRequestFactory 关联起来。
  5. 最后,我们使用 RestTemplate 发起了一个 GET 请求,请求的 URL 为 “https://api.example.com/data”,期望响应类型为 String。请求的结果存储在变量 response 中,并打印出来。

通过这样的配置,我们成功地将 RestTemplate 与 HttpComponentsClientHttpRequestFactory 结合起来,利用 HttpComponents 的强大功能(如连接池管理、超时控制等)来提升 HTTP 请求的性能和可靠性。你可以根据实际项目的需求,进一步调整 PoolingHttpClientConnectionManager、RequestConfig 和 RestTemplate 的相关配置。

RestTemplate的负载均衡策略是什么,怎么修改他的负载均衡策略

  • RestTemplate 本身并不直接支持负载均衡功能。它是一个简单的 HTTP 客户端工具,用于发送 HTTP 请求到指定的 URL,并接收响应。当您使用 RestTemplate 访问一个服务时,您通常会提供服务的完整 URL,这意味着每次请求都会直接定位到该 URL 指定的服务实例。
  • 如果您想要实现负载均衡,通常需要结合其他组件或框架,如 Spring Cloud Netflix 的 Ribbon 或 Spring Cloud Load Balancer。这些组件可以在 RestTemplate 之上提供客户端负载均衡能力,根据一定的策略从服务注册中心(如 Eureka)中选择一个可用的服务实例来转发请求。

以下是使用 Ribbon 或 Spring Cloud Load Balancer 修改 RestTemplate 负载均衡策略的说明:

使用 Spring Cloud Netflix Ribbon

1.添加依赖

确保您的项目已经包含了 Spring Cloud Netflix 的 spring-cloud-starter-netflix-ribbon 依赖。

2.配置 Ribbon

ribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule # 使用轮询策略

3.使用 RestTemplate 与 Ribbon 结合

在代码中,您可以通过注入 @LoadBalanced 注解的 RestTemplate 来启用客户端负载均衡:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;@SpringBootApplication
public class Application {@Bean@LoadBalancedpublic RestTemplate restTemplate() {return new RestTemplate();}public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}
// 在其他类中使用
@Service
public class SomeService {private final RestTemplate restTemplate;@Autowiredpublic SomeService(RestTemplate restTemplate) {this.restTemplate = restTemplate;}public String callService(String serviceName) {return restTemplate.getForObject("http://" + serviceName + "/endpoint", String.class);}
}

在上述代码中,RestTemplate 通过 @LoadBalanced 注解获得了客户端负载均衡能力。当调用 restTemplate.getForObject() 方法时,它会根据服务名(如 serviceName)从服务注册中心(如 Eureka)选择一个可用的服务实例进行请求。

4.更改负载均衡策略

要更改负载均衡策略,您可以自定义一个实现 com.netflix.loadbalancer.IRule 接口的类,并在配置文件中指定该类的全限定名作为 NFLoadBalancerRuleClassName 的值。例如,如果您实现了名为 MyCustomRule 的自定义策略,配置如下:

ribbon:NFLoadBalancerRuleClassName: com.example.MyCustomRule

使用 Spring Cloud Load Balancer

1.添加依赖

确保您的项目已经包含了 Spring Cloud Load Balancer 的 spring-cloud-starter-loadbalancer 依赖。

2.配置负载均衡器

在 Spring Boot 应用的配置文件中,可以配置 Spring Cloud Load Balancer 的相关属性,包括负载均衡策略。例如:

spring:cloud:loadbalancer:ribbon:enabled: false # 关闭Ribbon以使用Spring Cloud Load Balancer# 自定义负载均衡器# loadbalancer:#   default-lb-algorithm-class-name: com.example.MyCustomLoadBalancer# 针对特定服务的负载均衡器配置# service-id:#   lb-algorithm-type: ROUND_ROBIN # 使用轮询策略

3.使用 RestTemplate 与 Spring Cloud Load Balancer 结合

与使用 Ribbon 类似,您可以通过注入 @LoadBalanced 注解的 RestTemplate 来启用客户端负载均衡

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;@SpringBootApplication
public class Application {@Bean@LoadBalancedpublic RestTemplate restTemplate() {return new RestTemplate();}public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}
// 在其他类中使用
@Service
public class SomeService {private final RestTemplate restTemplate;@Autowiredpublic SomeService(RestTemplate restTemplate) {this.restTemplate = restTemplate;}public String callService(String serviceName) {return restTemplate.getForObject("http://" + serviceName + "/endpoint", String.class);}
}

4.更改负载均衡策略

Spring Cloud Load Balancer 提供了多种内置的负载均衡策略,可以通过配置 spring.cloud.loadbalancer.default-lb-algorithm-type 或 spring.cloud.loadbalancer.service-id.lb-algorithm-type 来选择。支持的策略包括但不限于:

  • ROUND_ROBIN:轮询
  • RANDOM:随机
  • WEIGHTED_RESPONSE_TIME:响应时间加权
  • LEAST_REQUEST:最少请求数

要使用自定义负载均衡策略,您需要实现 org.springframework.cloud.loadbalancer.core.ReactorLoadBalancer 或 org.springframework.cloud.loadbalancer.core.BlockingLoadBalancer 接口,并在配置中指定该类的全限定名。具体实现和配置方法请参考 Spring Cloud Load Balancer 的官方文档。

综上所述,RestTemplate 本身不具备负载均衡能力,需要结合 Ribbon 或 Spring Cloud Load Balancer 才能实现。通过配置相应的负载均衡策略,您可以控制服务实例的选择逻辑。如果您需要自定义策略,可以按照上述步骤实现

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

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

相关文章

字节面试:领域、子域、核心域、通用域和支撑域怎么划分?

领域驱动设计(DDD)里面有一堆专业术语,比如领域、子域、核心域、通用域、支撑域等等,听着是不是觉得挺吓人?别怕,我来带你轻松搞懂它们。 ​《Leetcode算法刷题宝典》一位阿里P8大佬总结的刷题笔记。 《大厂…

DAY13|239. 滑动窗口最大值、347.前K个高频元素

239. 滑动窗口最大值、347.前 K 个高频元素 239. 滑动窗口最大值347.前 K 个高频元素 239. 滑动窗口最大值 难度有些大啊… 其实队列没有必要维护窗口里的所有元素,只需要维护有可能成为窗口里最大值的元素就可以了,同时保证队列里的元素数值是由大到小…

基于U-Net的图像分割算法介绍

U-Net是一种用于图像分割的深度学习架构,其设计初衷是用于生物医学图像分割,尤其是医学影像中的细胞分割任务。U-Net结构独特,具有编码器-解码器结构,能够有效地捕捉图像中的局部和全局信息,并在像素级别上进行精确的分割。 相关论文: U-Net: Convolutional Networks for…

STM32 CAN的验收筛选器

STM32 CAN的验收筛选器 简介 CAN外设的验收筛选器,一共有28个筛选器组,每个筛选器组有2个寄存器, CAN1和CAN2共用的筛选器的。 在 CAN 协议中,消息的标识符与节点地址无关,但与消息内容有关。因此,发送节…

密码学基础 -- 走进RSA(2)(放弃数学原理版)

目录 1.概述 2. RSA测试 2.1 加解密实验 2.2 签名验签测试 3. RSA原理简介 4.小结 1.概述 从上面密码学基础 -- 走进RSA(1)(放弃数学原理版)-CSDN博客我们知道了非对称算法的密钥对使用时机,那么接下里我们继续讲解RSA,我们分别从RSA加解密、签名验…

阿里云消息队列升级全新品牌 ApsaraMQ丨阿里云云原生 3 月产品月报

云原生月度动态 云原生是企业数字创新的最短路径。 《阿里云云原生每月动态》,从趋势热点、产品新功能、服务客户、开源与开发者动态等方面,为企业提供数字化的路径与指南。 趋势热点 🥇 阿里云 ApsaraMQ 率先完成消息队列全系 Serverles…

科大讯飞星火开源大模型iFlytekSpark-13B GPU版部署方法

星火大模型的主页:iFlytekSpark-13B: 讯飞星火开源-13B(iFlytekSpark-13B)拥有130亿参数,新一代认知大模型,一经发布,众多科研院所和高校便期待科大讯飞能够开源。 为了让大家使用的更加方便,科…

leetcode-链表中间节点

876. 链表的中间结点 题目 给你单链表的头结点 head ,请你找出并返回链表的中间结点。 如果有两个中间结点,则返回第二个中间结点。 示例 1: 输入:head [1,2,3,4,5] 输出:[3,4,5] 解释:链表只有一个中间…

12.MySQL应用架构演变

MySQL应用架构演变 1.总览 单机单库主从架构分库分表云数据库 2.单机单库 介绍 一个简单的小型网站或者应用背后的架构可以非常简单,数据存储只需要一个MySQL Instance就能满足数据读取和写入需求(这里忽略掉了数据备份的实例)&#xff…

[pytorch基础操作] 矩阵batch乘法大全(dot,* 和 mm,bmm,@,matmul)

逐元素相乘torch.dot* 矩阵乘法torch.mmtorch.bmm 和 torch.matmul 逐元素相乘 逐元素相乘是指对应位置上的元素相乘,要求张量的形状相同。 torch.dot 按位相乘torch.dot:计算两个张量的点积(内积),只支持1D张量&am…

三款好用的 Docker 可视化管理工具

文章目录 1、Docker Desktop1.1、介绍1.2、下载地址1.3、在Windows上安装Docker桌面1.4、启动Docker Desktop1.5、Docker相关学习网址 2、Portainer2.1、介绍2.2、安装使用 3、Docker UI3.1、介绍3.2、安装使用3.2.1、常规方式安装3.2.2、通过容器安装 Docker提供了命令行工具&…

Linux运维面试

Linux面试题(运维人员必备技能) 1、现在给你三百台服务器,你怎么对他们进行管理? 管理3百台服务器的方式: 1)设定跳板机,使用统一账号登录,便于安全与登录的考量。 2)使…

【vue】购物车案例

change"fun"&#xff1a;元素值发生改变时&#xff0c;会触发事件fun <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale…

Qt创建基于应用程序的插件

应用程序插件 什么是插件插件的好处插件的种类应用程序插件创建应用程序的插件步骤:创建测试插件的应用程序步骤:应用程序插件示例开发环境创建示例生成插件运行结果总结什么是插件 插件是一种用于应用程序功能扩展和增强,且按照特定规范编写的应用程序接口的程序。 插件的…

linux 自定义快捷指令(docker

vi /root/.bashrc alias disdocker images alias dpsdocker ps --format "table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}" 保存退出后使用sourece /root/.bashrc 让其立即生效 sourece /root/.bashrc

Python学习笔记(37)——用xlwings库生成excel

老规矩先pip入xlwings库 STEP1:下载xlwings库 windowsr>>cmd>>pip install xlwings (如果需要不同版本可以到pypi上搜&#xff09; STEP2:完成EXCEL初级创建 请打开您的编写软件~~~~~&#xff08;小编的显示结果为PYCHARM编写的&#xff0c;因为颜色标注好看(…

【论文笔记】PointMamba: A Simple State Space Model for Point Cloud Analysis

原文链接&#xff1a;https://arxiv.org/abs/2402.10739 1. 引言 基于Transformer的点云分析方法有二次时空复杂度&#xff0c;一些方法通过限制感受野降低计算。这引出了一个问题&#xff1a;如何设计方法实现线性复杂度并有全局感受野。 状态空间模型&#xff08;SSM&…

进程控制(二)

文章目录 1. 进程程序替换1.1 替换原理1.2 替换函数1.2.1 execl函数1.2.2 execv函数1.2.3 execlp函数1.2.4 execvp函数1.2.5 临时总结1.2.6 execle函数2. 函数解释3.命名理解1. 进程程序替换 1.1 替换原理 用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代…

蓝桥杯 — — 纯质数

纯质数 题目&#xff1a; 思路&#xff1a; 一个最简单的思路就是枚举出所有的质数&#xff0c;然后再判断这个质数是否是一个纯质数。 枚举出所有的质数&#xff1a; 可以使用常规的暴力求解法&#xff0c;其时间复杂度为&#xff08; O ( N N ) O(N\sqrt{N}) O(NN ​)&…

SQL12 获取每个部门中当前员工薪水最高的相关信息

题目&#xff1a;获取每个部门中当前员工薪水最高的相关信息 注意了&#xff0c;这道题目&#xff0c;分组函数只能查出来&#xff1a;每个部门的最高薪水&#xff0c;group by dept_no &#xff0c;根据部门分组&#xff0c;绝对不能group by dept_no,emp_no&#xff0c;不能…