Jetty 9.3.0 is almost ready and Release Candidate 1 is available for download and testing! So this is just a quick blog to introduce you to what is new and encourage you to try it out!
The headline feature in Jetty-9.3 is HTTP/2 support. This protocol is now a proposed standard from the IETF and described in RFC7540. The Jetty team has been closely involved with the development of this standard, and while we have some concerns about the result, we believe that there are significant quality of service gains to be had by deploying HTTP/2. The protocol has features that can greatly reduce the time to render a web page, which is good for clients; plus it has some good economies in using a fewer connections, which is good for servers.
Jetty has comprehensive support for HTTP/2: Client, Server with negotiated, upgraded and direct connections and the protocol is already supported by the majority of current browsers. Since HTTP2 is substantially based on the SPDY protocol, we have dropped SPDY support from Jetty-9.3.
Deploying HTTP/2 in the server is just the same as configuring a https connector :
java -jar $JETTY_HOME/start.jar --add-to-startd=http2 will get you going (more blogs and doco coming)!
Webtide is actively seeking users interested in deploying HTTP2 and collaborating on analysis of load, latency, configuration and optimisations.
To support standard based negotiation of protocols over new connections (eg. to select HTTP2 or HTTPS), Jetty-9.3 supports the Application Layer Protocol Negotiation mechanism which replaces our previous support for NPN.
ALPN will automatically be enabled when HTTP2 is enable with start.jar, which downloads a non-eclipse jar containing our own extension to Open JVM and is not covered by the eclipse licenses.
Jetty-9.3 also supports Server Name Indications during TLS/SSL negotiation. This allows the key store to contain multiple server certificates that have a specific or wild card domain(s) encoded in their distinguished name or by the Subject Alternate Name X.509 extension. This allows a server with many virtual hosts/contexts to pick the appropriate TLS/SSL certificate for a connection.
Enabling SNI support is a simple as adding the multiple certificates to your keystore file!
Jetty-9.3 is built and targeted for Java 8. This change was prompted by the SNI extension reliance on a Java 8 API and the HTTP2 specification need for TLS ciphers that are only available in Java 8. It is possible to build Jetty-9.3 for Java 7 and we were considering releasing it as such with a few configuration tricks to enable the few classes that require java 8, however we decided that since java 7 is end-of-life is was not worth the complication to support it directly in the release. If you really need java 7, then please speak to Webtide about a build of 9.3 for 7.
Eat What You Kill
It is impossible to change the protocol as server speaks without dramatic changes on how it is optimized to scale to high loads and low through puts. The support of HTTP2 requires some fundamental changes to the core scheduling strategies, specifically with regards to the challenge of handling multiplexed requests from a single connection. Jetty 9.3 contains a new scheduling strategy nicked named Eat What You Kill that makes 9.3 faster out of the box and gives us the opportunity to continue to improve throughput and latency as we tune the algorithm.
Reactive Asynchronous IO Flows?
Jetty 9.2 already supports the Servlet Asynchronous IO API and Asynchronous Servlets. However, in Jetty 9.3 that support has been made even more fundamental and all IO in Jetty is now fundamentally asynchronous from the connector to the servlet streams and robust under arbitrary access from non container managed threads.
So Jetty-9.3 is a good basis on which to develop with the servlet asynchronous APIs, however as we have some concerns with the complexity of those APIs, we are actively experimenting with better APIs based on Reactive Programming and specifically on the Flow abstraction developed by Doug Lea as a candidate class for Java 9. We have a working prototype that runs on Jetty-9.3 which we hope to release soon. Please contact us if you are interested in participating in this development, as real use-cases are required to test these abstractions!