【问题标题】:How can I support HTTP2 with Tomcat 8.5 and Java SE 8如何使用 Tomcat 8.5 和 Java SE 8 支持 HTTP2
【发布时间】:2018-06-10 14:51:13
【问题描述】:

我正在研究 HTTP2 以及我们在应用程序中使用它的可能性。目前我们正在使用 Java 8 开发并使用 Tomcat 8.5.24(这意味着我们使用 Servlet 3.1)。我搜索了网络,但找不到任何关于如何利用 HTTP2 功能的资源。

我能找到的唯一示例是使用 Servlet 4.0(据我所见,它仅受 Tomcat 9 支持),唯一展示的是在客户端使用 PushBuilder 推送 css 和 js 文件请求和html页面。

我能否通过 HTTP2 使用 Servlet 3.1 提供的异步 api? Servlet 3.1 是否支持 HTTP2?如果不是,Tomcat 8.5 支持 HTTP2 的意义何在?只用于推送网页资源?

【问题讨论】:

  • 一种解决方案是使用启用了 http2 的 nginx 前端 tomcat。 nginx 将提供 http2 的好处(大部分),并且您的代码可以驻留在 3.1 的 tomcat 中。异步API更多的是关于如何处理线程,与http交互关系不大。

标签: java tomcat servlets http2


【解决方案1】:

首先,一些基本点:

  • 您必须使用 Servlet 4.0 来实现服务器推送。该 API 在 3.1 等早期版本中不存在。
  • Servlet 规范现在属于 Java EE(“Jakarata EE”),而 Servlet 4.0 规范是 Java EE 8 的一部分。
  • 因此,要在 servlet 中实现服务器推送,您必须使用 EE 8。不能使用 EE 7。
  • 但是,您可以在 EE 8 中使用 JDK 8 或更高版本。无需转到 JDK 9。
  • Tomcat provides a useful table 用于将任何 Tomcat 版本与支持的 Java 和 servlet 版本相关联。
  • 以下服务器支持 Java EE 8:GlassFish 5.x、Payara 5.x 和 Tomcat 9.x。您不能使用 Tomcat 8.5。

解决您的具体问题:

我能否通过 HTTP2 使用 Servlet 3.1 提供的异步 api?

是的。 4.0规范还是有的。

Servlet 3.1 是否支持 HTTP2?

没有。 Servlet 4.0 规范的附录 A1 明确指出,与 3.1 相比的一个变化是“支持 HTTP/2 的要求”。

如果不是,Tomcat 8.5 支持 HTTP2 的意义何在?

因为 HTTP/2 中有一些独立于 servlet 存在的特性。见the Tomcat 8.5 documentation on its HTTP/2 support。例如,虽然您无法实现 HTTP/2 服务器推送,但您仍然可以使用 Tomcat 8.5 实现 HTTP/2 标头压缩。

仅用于推送网页资源?

没有。 HTTP/2 是关于性能的,server push is just one feature:

  • 是二进制的,而不是文本的
  • 完全多路复用,而不是有序和阻塞
  • 因此可以使用一个连接来实现并行性
  • 使用标头压缩来减少开销
  • 允许服务器主动将响应“推送”到客户端缓存中

最后,还有一些相关的事情值得注意:

  • 虽然 HTTP/2 本身不需要使用 https,但实际上它是必需的,因为“currently no browser supports HTTP/2 unencrypted”。
  • 所有流行的浏览器都已经完全支持 HTTP/2。
  • 据我所知,没有什么可以阻止使用任何主要 IDE(Intellij IDEA、Eclipse、STS、NetBeans)来开发和测试 HTTP/2 功能。

【讨论】:

  • 我查看了 servlet 4.0 api 并没有发现任何与我发送推送 响应数据 相关的内容(不是 css 文件之类的资源)。这是支持还是我们只是先发制人地推动资源以提高性能?
  • @Konstantine 正确:我们“只是先发制人地推动资源以提高性能”。在您的 servlet 中,您指定在完成请求处理之前要立即发送给客户端的资源(例如图像等)。你也可以做类似的事情with JSF 2.3 with no developer effort at all。但 AFAIK 服务器推送不支持将数据推送回客户端。 (我想您可以将数据放在资源文件中并推送,但这违背了服务器推送的意图。)
  • 好的。我认为 HTTP2 本质上会允许 SSE 并取代 WebSockets。我的目标是使用 one http 请求启动服务器操作,然后接收该操作的 multiple 响应。 Websockets 是唯一的出路还是 HTTP2 会支持这个功能(至少在未来)?
猜你喜欢
  • 2013-08-15
  • 2015-12-18
  • 1970-01-01
  • 1970-01-01
  • 2019-08-08
  • 1970-01-01
  • 1970-01-01
  • 2016-08-29
  • 2017-01-07
相关资源
最近更新 更多