Tag: upgrade

  • Jetty HTTP/2 cleartext upgrade

    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.