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的主要内容,如果未能解决你的问题,请参考以下文章

码头 HTTP2Client jar 丢失

Groovy-码头

程序员知识码头

如何使用同一端口(使用码头 8)拥有具有多个上下文的 websocket

JAVA 码头 9 Websocket SSL

码头webSocket:java.lang.IllegalStateException:已提交