With the approach of the release candidate for Jetty 9.3.0 in the next days, we have implemented support for HTTP/2 cleartext upgrade mechanism, on server side, resolving issue #465857.
This means that you can configure a Jetty server to speak cleartext HTTP/1.1 and cleartext HTTP/2 on the same server port.
This feature is mostly useful for server data centers, where nodes communicate with each other via HTTP/2 using a Java client (for example Jetty’s HttpClient using the HTTP/2 transport) because you want to leverage the HTTP/2 protocol advantages, in particular multiplexing, for a more efficient communication.
This scenario is typical for microservices deployed using embedded Jetty (just run them via
java -jar my_microservice.jar) or, in general, for HTTP services (REST or similar) that reside on different nodes and that are coordinated by a façade service.
In such scenario, the Java client knows before hand that the server port it is connecting to speaks HTTP/2, so the server needs to be configured to speak cleartext HTTP/2 on that port.
However, it is also common during development/troubleshooting of REST services to point a browser to a particular node, craft the right URL with the expected path and/or query parameters, and obtain back the result of the processing (or the error) of your service request.
But browsers don’t speak cleartext HTTP/2 (at the time of this blog, no browser is supporting cleartext HTTP/2, neither directly nor via the standard HTTP/1.1 upgrade mechanism to a different protocol, and there are no known plans for browsers to support this feature in the future), so they will speak HTTP/1.1 to a server port that is configured to speak HTTP/2.
Before the implementation of issue #465857, this scenario resulted in a communication failure between the browser and the server.
Sure, you can configure two different ports, one that speaks HTTP/2 for Java clients, and one that speaks HTTP/1.1 for browsers, but that is cumbersome.
With the resolution of issue #465857, you can now configure Jetty to speak HTTP/1.1 and HTTP/2 on the same server port:
public static void main(String args) throws Exception
// The Jetty Server.
Server server = new Server();
// Common HTTP configuration.
HttpConfiguration config = new HttpConfiguration();
// HTTP/1.1 support.
HttpConnectionFactory http1 = new HttpConnectionFactory(config);
// HTTP/2 cleartext support.
HTTP2CServerConnectionFactory http2c = new HTTP2CServerConnectionFactory(config);
ServerConnector connector = new ServerConnector(server, http1, http2c);
// Here configure contexts / servlets / etc.
If a browser speaking HTTP/1.1 connects to the server, Jetty will speak HTTP/1.1.
If a Java client speaking HTTP/2 connects to the server, Jetty will detect that and internally upgrade the connection from HTTP/1.1 to HTTP/2, so that the Java client will benefit of the HTTP/2 protocol advantages.
Jetty also supports the standard HTTP/1.1 upgrade mechanism (on the server side, not yet on
HttpClient), so that if you are using tools like
nghttp you will be able to speak to a Jetty server either using directly HTTP/2, or by sending a HTTP/1.1 upgrade request to HTTP/2:
# Direct HTTP/2
$ nghttp -v http://localhost:8080/
# Upgrade from HTTP/1.1 to HTTP/2
$ nghttp -vu http://localhost:8080/
If you are interested in how you can benefit from HTTP/2, contact Webtide, and you will have all our expertise at your hands.