httpclient哪家好?

目录

基本的配置

可选种类

可选使用方式


我球docs直接粘过来,我就不用写两份了,哈哈哈
https://github.com/singgel

基本的配置

  • 连接池
    因为目前 HTTP 1.1 不支持多路复用,只有 HTTP Pipeline 这用半复用的模型支持。所以,在需要频繁发送消息的场景中,连接池使必须支持的,以减少频繁建立连接所带来的不必要的性能损耗。
  • 超时时间设置(连接超时、读取超时等)
    当对端出现问题的时候,长时间的,甚至是无限的超时等待是绝对不能接受的。所以必须必须能够设置超时时间。
  • 是否支持异步
    HTTP 相关技术(服务器端和客户端)通常被人认为是性能低下的一个重要原因在于,在很长一段时间里,HTTP 的相关实现缺乏对异步的支持。这不仅指非阻塞 IO,也包括异步的编程模型。缺乏异步编程模型的后果就是,即便 HTTP 协议栈是基于非阻塞 IO 实现的,调用客户端的或者在服务端处理消息的线程有大量时间被浪费在了等待 IO 上面。所以,异步是非常重要的特性。
  • 请求和响应的编解码
    通常,开发人员希望面向对象使用各种服务(这里面自然也包括基于 HTTP 协议的服务),而不是直接面对原始的消息和响应开发。所以,透明地将 HTTP 请求和响应进行编解码是十分有必要,因为这可以很大程度地降低开发人员的工作量。
  • 域名解析控制
    因为调用量会比较大,因此希望在域名解析这一层做一个调用端可控的负载均衡,同时可以对每个服务器 IP 进行失败率统计和健康度检查。
  • 可扩展性
    不论一个框架设计的多好,总有一些特殊场景是它们无法原生支持的。这时可扩展性的好坏便体现出来了。

可选种类

在 Java 社区中,HTTP Client 主要有

  • JDK 的 HttpURLConnection
    java自带标准库,使用 HttpURLConnection 发起 HTTP 请求最大的优点是不需要引入额外的依赖,但是使用起来非常繁琐,也缺乏连接池管理、域名机械控制等特性支持。使用 HttpURLConnection 发起 HTTP 请求是比较原始(low level)的,基本上你可以理解为它就是对网络栈传输层(HTTP 一般为 TCP,HTTP over QUIC 是 UDP)进行了一次浅层次的封装,操作原语就是在打开的连接上面写请求 request 与读响应 response. 而且 HttpURLConnection 无法支持 HTTP/2. 显然,官方是知道这些问题的,因此在 Java 9 中,官方在标准库中引入了一个 high level、支持 HTTP/2 的 HttpClient.封装的最大特点是链式调用非常顺滑,支持连接管理等特性。但是这个库只能在 Java 9 及以后的版本使用,Java 9 和 Java 10 并不是 LTS 维护版本,而接下来的 Java 11 LTS 要在2018.09.25发布,应用到线上还需要等待一段时间。因此,虽然挺喜欢这个自带标准库(毕竟可以不引入三方依赖),但当前是无法在生产环境使用的。
  • Apache Commons HttpClient(或被称为 Apache HttpClient 3.x)
    请自觉升级。
  • Apache HttpComponents Client(或被称为 Apache HttpClient 4.x)
    Apache HttpComponents HttpClient 的前身是 Apache Commons HttpClient, 但是 Apache Commons HttpClient 已经停止开发,如果你还在使用它,请切换到 Apache HttpComponents HttpClient 上来。基本上,在 Java 原生标准库不给力的情况下,Apache HttpComponents HttpClient 是最佳的 HTTP Client library 选择。但这个库当前还不支持 HTTP/2,支持 HTTP/2 的版本还处于 beta 阶段(2018.09.23),因此并不适合用于 Android APP 中使用。
  • Square 公司开源的 OkHttp
    OkHttp支持HTTP2, 而 HTTP/2 对于移动客户端而言,无论是从握手延迟、响应延迟,还是资源开销看都有相当吸引力。因此这就给了高层次封装且支持 HTTP/2 的 http client lib 足够的生存空间。其中最典型的要数OkHttp.OkHttp 接口设计友好,支持 HTTP/2,并且在弱网和无网环境下有自动检测和恢复机制,因此,是当前 Android APP 开发中使用最广泛的 HTTP clilent lib 之一。另一方面,OkHttp 提供的接口与 Java 9 中 HttpClint 接口比较类似 (严格讲,应该是 Java 9 借鉴了 OkHttp 等开源库的接口设计?),因此,对于喜欢减少依赖,钟情于原生标准库的开发者来说,在 Java 11 中,从 OkHttp 切换到标准库是相对容易的。因此,以 OkHttp 为代表的 http 库以后的使用场景可能会被蚕食一部分。

可选使用方式

除了这几个纯粹的 HTTP Client 类库以外,还有

这些框架和类库主要是针对 Web Service 场景,尤其是 RESTful Web Service。它们往往是基于前面提到的 HTTP Client 实现,并在其基础上提供了消息转换、参数映射等对于 Web Service 来说十分必要的功能。

发布了212 篇原创文章 · 获赞 68 · 访问量 36万+

猜你喜欢

转载自blog.csdn.net/singgel/article/details/102703336