httpclient基础知识

681 阅读2分钟

本文的目的是梳理http请求流程,以及httpclient框架的http请求的封装。 参考:https://juejin.cn/post/6844903464045117453?utm_medium=fe&utm_source=weixinqun&from=timeline https://yq.aliyun.com/articles/93801?spm=a2c4e.11153940.blogcont294.12.648bdd298ZEUyC http://blog.csdn.net/zjysource/article/details/52945494

1.各种客户端都可以发起http请求,如浏览器,也可以通过java等客户端语言去模拟。
2.TCP/IP 是传输层协议,http协议是其之上的 应用层 协议,更偏重于实现。

3.封装httpclient对象+请求对象(get/post)后,执行请求逻辑。同时hc也提供了几种请求体,例如StringEntity, ByteArrayEntity, InputStreamEntity, FileEntity. 

    3.1 InternalHttpClient://请求的链路执行chain,
        HttpRoute route1 = this.determineRoute(target, httpException, localcontext);
        return this.execChain.execute(route1, httpException, localcontext, execAware);

4.hc接口概览

    4.1 hc接口代表了http请求执行的核心协议,用户提供请求对象交给htc执行,hc负责把请求对象传递给服务器,然后返回响应对象,或者抛出异常。
    4.2 hc作为facde,把具体实现的细节交给了handlers和strategies,
        以及execchain。
    4.3 hc实例是线程安全的,鼓励hc实例的重用,对于不再使用的CloseableHttpClient,要关闭。

调优方向 了解了架构原理后,就可以着手在3个方向进行调优:

  1. 连接数,通过设立全局最大连接数和单route连接数,增加吞吐能力。用户可通过HttpClientBuilder#maxConnTotal和#maxConnPerRoute分别设置。
  2. 获取连接的超时时间,调小超时时间能够有效提高响应速度并且降低积压请求量,但相应的也会增加请求失败的几率。用户可以通过RequestConfig的connectionRequestTimeout进行设置。
  3. 建立连接和route响应的超时时间,调小能够有效的降低bad request对连接的占用,留给质量更好的请求,有效提高系统提高吞吐能力及响应速度。否则有可能在峰值期被慢请求占满连接池,导致系统瘫痪。两者分别可通过RequestConfig#connectionTimeout和socketTimeout进行设置。
  4. 开启BackoffStrategyExec,对状况差的route进行降级处理,将连接让给其他route。