在2015年 JavaLand 大会上, Ed Burns 展示了 Java EE Servlet 4.0 规范(JSR 369)的概要,演讲的重点在于Java EE平台对HTTP/2的支持。 HTTP/2 旨在解决现存HTTP规范中的问题,并引入新的功能,包括request/response多路复用、二进制帧传输(binary framing)、数据流优先级、服务器推送和头信息压缩。
Burns是 Oracle 公司的技术顾问之一,他从由于 HTTP/1.1 中固有的缺陷,导致当前典型网站的30多种资源传输到浏览器端很慢这一现象谈起。首要的问题是‘ 对头阻塞(head-of-line,HOL) ’引起的,原因是被请求的资源必须排队依次传输。为此,现代浏览器会尝试使用打开多个socket连接、域名碎片和文件串联等技术,作为临时解决方案。
Burns表示,HTTP/2本质上是基于HTTP/1.1的新的传输层,是 OSI模型 中 应用层 的实现。该协议定义了同样的request/response模型,并没有引入新的方法或者头信息、应用层上的新的使用模式,也没有新的URL用法以及底层规范。
HTTP/1.1几乎没有涉及如何使用 TCP 套接字,TCP包可以视为丢弃的资源。相反,新的HTTP/2规范建议把Socket视为稀缺资源,每台服务器只开放一条TCP连接。 HTTP/2的‘流’本质上是一条TCP连接的通道(channel),消息在通道中进行传送。帧(frame)是HTTP/2通信的最小单位。
HTTP/2规范还包括:
Burns讨论了已有的对HTTP/2的批评,包括HOL阻塞可能发生在头信息帧中,Firefox和Chrome不支持非安全传输层协议升级、由于HPACK编码/解码过程导致碳足迹(carbon footprint)的增加、由于必须写入HTTP/2规范实现中的新软件的表面面积巨大,导致潜在增加DoS攻击源,以及HTTP/2实际上与WebSocket是正交等方面内容。
演讲最后讨论了Java EE Servlet API 可能包含的对HTTP/2规范的支持。可能支持的功能包括:request/response多路复用、数据流优先级、服务器端推送,以及对HTTP1.1的升级。
数据流优先级会通过新的Priority类实现,并且现有的HttpServletRequest和HttpServletResponse类会增加访问和修改数据流优先级的方法。Burns还指出,服务器端推送对如 JSF 这样的框架会非常有用,它还能够实现通过给定的URL和头信息,将资源推送到客户端的能力。
Servlet 4.0 规范 会把HTTP/2引入 Java EE,并100%兼容实现HTTP/2规范。这将由2014年9月制定的JSR 369来支持,JSR369暂定于2015年第四季度确定最终草案,预计2016年第三季度最终发布。
Burns鼓励所有感兴趣的人通过 Adopt-a-JSR 计划参与Servlet4.0的创建、通过访问Java EE参考实现应用服务器 GlassFish 的网页,体验 Aquarium blog 。JSR369规范的更多相关信息详见 Java Community Process(JCP) 网站。JavaLand是在德国布吕尔召开的年度Java大会,详情参见 JavaLand事件网站 。
查看英文原文: Ed Burns Discusses HTTP/2 and the Java EE Servlet 4 Specification
感谢邵思华对本文的审校。
给InfoQ中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家通过新浪微博(@InfoQ,@丁晓昀),微信(微信号: InfoQChina )关注我们,并与我们的编辑和其他读者朋友交流。