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相关推荐

  1. 17、mybatis两个内置参数

    不只是方法传递过来的参数可以被用来判断,取值. mybatis默认还有两个内置参数, _parameter:代表整个参数 单个参数:_parameter就是这个参数 多个参数:参数会被封装为一个map ...

  2. 使用httpclient进行 Http get请求带参数cookie

    使用httpclient进行 Http get请求带参数cookie 常用的工具类,所有的包配置如下 <!--解析json使用--><dependency><groupI ...

  3. python函数里面,一个*是可变参数的元祖,两个*是可变参数的字典

    python的函数中,有时会有类似*args,**keys这样的参数,代表的是可变参数,一个*表示元祖,两个*表示字典,就是说这个函数可以接受任何类型的参数,都不会报错,有些函数为了提高可用性,会加这 ...

  4. 有关机械手臂控制中的两个重要输入参数

    1.在机械手臂中有两个重要参数.一个是编码器的值,另外一个是马达的电流值.根据这两个可以获得机械手臂的运动学,动力学的一些数据. 第一重要特征参数 是DH参数,另外一个就是每个轴的质心参数.

  5. java参数类型不同_java – 两种不同的参数类型(将Object强制转换为Type)

    我想调用一个方法,但参数可以是Button或ImageButton.我用不同的参数类型作为对象调用该方法两次. 在我的方法attributesOfButton中,我想分配相应的按钮类型,如下面的代码所 ...

  6. 图解法求最优解的例题_初一上学期,方程的解互为相反数,两种方法求解参数的值...

    在一元一次方程问题中,有一类问题,那就是方程的解互为相反数.在处理这类问题时,一般有两种方法进行处理,不同的题目可以选择不同的方法.当然,两种方法都需要掌握. 例题1:已知关于x的方程6x-a=1+4 ...

  7. js两个问号代表什么_js中的Object.assign接受两个函数为参数的时候会发生什么?...

    缘由 今天看到一段代码 return Object.assign(func1, func2); 心生疑惑,为什么 Object.assign 的参数可以是函数? 于是有了下面这一堆东西,其实都是老生常 ...

  8. 深度学习中的tf.nn.softmax(logits, axis=1)以及tf.argmax(prob, axis=1)两个函数的参数以及用法

    参考了下面的两个链接: softmax: https://blog.csdn.net/q2519008/article/details/107086024?utm_medium=distribute. ...

  9. PID实践笔记-PID浅解及两轮直立车参数调试经验

    写在前面: 好快啊做车生涯就这么结束了,虽然无缘厦门但也没有遗憾了,大公主在预赛和决赛中都跑的不错,最后写这篇文章就当画上一个完美的句号吧,目的也在于总结一下大半年以来调车的玄学经历和解决方案,同时也 ...

最新文章

  1. margin负值 – 一个秘密武器
  2. c语言乘法口诀倒三角,乘法口诀表,C语言实现
  3. Linux ps指令
  4. 二十八、接了一单Python北京空气质量数据处理
  5. base64链接转为地址php,php将图片链接转换为base64编码文件流
  6. 2018-2019-2 20165221 【网络对抗技术】-- Exp9 Web安全基础
  7. MTK 驱动开发(24)---camera模块的制作
  8. 博科SAN交换机zone配置(华为SNS系列交换机为例OEM博科)
  9. PoolTogether本周Loot Box奖金组合中新增加入ESSAY代币
  10. Java开发笔记(五十)几种开放性修饰符
  11. 【Linux】Another app is currently holding the yum lock; waiting for it to exit...
  12. 如何让自己的email地址永久有效
  13. 使用iBatis和ObjectDataSource轻松实现分页
  14. MySQL客户端工具的选择
  15. 2021SC@SDUSC sm2算法原理(1)
  16. c语言实现顺序表(详细代码)
  17. 链表-双向循环链表【C语言】
  18. mac mysql dmg_在mac下使用DMG安装Mysql
  19. navicat 解析sql_Navicat使用详解
  20. 5G+VR慢直播,带来沉浸式VR直播体验

热门文章

  1. 银行管理系统(使用SQL Server)-Python快速编程入门(第2版)-人民邮电出版社-阶段案例
  2. 数据分析前景怎么样?好不好?
  3. SylixOS x86 HPET 定时器驱动
  4. UnityShader 图片像素化风格渲染
  5. 波士顿犯罪数据时空分析及可视化
  6. 2010年水瓶座的运势
  7. css表格文字位置调整,word表格中的文字距离表格四周太远,怎么才能调的近一些,除了调字大小。...
  8. RuntimeError: Trying to backward through the graph a second time (or directly access saved tensors a
  9. 关于Windows系统问题
  10. Unity游戏开发客户端面经——lua(初级)