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);
  connector.setPort(8080);
  server.addConnector(connector);
  // Here configure contexts / servlets / etc.
  server.start();
}

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.


0 Comments

Leave a Reply

Avatar placeholder

Your email address will not be published. Required fields are marked *