HTTP/2 Java 8、码头和 ALPN
Posted
技术标签:
【中文标题】HTTP/2 Java 8、码头和 ALPN【英文标题】:HTTP/2 Java 8, Jetty and ALPN 【发布时间】:2017-02-12 21:29:25 【问题描述】:我浏览了这个页面:https://www.eclipse.org/jetty/documentation/9.3.x/alpn-chapter.html 在我的类路径中有一个 ALPN 引导 jar,但我仍然无法让它工作。
我很困惑是否需要 Open SDK Java 8 而不是 Oracle Java 8。
我的 Java 版本是:
java -version
java version "1.8.0_11"
Java(TM) SE Runtime Environment (build 1.8.0_11-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.11-b03, mixed mode)
我正在使用以下版本的 Jetty 和 ALPN 引导:
<jetty-version>9.4.0.M1</jetty-version>
<alpn-version>8.1.9.v20160720</alpn-version>
<dependency>
<groupId>org.mortbay.jetty.alpn</groupId>
<artifactId>alpn-boot</artifactId>
<version>$alpn-version</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-client</artifactId>
<version>$jetty-version</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty.http2</groupId>
<artifactId>http2-client</artifactId>
<version>$jetty-version</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty.http2</groupId>
<artifactId>http2-http-client-transport</artifactId>
<version>$jetty-version</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty.http2</groupId>
<artifactId>http2-common</artifactId>
<version>$jetty-version</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty.http2</groupId>
<artifactId>http2-hpack</artifactId>
<version>$jetty-version</version>
</dependency>
我还尝试使用不同版本的 Jetty 和 ALPN,我在这里找到了 https://mvnrepository.com/artifact/org.mortbay.jetty.alpn/alpn-boot 和 https://mvnrepository.com/search?q=org.eclipse.jetty
无论我尝试哪种方式,我都无法将 POST 请求提交到 HTTP/2 端点。
但是使用 Netty 和以下依赖项,我的测试是成功的:
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-tcnative-boringssl-static</artifactId>
<version>1.1.33.Fork22</version>
</dependency>
我在哪里可以找到文档以查看哪个版本的 ALPN 引导与 Oracle JDK 兼容? ALPN boot 是否只兼容 OpenJDK?
我了解到,Java 9 对 ALPN 的支持将是原生的。
顺便说一句,哪个更好?用于 HTTP/2 调用的 Netty 或 Jetty。
【问题讨论】:
ALPN versions table 有你正在寻找的从 alpn-boot 版本到 java 版本的列表 【参考方案1】:Jetty 的 ALPN 引导 jar 可与 OpenJDK 和 Oracle 的 JDK(基于 OpenJDK)一起使用。
Jetty 的 ALPN 引导 jar 必须在 boot 类路径中,而不是常规类路径中,如您链接的文档所述。
因此,您不得在 pom.xml
文件中将其声明为依赖项(没有必要,就像您不需要指定对 JDK 类的依赖项一样)。
JDK 9 将原生支持 ALPN,这方面已经有一些工作。
【讨论】:
谢谢,我也试过这样设置:-Xbootclasspath/p:/Users/foo/.m2/repository/org/mortbay/jetty/alpn/alpn-boot/8.1.5.v20150921 /alpn-boot-8.1.5.v20150921.jar 你是JDK 8u11(很旧,请更新),所以你必须使用8.1.0.v20141016版本的ALPN boot jar。 JDK 和 ALPN 的正确匹配请参考this table。 9.4.x 需要什么才能使用 Java 9?是否发布了任何文档?【参考方案2】:出于多种原因,首选 Netty 进行 Http/2 连接。我看到使用它的几个优点是:
无需将 ALPN jar 添加到引导类路径。添加 maven 依赖项“netty-tcnative-boringssl-static”就可以了 它固有地支持使用 API 的异步模型。因此,在 HTTP/2 的情况下,处理服务器推送的数据变得更加简单【讨论】:
Netty 是否比 Java 9 对 HTTP/2 连接的原生支持更受欢迎?以上是关于HTTP/2 Java 8、码头和 ALPN的主要内容,如果未能解决你的问题,请参考以下文章