Java HTTP 组件库选型看这篇就够了

Java HTTP 组件库选型看这篇就够了

最近项目需要使用 Java 重度调用 HTTP API 接口,于是想着封装一个团队公用的 HTTP client lib. 这个库需要支持以下特性:

  1. 连接池管理,包括连接创建和超时、空闲连接数控制、每个 host 的连接数配置等。基本上,我们想要一个 go HTTP 标准库自带的连接池管理功能。
  2. 域名解析控制。因为调用量会比较大,因此希望在域名解析这一层做一个调用端可控的负载均衡,同时可以对每个服务器 IP 进行失败率统计和健康度检查。
  3. Form/JSON 调用支持良好。
  4. 支持同步和异步调用。

在 Java 生态中,虽然有数不清的 HTTP client lib 组件库,但是大体可以分为这三类:

  1. JDK 自带的 HttpURLConnection 标准库;
  2. Apache HttpComponents HttpClient, 以及基于该库的 wrapper, 如 Unirest.
  3. 非基于 Apache HttpComponents HttpClient, 大量重写应用层代码的 HTTP client 组件库,典型代表是 OkHttp.

HttpURLConnection

使用 HttpURLConnection 发起 HTTP 请求最大的优点是不需要引入额外的依赖,但是使用起来非常繁琐,也缺乏连接池管理、域名机械控制等特性支持。以发起一个 HTTP POST 请求为例:

可以看到,使用 HttpURLConnection 发起 HTTP 请求是比较原始(low level)的,基本上你可以理解为它就是对网络栈传输层(HTTP 一般为 TCP,HTTP over QUIC 是 UDP)进行了一次浅层次的封装,操作原语就是在打开的连接上面写请求 request 与读响应 response. 而且 HttpURLConnection 无法支持 HTTP/2. 显然,官方是知道这些问题的,因此在 Java 9 中,官方在标准库中引入了一个 high level、支持 HTTP/2 的 HttpClient. 这个库的接口封装就非常主流到位了,发起一个简单的 POST 请求:

封装的最大特点是链式调用非常顺滑,支持连接管理等特性。但是这个库只能在 Java 9 及以后的版本使用,Java 9 和 Java 10 并不是 LTS 维护版本,而接下来的 Java 11 LTS 要在2018.09.25发布,应用到线上还需要等待一段时间。因此,虽然挺喜欢这个自带标准库(毕竟可以不引入三方依赖),但当前是无法在生产环境使用的。

Apache HttpComponents HttpClient

Apache HttpComponents HttpClient 的前身是 Apache Commons HttpClient, 但是 Apache Commons HttpClient 已经停止开发,如果你还在使用它,请切换到 Apache HttpComponents HttpClient 上来。

Apache HttpComponents HttpClient 支持的特性非常丰富,完全覆盖我们的需求,使用起来也非常顺手:

对 Client 细致的配置和自定义支持也是非常到位的:

完整示例请参考 ClientConfiguration.

基本上,在 Java 原生标准库不给力的情况下,Apache HttpComponents HttpClient 是最佳的 HTTP Client library 选择。但这个库当前还不支持 HTTP/2,支持 HTTP/2 的版本还处于 beta 阶段(2018.09.23),因此并不适合用于 Android APP 中使用。

OkHttp

由于当前 Apache HttpComponents HttpClient 版本并不支持 HTTP/2, 而 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 库以后的使用场景可能会被蚕食一部分。

小结

  • HttpURLConnection 封装层次太低,并且支持特性太少,不建议在项目中使用。除非你的确不想引入第三方 HTTP 依赖(如减少包大小、目标环境不提供三方库支持等)。
  • Java 9 中引入的 HttpClient,封装层次和支持特性都不错。但是因为 Java 版本的原因,应用场景还十分有限,建议观望一段时间再考虑在线上使用。
  • 如果你不需要 HTTP/2特性,Apache HttpComponents HttpClient 是你的最佳选择,比如在服务器之间的 HTTP 调用。否则,请使用 OkHttp, 如 Android 开发。

扩展阅读

炎热焦灼的八月

显然,看到这个题目的时候,说明拖延症又犯了。

这个月天气炎热,个人也进入了一个相对焦灼的状态。从心里深刻的知道这不是一件坏事,只是当前面临的问题和挑战是需要去直面并迅速解决。

这个月最大的感慨是在「专注」上做得不够。导致很多事情都在上下文切换的过程中被肢解的支离破碎,完全没有了初心,当然离预期也就相去甚远了。

与之关联的另一个做得不好的点是「效率」。在思维体力上,自我感觉已经进入一个相对强韧的阶段,但是在解题效率上依然让自己常有隐忧。今天在路上,看了达里奥《原则》的个人生活部分。挺有启发的,他讲个人生活愿景的追求实现划分成5个阶段,每个阶段有给出了不同的原则。自我对照检查,我觉得自己在认清问题本质以及规划上面是存在严重问题的。导致问题主体识别出现偏差或错误,而规划上又没有达到完全开放大脑的状态,因此,无论是在视角高度还是做事深度上都深陷泥潭。

这个月尝试换一种心态和姿态与最爱的人相处。虽然依然做不到大脑完全开放的状态,但是意外的发现其实当我尝试这样去做的时候,至少我已经放下潜意识中的自我,不在用这种潜意识做一些理所当然的决定,然后筛选证据,去印证满足自己内心的欲望和幻想。妞儿给了自己机会让自己开了一个好头,期待自己后面的改变。

