如何使用 Tomcat 8.5 和 Java SE 8 支持 HTTP2

How can I support HTTP2 with Tomcat 8.5 and Java SE 8

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

我能找到的唯一示例是使用 Servlet 4.0(据我所知,只有 Tomcat 9 支持它)并且唯一展示的是使用 PushBuilder当客户端请求和 html 页面时推送 css 和 js 文件。

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

首先,一些基本要点:

  • 服务器推送必须使用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.

解决您的具体问题:

Will I be able to use the Asynchronous api provided by Servlet 3.1 over HTTP2?

是的。还是有4.0规范的

Is HTTP2 supported by Servlet 3.1?

没有。 Servlet 4.0 规范的附录 A1 明确指出 3.1 的一个变化是 "Requirement to support HTTP/2".

If not, what's the point of Tomcat 8.5 supporting HTTP2?

因为 HTTP/2 中的某些功能独立于 servlet 而存在。参见 the Tomcat 8.5 documentation on its HTTP/2 support。例如,虽然您无法实现 HTTP/2 服务器推送,但您仍然可以使用 Tomcat 8.5.

实现 HTTP/2 header 压缩

Only for pushing web resources?

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

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

最后,还有几个相关的注意事项:

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