HTTP/2 en pratique
Introduction
HTTP/2 vs HTTP/1.1
- binary
- header compression
- push responses
- multiplexed
HTTP/2 vs HTTP/1.1
Multiplexing
Multiplexing
Multiplexing
nghttp2
- Serveur
- Client
TLS or not TLS ?
- h2
- Basé sur TLS
- HTTP/1.1 + ALPN
- h2c
- Clear Text
- Direct ou Upgrade
TLS - ALPN
HTTP Upgrade
Démos
Clients
Ligne de commande
- nghttp
- Uniquement HTTP/2
- curl
- Selon distrib
- Avec libnghttp2
- wget
- Pas de support
Langages
- Python
- JS
- Java
- Go
- Perl
- PHP
- C/C++
- Swift
- Lua
- Ruby
- …
JavaScript
- NodeJS 8+
- Module
http2
- Experimental
- Module
- NodeJS 5+
- node-http2, node-spdy
Java
- Java 9
- Module
jdk.incubator.httpclient
- Package
jdk.incubator.http
- Module
- Librairies tierces
- Vert.X, OkHttp, Netty, Jetty
Serveurs
nghttp2
- nghttpd
- Uniquement HTTP/2
- libnghttp2
- Utilisable par les autres serveurs Web
Apache HTTP Server
- Module mod_http2
- Version 2.4.17+
- Basé sur nghttp2
Apache HTTP Server
- Protocole h2c
- Direct ou Upgrade
Apache HTTP Server
- Protocole h2
- ALPN (OpenSSL 1.0.2+)
- Module ngx_http_v2_module
- Version 1.9.5+
- OpenSSL 1.0.2+
- Core module http2
- Version 8.4+
- Experimental
- Protocole h2
- ALPN (avec OpenSSL)
- Protocole h2c
- Uniquement Direct
Express
- Version 4.x
Express
- node-spdy
- Java 9
- Support d’ALPN
- Java 8
- Jetty ALPN
- Boot classpath
- Java 7
Apache Tomcat
- h2c
- Version 8.5+
- Direct ou Upgrade
Apache Tomcat
- h2 - ALPN
- Java 8 + OpenSSL
Apache Tomcat
- h2 - ALPN
- Java 9 + JSSE
- h2 / h2c
- Jetty 9.3+
- ALPN + Java 8
- h2c
- Direct ou Upgrade
- Version 3.3+
- h2 - ALPN
- Java 8 + OpenSSL
- h2 - ALPN
- Java 8 + JSSE
- Jetty ALPN
- h2 - ALPN
- Java 9 + JSSE
- Version 3.5
- Tomcat Embedded
- Mêmes contraintes que Tomcat
- Undertow Embedded
- Compatible Java 8
- Wildfly 9
- Via Undertow 1.2
- Weblogic 12
- Glassfish 5
- Via Grizzly 2.4
- …
- JavaEE 8
- JavaEE 8
- API push
- javax.servlet.http.PushBuilder
- push()
- path(String path) : PushBuilder
- addHeader(String name, String value) : PushBuilder
- setHeader(String name, String value) : PushBuilder
- getHeader(String name) : String
- …
Push
Push
Preload
- HTTP/1.x
- Chargement prioritaire d’une ressource
- Géré par le client
- Via HTML
- Via HTTP Headers
Preload
- HTTP/2
Preload
- Désactiver push
- Via HTTP Headers
Apache HTTP server
- Preload
Apache HTTP server
- Push simple
nginx
- Pas de push
- Versions 1.12 (stable) et 1.13 (mainline)
- Développement en cours
- Version 1.13.x ?
- Module indépendant
- http2-push-nginx-module
NodeJS
- Objet stream
Vert.x
- Objet response
JavaEE
- Objet PushBuilder
Bonne idée ?
- Cache client vs push serveur
Rest Stream
- Pas sur que le push soit top…
- "Laisse moi tranquille"
A revoir !!
Reverse proxy
Reverse proxy
Reverse proxy
- Multiplexing sur le réseau avec latence
- Server push intermédiaire (preload)
Reverse proxy
- Multiplexing sur tout le réseau
- Server push depuis le backend
nghttp2
- nghttpx
- HTTP/2 ⇒ HTTP/1.x (par défaut)
- HTTP/2 ⇒ HTTP/2
- Avec ou sans TLS
Apache HTTP server
- Module mod_proxy_http2
Nginx
Nginx
- Développement en cours
- Support de gRPC
Conclusion
HTTP/2 vs HTTP/1.1
- binary
- header compression
- push responses
- multiplexed
Impact
- Granularité
- Taille des requêtes
- Domain sharding
- Concaténation de fichiers CSS, JS,…
- Image sprite
Impact
- Charge serveur
- Event-loop vs Thread Pool
Impact
- Push
- Compléxité
- Push vs Client Cache
- Support en reverse proxy