本月推荐的电影当然是《蚁人2》,因为这是这个月看过的唯一一部电影。适度的夸张而不荒谬,沉重的剧情总是用暖心的美式幽默裹挟,彩蛋中巧妙的与复联结合,这三点应该是本片让自己最喜欢的点。如果你还没去电影院,推荐你去看看。

本月推荐的书毫无疑问是《原则》。应该说这本书红黑的精装版本在很大程度上是可以让你在公共场所作为小资的装X读物的。但是,我觉得这本书的很多书评的确有点过誉这本书了。书的确不错,不过作者依然没有能够摆脱为了写一句话而堆砌一个章节的问题。并且,本质上,这其实就是大家口中最正宗的心灵鸡汤类读物。我并不反对心灵鸡汤,我只是很难理解为什么很多人总是向你表达自己不屑于心灵鸡汤读物的同时却认为《原则》是一本高大上的书。

就我个人而言,《原则》毫无疑问是一本让我受益匪浅的书。它让我自查出了很多自己以前认为理所当然的点,虽然我不一定完全同意其建议的原则和行事方式。但是,的确让我开始重新思考和认识一些事情。这与之前看到的陆奇给后辈的原则其实是相互呼应的:陆奇成功背后的故事:决定人生高度的,是这 7 条原则
。陆奇的给出的这些原则非常具体,但是做起来非常不易,摘录如下,以自勉:

  • 坚守价值观(坚持做对的事情)
  • 永远正能量
  • 高度自律
  • 每天学习
  • 把公司的事当成自己的事
  • 从我做起
  • 谦逊真诚

明天会认识很多优秀的新同学,带着小小的焦虑感,但一下能结识如此多有意思的灵魂,依然非常期待。

个税起征点调整到5000可能只是一针生理盐水

8月最后一个工作日,听闻我朝要将个税起征点调整至5000元人民币。本以为是一针兴奋剂,即使是短效的;仔细看了一下,却发现可能只是一针生理盐水。

中国修改个人所得税法的决定经十三届全国人大常委会第五次会议表决通过,起征点确定为每月5,000元人民币,新个税法于2019年1月1日起施行,2018年10月1日起施行最新起征点和税率。关于个税征收方面,央视新闻的这张图解释非常清楚:

变化1、3都是可以直接数字量化,这部分的确可以让大家立即尝到这次个税修改的甜头。而让大家想象空间很大的变化2因为缺乏具体实施的细则,这里不做任何揣测。

但是,这些变化其实不是什么国家发红包。这只是我国个税例行的周期性调整修改。之前两次调整分别是:2005年调整起征点到1600元;2011年,调整个税起征点至3500元。这次从3500调整到5000元,无论是调整周期还是调整幅度其实是远不如2011年的。这种情况一方面与个税调整是以增加税收为目标相吻合,另一方面也反映出当前经济压力。

你没有看错,个税调整是以增加税收为目标的。而这次个税调整造成的个税总额暂时性降低可能到不到一年就能逆转过来。

而这次调整被大家吐槽最多的可能就是税务局以后将负责征收社保。之所以被吐槽,是因为以前社保局负责征收社保的时候因为没有与收入挂钩,因此很多企业按照最低标准为员工缴纳社保。由税务局负责征收以后,这个中间的信息壁垒不复存在,企业只能够按照实际公司为员工缴纳社保。带来的后果就是企业的用人成本上升。

社保bug的修复所造成的影响可能比想象的大。这个bug不影响国企、央企、大厂,因为这些企业基本都是紧跟政策走。而对小微企业的影响就不可小觑了。在当前的经济压力背景下,这其实是对这类企业的征税(虽然缴纳社保并不算征税,但是哪个企业敢不给员工缴纳社保呢?)。可能员工觉得虽然社保会多交一点,但是日后可以领呀(暂且不论你退休的时候社保这个击鼓传花还能不能传下去……),企业主烦恼就让他们烦恼吧。短期看也许是这样的,但是在社会分工如此细化的今天,很多环节都是会联动受影响的。企业用人成本的增加最终一定会反映在整个经济层面。而具体到雇佣层面,要么会有更多的小微企业在明年关门大吉,要么企业主减少能提供的工作岗位数量。

从个税征收总额数据看,我国过去几年的个税都保持在10%以上的增长,是GPD增速的两倍以上。这次调整其实更多的是稳住税基,同时进一步巩固征税成本低的中等收入人群。在这次调整的细则中也可以应证这一点:草案中,将工资薪金、劳务报酬、稿酬和特许权使用费四项劳动性所得实行综合征税,目的是实施”按人征税“。此番修改的本意,是认为拥有多项收入来源的人士在现行税制下享受了更多的减免优惠,如果将多个收入来源综合起来征税,就会更合理,真正起到调节收入的作用。

我们再看一组财政部2017年财政收人情况数据:

从去年开始,你可能没少听说要为企业减免税负的的消息。但是增值税、消费税、企业所得税的实际数据可能让你失望了。所以,从整体上开,财政部这套班子的思路前后还是非常一致的?。而这次的个税调整,其实是去年开始实行的去地税化改革一揽子计划措施的一部分罢了。从这点看,税务局以后会兼任更多的职能和现金流入口。

总体来看这次个税改革喜忧参半,毕竟不能所有的好处都让P民给占了。我们看一下上述后面的税收大头:车辆购置税今年上半年宣布的减免政策估计大部分人都当成不存在了;进出口税在贸易战的当口根本指望不上。那么这次的个税改革可能代表了后续更多的系列财政举措,这个改革可能连一个国家红包都算不上,只是给你象征性的打了一针生理盐水,肯定打不死人,但是会让大部分自嗨的如同一支兴奋剂。