我想为JAX-RS客户端实现支持HTTP / 1.1和HTTP / 2的JAX-RS客户端。
如果服务器支持带有HTTP / 2的ALPN,则使用HTTP / 2,如果服务器不提供任何信息,则使用HTTP / 1.1。
我已经阅读了一些关于ALPN的文章,它似乎是可能的,但我没有找到同时支持这些协议的任何内容。我没有把这些插在一起。
我目前正在使用Jetty HTTP/1.1 transport connector for Jersey和custom implementation for HTTP/2 transport connector。
Java 11提供的Java HTTP客户端支持HTTP / 1.1和HTTP / 2(请参阅Introduction to the Java HTTP Client)。但是,它目前尚未与JAX-RS集成。它可能是构建JAX-RS连接器的好选择。
如果这个问题仍然有待提供,那么有一种方法可以用<JDK 9版本实现客户端。
如您所知,如果使用TLSv1.2(h2),HTTP / 2需要ALPN支持。
netty包对HTTP / 2有一些支持,前提是您在平台上安装了openssl(版本1.0.2或更高版本)。
Netty包将通过调用本机库将OpenSSL用于ALPN支持。
我们使用JDK8实现了一个客户端,并设法为服务器生成http2请求,其中服务器只接受http2请求。我们使用下面提到的依赖
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<!--<version>5.0.0.Alpha2</version> -->
<version>4.1.29.Final</version>
</dependency>
实际上ALPN只是由JDK9 http://unrestful.io/2015/10/09/alpn-java.html开始的jdk支持。
那是JAX-RS客户端api无法处理的
解决方案可以是使用nginx(或apache2)作为反向代理来处理该需求。
Nginx可以代理您的jetty服务器(使用http / 1.1或仅http / 2协议)和服务器http / 2与alpn(使用最新版本)到客户端。
听起来你的问题是抽象的,你想要一个Java servlet而不是协商和终止单个REST端点,因此避免使用HTTP / 1的一个接口和HTTP / 2的另一个接口,并避免外部终止,例如通过代理可以处理多种协议。所以一个多功能的servlet。
这已经由Stuart(和JBoss人)在Undertow中实现,至少在2017年Steve Hu添加了测试用例和PR时。 1
您需要在OptionsMap中传入ENABLE_HTTP2选项。对于http URI,这意味着客户端将尝试升级第一个请求,因为https URI的ALPN将用于尝试和协商HTTP / 2。这就是浏览器的行为方式,即使目标不支持HTTP / 2也能正常工作。 2
看起来Simone正在推动改变以在Jetty中实现这一点。 3所以,如果您现在想要这个,请从Jetty切换到Undertow,或将问题更改为“支持...在Jetty中”。