如何使用 ALPN 使用 SPDY 运行 Jetty?

Posted

技术标签:

【中文标题】如何使用 ALPN 使用 SPDY 运行 Jetty?【英文标题】:How to run Jetty with SPDY using ALPN? 【发布时间】:2014-09-21 23:47:09 【问题描述】:

我已经使用 Jetty 和 SPDY 返回 JDK8,我看到现在 Jetty 9.2 支持 ALPN 协议而不是 NPN(请参阅我的问题 How to run Jetty with SPDY on JDK8?)。于是我设置了bootclasspath

java -Xbootclasspath/p:c:/jars/alpn-boot/alpn-boot-8.0.0.v2014031 ...

但现在我遇到了异常:

Exception in thread "xyz.server" java.lang.NoClassDefFoundError:
        org/eclipse/jetty/npn/NextProtoNego$ServerProvider
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(Unknown Source)
    at java.security.SecureClassLoader.defineClass(Unknown Source)
    ...
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at org.eclipse.jetty.spdy.server.http.HTTPSPDYServerConnector.<init>(HTTPSPDYServerConnector.java:63)
    at org.eclipse.jetty.spdy.server.http.HTTPSPDYServerConnector.<init>(HTTPSPDYServerConnector.java:53)
    at org.eclipse.jetty.spdy.server.http.HTTPSPDYServerConnector.<init>(HTTPSPDYServerConnector.java:43)
    at xyz.my.my_httpsrv_jetty.startHTTPSServer(my_httpsrv_jetty.java:359)
    ...

我使用java version "1.8.0_05" 和码头 9.2.2.v20140723。

我在 WinXP 上使用 JDK 1.7 和 alpn-boot-7.0.0.v20140317.jar 时遇到了同样的错误,如果从 -Xbootclasspath/p:c:/jars/npn-boot/npn-boot-1.1.7.v20140316.jar 更改,我在其中发生了同样的错误

我的代码中的这个执行点指向:

SSLconnector = new HTTPSPDYServerConnector(server, sslContextFactory);

似乎即使使用 ALPN 码头也需要来自 npn-boot 的类。 是错误还是我做错了什么?

【问题讨论】:

【参考方案1】:

HTTPSPDYServerConnector 未更新为 ALPN,目前对 NPN 的使用进行硬编码。

为了将 ALPN 与 SPDY 一起使用,您必须以这种方式配置 ServerConnector

SslContextFactory sslContextFactory = new SslContextFactory();
HttpConfiguration httpConfig = new HttpConfiguration();

SslConnectionFactory ssl = new SslConnectionFactory(sslContextFactory, "alpn");
ALPNServerConnectionFactory alpn = new ALPNServerConnectionFactory("spdy/3", "http/1.1");
alpn.setDefaultProtocol("http/1.1");
HTTPSPDYServerConnectionFactory spdy = new HTTPSPDYServerConnectionFactory(SPDY.V3, httpConfig);
HttpConnectionFactory http = new HttpConnectionFactory(httpConfig);

Server server = new Server();
ServerConnector connector = new ServerConnector(server, new ConnectionFactory[]ssl, alpn, spdy, http);

server.start();

我将此跟踪为https://bugs.eclipse.org/bugs/show_bug.cgi?id=440756。

最后,如果你不直接使用代码,而是使用 Jetty 作为服务器并将 webapps 部署到它,Jetty 已经根据激活的模块正确配置了 ALPN 或 NPN。

【讨论】:

好的。我编辑了我的代码并使用这种启动服务器的方式,它似乎可以与 SPDY 一起使用。谢谢! 它可以工作,但我的客户端证书有问题。它很长,所以我提出了其他问题:***.com/questions/25972186/…

以上是关于如何使用 ALPN 使用 SPDY 运行 Jetty?的主要内容,如果未能解决你的问题,请参考以下文章

ALPN 回调被丢弃:SPDY 和 HTTP/2 被禁用。 alpn-boot 在引导类路径上吗?

Jetty:可以使用 SPDY/3.1 吗?

如何在 JDK8 上使用 SPDY 运行 Jetty?

如何运行瓶子 + 龙卷风 + ssl (https) + spdy

如何在 Heroku 上使用 Rails 3.2.2 实现 SPDY?

使用开箱即用的 SPDY 运行 Jetty