Java EE 8 und Servlet 4.0 bringen der Java-Welt das, was das JDK9 nicht geschafft hat: die Unterstützung der Version 2 des HTTP-Protokolls. HTTP/2 bringt HTTP-Push, Request-Multiplexing und Header-Komprimierung ins Web. Die Netzbrandbreite soll besser ausgenutzt werden. Latenzen sollen verringert werden. Bisher profitieren davon in erster Linie Webseiten und Browser. Mit dem Standard Servlet 4.0 kommen diese Neuerungen erstmals standardisiert in die Enterprise-Java-Welt.
Der Vortrag zeigt die Neuerung und deren Implementierung im JDK9 und mit einigen Servlet4-Implementierungen
Bit sosem 2016-wieners-sitzung-07_rechnerkommunikation-ii
Webservices auf Basis von HTTP/2 und Servlet4
1. Webservices auf Basis von
HTTP/2 und Servlet 4.0
JAN WEINSCHENKER
16. März 2018 @JANWEINSCHENKER 1
2. Agenda
16. März 2018 @JANWEINSCHENKER 2
1. HTTP von damals bis heute
2. Die Technik in HTTP
3. Java und Servlet4
4. Fragen
3. 16. März 2018 @JANWEINSCHENKER 3
PROFESSIONALS
INDIVIDUALS
N3RDS
Die Holisticon AG ist eine Management- und
IT-Beratung aus Hamburg.
Wir entwickeln beste Individualsoftware,
Webplattformen und Apps.
Geschäftsprozesse durchdringen wir und
automatisieren sie.
Große Datenmengen machen wir mit Smart-
Data-Ansätzen beherrschbar.
4. HTTP von damals bis
heute
DIE VORGESCHICHTE VON HTTP/2 (H2)
16. März 2018 @JANWEINSCHENKER 4
5. HTTP/1.0 - 1990
Line Mode Browser (LMB) von Nicola Pellow (CERN)
16. März 2018 @JANWEINSCHENKER 5
6. HTTP/1.0 – 1991: Nexus Browser
Entwickelt von Tim
Berners-Lee
16. März 2018 @JANWEINSCHENKER 6
7. 16. März 2018 @JANWEINSCHENKER 7
java.sun.com - Februar 1998
Quelle: archive.org
www.yahoo.com - April 1999
Quelle: archive.org
HTTP/1.1 – 1999
8. Das Web heute
16. März 2018 @JANWEINSCHENKER 8
315 Requests
5,79 MB
2,36s
9. Das Web hat sich verändert
• Mehr und komplexere
Inhalte
• JavaScript, CSS, AJAX,
Audio/Video, ...
• Mobile Endgeräte, also ggf.
unzuverlässige Leitungen
• EDGE, 3G, LTE, WLAN, LAN
• Leistungsfähigere Browser
• Das Web bzw. HTTP ist zur
Grundlage von SOAP- und
RESTful-Webservices
geworden.
16. März 2018 @JANWEINSCHENKER 9
Aber HTTP/1.* stammt immer noch
aus den 90ern!
10. HTTP/2 – Seit 2015
• Reduziert Protokoll-Overhead und TCP-Sockets
• Connection-Multiplexing
• Reduziert Anzahl der HTTP-Anfragen
• Server-Push
• Reduziert Anzahl der TCP-Roundtrips
• Komprimierung der Protokoll-Header (HPACK)
16. März 2018 @JANWEINSCHENKER 10
12. HTTP Request Roundtrip
16. März 2018 @JANWEINSCHENKER 12
Client ServerDNS
DNS
TCP
HTTP
GET
SSL
www.google.d
e
172.217.20.19
5 SYN
SYN/AC
K
ACK
GET
1x pro
Host
13. HTTP/1.1 Request-Pipelining
16. März 2018 @JANWEINSCHENKER 13
Client Server
GET index.html
Abwicklung
mehrerer
GET-Requests
innerhalb
einer TCP-
Verbindung
14. HTTP/1.1 Workarounds
• Mehrere TCP-Connections parallel öffnen
• Domain Sharding
• TCP-Verbindungen sind relativ “teuer“
• Anzahl an Verbindungen wird durch Clients begrenzt.
16. März 2018 @JANWEINSCHENKER 14
16. HTTP/1.1 Workarounds
• Verbindungen reduzieren
• Spriting
• Zusammenfassen von Ressourcen
• CSS und JavaScript
• Inlining mittels Base 64
• Probleme beim Caching
16. März 2018 @JANWEINSCHENKER 16
Sprite mit 9 Bildern
17. HTTP/2 - Keine Workarounds mehr nötig
• HTTP/2 bietet Multiplexing
• Alle Request-Response-Konversationen laufen simultan über
ein und dieselbe TCP-Verbindung.
16. März 2018 @JANWEINSCHENKER 17
19. 16. März 2018 @JANWEINSCHENKER 19
HTTP/1.1 – Eine Beispiel-Konversation
Client
Server
GET /index.html
STATUS 200
index.html
GET /style.css
STATUS 200
style.css
GET /script.js
STATUS 200
script.js
20. 16. März 2018 @JANWEINSCHENKER 20
HTTP/2 – Ein Beispiel-Stream
Client
Server
Message 1
Message 2
STREAM-ID 41
HEADERS-Frame
GET /index.html
STREAM-ID 41
HEADERS-Frame
STATUS 200
STREAM-ID 41
DATA-Frame
{binary index.html}
+END_STREAM
21. 16. März 2018 @JANWEINSCHENKER 21
HTTP/2 – Ein Beispiel für Server-PUSH
Client
Server
STREAM-ID 41
HEADERS-Frame
GET /index.html
STREAM-ID 41
HEADERS-Frame
STATUS 200
STREAM-ID 41
PUSH_PROMISE-Frame
/style.css
via STREAM 42
STREAM-ID 41
DATA-Frame
{binary index.html}
+END_STREAM
STREAM-ID 42
DATA-Frame
{binary style.css}
+END_STREAM
STREAM-ID 42
HEADERS-Frame
STATUS 200
22. 16. März 2018 @JANWEINSCHENKER 22
HTTP/2 – Noch ein Beispiel für Server-PUSH
Client
Server
STREAM-ID 41
HEADERS-Frame
GET /index.html
+END_HEADERS
+END_STREAM STREAM-ID 41
HEADERS-Frame
STATUS 200
STREAM-ID 41
PUSH_PROMISE-Frame
/style.css
via STREAM 42
STREAM-ID 41
DATA-Frame
{binary index.html}
+END_STREAM
STREAM-ID 42
HEADERS-Frame
STATUS 200
+END_HEADERS
STREAM-ID 42
RST_STREAM-Frame
<Error Code>
23. Compression in HTTP/1.1
• Keine Header Compression
• Komprimierung von Nutzdaten mittels
GZIP und DEFLATE
16. März 2018 @JANWEINSCHENKER 23
24. Header-Daten im Browser
1 Kilobyte an Cookie-Daten pro HTTP-Request
• Problem beim initialen Verbindungsaufbau:
• TCP definiert eine Maximalgröße für die ersten TCP Pakete:
532 bytes (IPv4).
• MSS (Maximum Segment Size)
16. März 2018 @JANWEINSCHENKER 24
25. ACK
TCP Slow Start
16. März 2018 @JANWEINSCHENKER 25
Browser Server
GET
GET
GET
ACK
ACK
Beispiel: 1 GET-Request mit 1500 Byte an Header-Daten und MSS 500 Byte.
26. Header Compression – HTTP/2
• Komprimierung der HTTP-Header mittels
HPACK
• Payload-Kompression weiterhin mit GZIP
16. März 2018 @JANWEINSCHENKER 26
27. Header Compression mit HPACK
Dreistufige Komprimierung von HTTP Headern.
1. Vordefiniertes Kompressionswörterbuch für 61 sehr gebräuchliche Header. Z.B.:
◦ 2 = :method GET
◦ 3 = :method POST
◦ 8 = :status 200
◦ 16 = accept-encoding gzip, deflate
2. Dynamisches Kompressionswörterbuch
◦ Wird zum Zeitpunkt der Verbindungsaufnahme ausgehandelt
3. Statische Huffman-Kodierung
16. März 2018 @JANWEINSCHENKER 27
30. Die Servlet API
16. März 2018 @JANWEINSCHENKER 30
• Die meisten Änderungen sind für Entwickler transparent.
• Multiplexing und HPACK erfolgen automatisch.
• Lediglich Server Push ist mit eigenem
Implementierungsaufwand verbunden.
31. Java: HTTP/2 Verfügbarkeit
Name HTTP/2 Servlet 4
JBOSS EAP 7.1 ja nein
Wildfly 9+ ja nein
Glassfish 5 ja ja
Spring Boot 2 ja ja (mit Embedded Tomcat 9)
Tomcat 9 ja ja
OkHttp 3 Client ja nein
Jetty Server und Client v9.3+ ja nein
Undertow Server 1.4 ja nein
Apache Commons HTTP Client 5 ja nein
16. März 2018 @JANWEINSCHENKER 31
33. Fazit
• HTTP/2 setzt sich im Java-Umfeld zu
langsam durch.
• Mittlerweile gibt es Implementierungen in
verbreiteten Frameworks
16. März 2018 @JANWEINSCHENKER 33