将 HTTP/2 与 JAX-RS 客户端一起使用

Use HTTP/2 with JAX-RS client

我正在尝试使用 JAX-RS HTTP/2 服务器和客户端。服务器端可以工作,但我无法使用 JAX-RS 抽象使客户端正常工作。我使用 Jersey2 JAX-RS 实现和嵌入式 Jetty HTTP 服务器。我还使用 Jersey 代理客户端通过接口直接使用 API。客户端构建方法如下

import org.glassfish.jersey.client.proxy.WebResourceFactory;
import javax.ws.rs.client.ClientBuilder;

(...)
<T> T getClient(int port, Class<T> resourceInterface) {
    return WebResourceFactory.newResource(
            resourceInterface,
            ClientBuilder.newBuilder()
                    .build()
                    .target("https://localhost:" + port)
    );
}

您有使用相同抽象级别的解决方案吗?

编辑

根据@sbordet 的回答,我实现了一个基于 JettyClient 支持 HTTP/2 的客户端连接器。代码在 GitHub and artifact is on .

Jersey 允许使用 transport connectors.

自定义传输

已经有一个使用 Jetty 的 HttpClient 的 Jersey 客户端传输,但它被配置为使用 HTTP/1.1,而不是 HTTP/2,请参阅 https://github.com/jersey/jersey/blob/master/connectors/jetty-connector/src/main/java/org/glassfish/jersey/jetty/connector/JettyConnector.java

我猜你的选择是自己实现 Jersey ConnectorProviderConnector,主要基于那些已经可用的,但是配置 HTTP/2 传输如码头 documentation;或要求 Jersey 开发人员在现有 JettyConnector 中创建 HttpClient 实例可覆盖,以便您可以使用 HTTP/2 自定义 HttpClient 传输。

请注意,如果您使用 HTTP/2,您将需要支持 ALPN,如 this documentation 中所述。