httpclient的两个重要的参数maxPerRoute及MaxTotal
httpclient封装了java中进行http网络请求的底层实现,是一个被广泛使用的组件。
httpclient是支持池化机制的,这两个参数就是表示池化设置的。
服务之间发送http请求常用的有Apache的Fluent以及spring的restTemplate等
Apache的Fluent,以及spring的restTemplate都是对httpclient进行了封装
以Apache的Fluent为例说明
其Executor类
/*** An Executor for fluent requests* <p/>* A {@link PoolingHttpClientConnectionManager} with maximum 100 connections per route and* a total maximum of 200 connections is used internally.*/
最大100 connections per route 以及 最大200个 connection
CONNMGR = new PoolingHttpClientConnectionManager(sfr);CONNMGR.setDefaultMaxPerRoute(100);CONNMGR.setMaxTotal(200);CLIENT = HttpClientBuilder.create().setConnectionManager(CONNMGR).build();
其代码中是写死的
这两个参数的含义是什么呢?
下面用测试代码说明一下
测试端
public class HttpFluentUtil {private Logger logger = LoggerFactory.getLogger(HttpFluentUtil.class);private final static int MaxPerRoute = 2;private final static int MaxTotal = 4;final static PoolingHttpClientConnectionManager CONNMGR;final static HttpClient CLIENT;final static Executor EXECUTOR;static {LayeredConnectionSocketFactory ssl = null;try {ssl = SSLConnectionSocketFactory.getSystemSocketFactory();} catch (final SSLInitializationException ex) {final SSLContext sslcontext;try {sslcontext = SSLContext.getInstance(SSLConnectionSocketFactory.TLS);sslcontext.init(null, null, null);ssl = new SSLConnectionSocketFactory(sslcontext);} catch (final SecurityException ignore) {} catch (final KeyManagementException ignore) {} catch (final NoSuchAlgorithmException ignore) {}}final Registry<ConnectionSocketFactory> sfr = RegistryBuilder.<ConnectionSocketFactory>create().register("http", PlainConnectionSocketFactory.getSocketFactory()).register("https", ssl != null ? ssl : SSLConnectionSocketFactory.getSocketFactory()).build();CONNMGR = new PoolingHttpClientConnectionManager(sfr);CONNMGR.setDefaultMaxPerRoute(MaxPerRoute);CONNMGR.setMaxTotal(MaxTotal);CLIENT = HttpClientBuilder.create().setConnectionManager(CONNMGR).build();EXECUTOR = Executor.newInstance(CLIENT);}public static String Get(String uri, int connectTimeout, int socketTimeout) throws IOException {return EXECUTOR.execute(Request.Get(uri).connectTimeout(connectTimeout).socketTimeout(socketTimeout)).returnContent().asString();}public static String Post(String uri, StringEntity stringEntity, int connectTimeout, int socketTimeout)throws IOException {return EXECUTOR.execute(Request.Post(uri).socketTimeout(socketTimeout).addHeader("Content-Type", "application/json").body(stringEntity)).returnContent().asString();}public static void main(String[] args) {HttpUtil httpUtil = new HttpUtil();String url = "http://localhost:9064/app/test"; // 服务端sleep 5秒再返回for (int i = 0; i < 5; i++) { // MaxPerRoute若设置为2,则5线程分3组返回(2、2、1),共15秒new Thread(new Runnable() {@Overridepublic void run() {try {String result = HttpFluentUtil.Get(url, 2000, 2000);System.out.println(result);} catch (IOException e) {e.printStackTrace();}}}).start();}}}
服务器端
很简单的springmvc
@GetMapping(value="test")public String test() throws InterruptedException {Thread.sleep(1000);return "1";}
测试1:测试端MaxPerRoute=5 MaxTotal=4
服务器端结果
可以看到先接收4个请求,处理完成后,再接收下一次剩余的1个请求。即其一次最多接收MaxTotal次请求
测试2:测试端MaxPerRoute=2 MaxTotal=5
服务器端结果
可以看到接收2个请求,2个请求,1个请求,即说明maxPerRoute意思是某一个服务每次能并行接收的请求数量
什么场景下要设置?
知道了两个参数的含义,那么在什么情况下要对这两个参数进行设置呢?
比如说下面的场景
服务1要通过Fluent调用服务2的接口。服务1发送了400个请求,但由于Fluent默认只支持maxPerRoute=100,MaxTotal=200,比如接口执行时间为500ms,由于maxPerRoute=100,所以要分为100,100,100,100分四批来执行,全部执行完成需要2000ms。而如果maxPerRoute设置为400,全部执行完需要500ms。在这种情况下(提供并发能力时)就要对这两个参数进行设置了。
设置的方法
Apache Fluent可以使用上面测试的HttpFluentUtil工具类来执行请求
RestTemplate类似使用下面的方式
@Beanpublic HttpClient httpClient() {Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create().register("http", PlainConnectionSocketFactory.getSocketFactory()).register("https", SSLConnectionSocketFactory.getSocketFactory()).build();PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(registry);connectionManager.setMaxTotal(restTemplateProperties.getMaxTotal());connectionManager.setDefaultMaxPerRoute(restTemplateProperties.getDefaultMaxPerRoute());connectionManager.setValidateAfterInactivity(restTemplateProperties.getValidateAfterInactivity());RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(restTemplateProperties.getSocketTimeout()).setConnectTimeout(restTemplateProperties.getConnectTimeout()).setConnectionRequestTimeout(restTemplateProperties.getConnectionRequestTimeout()).build();return HttpClientBuilder.create().setDefaultRequestConfig(requestConfig).setConnectionManager(connectionManager).build();}
@Beanpublic ClientHttpRequestFactory httpRequestFactory() {return new HttpComponentsClientHttpRequestFactory(httpClient());}
@Beanpublic RestTemplate restTemplate() {return new RestTemplate(httpRequestFactory());}
其中RestTemplateProperties通过配置文件来配置
max-total
default-max-per-route
connect-timeout 获取连接超时
connection-request-timeout 请求超时
socket-timeout 读超时
httpclient的两个重要的参数maxPerRoute及MaxTotal相关推荐
- 17、mybatis两个内置参数
不只是方法传递过来的参数可以被用来判断,取值. mybatis默认还有两个内置参数, _parameter:代表整个参数 单个参数:_parameter就是这个参数 多个参数:参数会被封装为一个map ...
- 使用httpclient进行 Http get请求带参数cookie
使用httpclient进行 Http get请求带参数cookie 常用的工具类,所有的包配置如下 <!--解析json使用--><dependency><groupI ...
- python函数里面,一个*是可变参数的元祖,两个*是可变参数的字典
python的函数中,有时会有类似*args,**keys这样的参数,代表的是可变参数,一个*表示元祖,两个*表示字典,就是说这个函数可以接受任何类型的参数,都不会报错,有些函数为了提高可用性,会加这 ...
- 有关机械手臂控制中的两个重要输入参数
1.在机械手臂中有两个重要参数.一个是编码器的值,另外一个是马达的电流值.根据这两个可以获得机械手臂的运动学,动力学的一些数据. 第一重要特征参数 是DH参数,另外一个就是每个轴的质心参数.
- java参数类型不同_java – 两种不同的参数类型(将Object强制转换为Type)
我想调用一个方法,但参数可以是Button或ImageButton.我用不同的参数类型作为对象调用该方法两次. 在我的方法attributesOfButton中,我想分配相应的按钮类型,如下面的代码所 ...
- 图解法求最优解的例题_初一上学期,方程的解互为相反数,两种方法求解参数的值...
在一元一次方程问题中,有一类问题,那就是方程的解互为相反数.在处理这类问题时,一般有两种方法进行处理,不同的题目可以选择不同的方法.当然,两种方法都需要掌握. 例题1:已知关于x的方程6x-a=1+4 ...
- js两个问号代表什么_js中的Object.assign接受两个函数为参数的时候会发生什么?...
缘由 今天看到一段代码 return Object.assign(func1, func2); 心生疑惑,为什么 Object.assign 的参数可以是函数? 于是有了下面这一堆东西,其实都是老生常 ...
- 深度学习中的tf.nn.softmax(logits, axis=1)以及tf.argmax(prob, axis=1)两个函数的参数以及用法
参考了下面的两个链接: softmax: https://blog.csdn.net/q2519008/article/details/107086024?utm_medium=distribute. ...
- PID实践笔记-PID浅解及两轮直立车参数调试经验
写在前面: 好快啊做车生涯就这么结束了,虽然无缘厦门但也没有遗憾了,大公主在预赛和决赛中都跑的不错,最后写这篇文章就当画上一个完美的句号吧,目的也在于总结一下大半年以来调车的玄学经历和解决方案,同时也 ...
最新文章
- margin负值 – 一个秘密武器
- c语言乘法口诀倒三角,乘法口诀表,C语言实现
- Linux ps指令
- 二十八、接了一单Python北京空气质量数据处理
- base64链接转为地址php,php将图片链接转换为base64编码文件流
- 2018-2019-2 20165221 【网络对抗技术】-- Exp9 Web安全基础
- MTK 驱动开发(24)---camera模块的制作
- 博科SAN交换机zone配置(华为SNS系列交换机为例OEM博科)
- PoolTogether本周Loot Box奖金组合中新增加入ESSAY代币
- Java开发笔记(五十)几种开放性修饰符
- 【Linux】Another app is currently holding the yum lock; waiting for it to exit...
- 如何让自己的email地址永久有效
- 使用iBatis和ObjectDataSource轻松实现分页
- MySQL客户端工具的选择
- 2021SC@SDUSC sm2算法原理(1)
- c语言实现顺序表(详细代码)
- 链表-双向循环链表【C语言】
- mac mysql dmg_在mac下使用DMG安装Mysql
- navicat 解析sql_Navicat使用详解
- 5G+VR慢直播,带来沉浸式VR直播体验
热门文章
- 银行管理系统(使用SQL Server)-Python快速编程入门(第2版)-人民邮电出版社-阶段案例
- 数据分析前景怎么样?好不好?
- SylixOS x86 HPET 定时器驱动
- UnityShader 图片像素化风格渲染
- 波士顿犯罪数据时空分析及可视化
- 2010年水瓶座的运势
- css表格文字位置调整,word表格中的文字距离表格四周太远,怎么才能调的近一些,除了调字大小。...
- RuntimeError: Trying to backward through the graph a second time (or directly access saved tensors a
- 关于Windows系统问题
- Unity游戏开发客户端面经——lua(初级)