HTTP / 2 i anløbsbro

1. Oversigt

HTTP / 2-protokollen leveres med en push-funktion, der giver serveren mulighed for at sende flere ressourcer til klienten for en enkelt anmodning. Derfor forbedrer det indlæsningstiden på siden ved at reducere de mange rundrejser, der er nødvendige for at hente alle ressourcerne.

Jetty understøtter HTTP / 2-protokollen til både klient- og serverimplementeringer.

I denne vejledning udforsker vi HTTP / 2-support i Jetty og opretter en Java-webapplikation for at undersøge HTTP / 2 Push-funktionen.

2. Kom godt i gang

2.1. Downloader anløbsbro

Jetty kræver JDK 8 eller nyere og ALPN (Application-Layer Protocol Negotiation) support til at køre HTTP / 2.

Typisk, Jetty-serveren er implementeret over SSL og aktiverer HTTP / 2-protokollen via TLS-udvidelsen (ALPN).

Først skal vi downloade den nyeste Jetty-distribution og indstille JETTY_HOME variabel.

2.2. Aktivering af HTTP / 2-tilslutning

Dernæst kan vi bruge en Java-kommando til at aktivere HTTP / 2-stikket på Jetty-serveren:

java -jar $ JETTY_HOME / start.jar --add-to-start = http2

Denne kommando tilføjer HTTP / 2-protokolstøtte til SSL-stikket på porten 8443. Det aktiverer også ALPN-modulet til protokolforhandling:

INFO: server aktiveret, ini-skabelon tilgængelig med --add-to-start = server INFO: alpn-impl / alpn-1.8.0_131 dynamisk afhængighed af alpn-impl / alpn-8 INFO: alpn-impl transitivt aktiveret INFO: alpn transitivt aktiveret, ini-skabelon tilgængelig med --add-to-start = alpn INFO: alpn-impl / alpn-8 dynamisk afhængighed af alpn-impl INFO: http2 initialiseret i $ {jetty.base} /start.ini INFO: ssl transitivt aktiveret, ini-skabelon tilgængelig med --add-to-start = ssl INFO: threadpool transitivt aktiveret, ini-skabelon tilgængelig med --add-to-start = threadpool INFO: bytebufferpool transitively enabled, ini-skabelon tilgængelig med --add-to- start = bytebufferpool INFO: Basismappen blev ændret

Her viser logfiler oplysningerne om moduler som f.eks ssl og alpn-impl / alpn-8 der er aktiveret transitivt til HTTP / 2-stikket.

2.3. Start af Jetty Server

Nu er vi klar til at starte Jetty-serveren:

java -jar $ JETTY_HOME / start.jar

Når serveren starter, viser loggningen de moduler, der er aktiveret:

INFO :: main: Logning initialiseret @ 228ms til org.eclipse.jetty.util.log.StdErrLog ... INFO: oejs.AbstractConnector: main: Startet [e-mailbeskyttet] {SSL, (ssl, alpn, h2)} {0,0 .0.0: 8443} INFO: oejs.Server: main: Startet @ 872ms

2.4. Aktivering af yderligere moduler

På samme måde kan vi aktivere andre moduler som f.eks http og http2c:

java -jar $ JETTY_HOME / start.jar --add-to-start = http, http2c

Lad os kontrollere logfiler:

INFO: oejs.AbstractConnector: main: Startet [email protected] {SSL, (ssl, alpn, h2)} {0.0.0.0:8443} INFO: oejs.AbstractConnector: main: Started [email protected] {HTTP / 1.1, ( http / 1.1, h2c)} {0.0.0.0:8080} INFO: oejs.Server: main: Started @ 685ms

Vi kan også liste alle moduler leveret af Jetty:

java -jar $ JETTY_HOME / start.jar --list-modules

Outputtet ser ud som:

Tilgængelige moduler: =================== tags: [-intern] Moduler til tag '*': ---------------- ---- Modul: alpn: Aktiverer TLPN-udvidelsen ALPN (Application Layer Protocol Negotiation). Afhængigt: ssl, alpn-impl LIB: lib / jetty-alpn-client - $ {jetty.version} .jar LIB: lib / jetty-alpn-server - $ {jetty.version} .jar XML: etc / jetty-alpn .xml Enabled: transitiv udbyder af alpn til http2 // ... Moduler til tag 'connector': ---------------------------- Modul: http2: Aktiverer understøttelse af HTTP2-protokol på TLS (SSL) -stikket: ved hjælp af ALPN-udvidelsen til at vælge hvilken protokol, der skal bruges. Tags: stik, http2, http, ssl Afhængigt: ssl, alpn LIB: lib / http2 / *. Jar XML: etc / jetty-http2.xml Enabled: $ {jetty.base} /start.ini // ... Enabled Moduler: ================= 0) alpn-impl / alpn-8 dynamisk afhængighed af alpn-impl 1) http2 $ {jetty.base} /start.ini // .. .

2.5. Yderligere konfiguration

Svarende til –Liste-moduler argument, vi kan bruge –List-config for at liste alle XML-konfigurationsfiler for hvert modul:

java -jar $ JETTY_HOME / start.jar --list-config

For at konfigurere de almindelige egenskaber som vært og Havn for Jetty-serveren kan vi foretage ændringer i start.ini fil:

jetty.ssl.host = 0.0.0.0 jetty.ssl.port = 8443 jetty.ssl.idleTimeout = 30000

Der er også nogle få http2 egenskaber som maxConcurrentStreams og maxSettingsKeys som vi kan konfigurere:

anløbsbro.http2.maxConcurrentStreams = 128 anløbsbro.http2.initialStreamRecvWindow = 524288 anløbsbro.http2.initialSessionRecvWindow = 1048576 jetty.http2.maxSettingsKeys = 64 jetty.http2.

3. Opsætning af en Jetty Server-applikation

3.1. Maven-konfiguration

Nu hvor vi har konfigureret Jetty, er det tid til at oprette vores applikation.

Lad os tilføje anløbsbro-plugin Maven-plugin til vores pom.xml sammen med Maven afhængigheder som http2-server, jetty-alpn-openjdk8-serverog anløbsbroer:

   org.eclipse.jetty jetty-maven-plugin 9.4.27.v20200227 org.eclipse.jetty.http2 http2-server 9.4.27.v20200227 org.eclipse.jetty jetty-alpn-openjdk8-server 9.4.27.v20200227 org.eclipse .jetty anløbsbroer 9.4.27.v20200227 

Derefter kompilerer vi klasserne ved hjælp af kommandoen Maven:

mvn ren pakke

Og endelig kan vi implementere vores usamlede Maven-app til Jetty-serveren:

mvn anløbsbro: løbegaffel

Som standard starter serveren på port 8080 med HTTP / 1.1-protokollen:

oejmp.Starter: main: Startet Jetty Server oejs.AbstractConnector: main: Startet [email protected] {HTTP / 1.1, (http / 1.1)} {0.0.0.0:8080} oejs.Server: main: Startet @ 1045ms

3.2. Konfigurer HTTP / 2 i jetty.xml

Dernæst konfigurerer vi Jetty-serveren med HTTP / 2-protokollen i vores jetty.xml fil ved at tilføje den relevante Opkald element:

             alpn h2 8444 

Her er HTTP / 2-stikket konfigureret med ALPN på port 8444 sammen med sslContextFactory og httpConfig configs.

Vi kan også tilføje andre moduler som f.eks h2-17 og h2-16 (kladdeversioner af h2) ved at definere kommaseparerede argumenter i jetty.xml:

  h2, h2-17, h2-16 

Derefter konfigurerer vi placeringen af jetty.xml i vores pom.xml:

 org.eclipse.jetty jetty-maven-plugin 9.4.27.v20200227 8888 afslut -Xbootclasspath / p: $ {settings.localRepository} /org/mortbay/jetty/alpn/alpn-boot/8.1.11.v20170118/alpn-boot -8.1.11.v20170118.jar $ {basedir} /src/main/config/jetty.xml / ... 

Bemærk: For at aktivere HTTP / 2 i vores Java 8-app, vi har tilføjet alpn-boot-krukke til JVM BootClasspath. Imidlertid, ALPN-support er allerede tilgængelig i Java 9 eller nyere.

Lad os kompilere vores klasser igen og køre programmet igen for at kontrollere, om HTTP / 2-protokollen er aktiveret:

oejmp.Starter: main: Startet Jetty Server oejs.AbstractConnector: main: Startet [email protected] {SSL, (ssl, http / 1.1)} {0.0.0.0:8443} oejs.AbstractConnector: main: Started [email protected] { SSL, (ssl, alpn, h2)} {0.0.0.0:8444}

Her kan vi observere den havn 8443 er konfigureret med HTTP / 1.1-protokollen og 8444 med HTTP / 2.

3.3. Konfigurer PushCacheFilter

Dernæst har vi brug for et filter, der skubber de sekundære ressourcer som billeder, JavaScript og CSS til klienten.

For at gøre det kan vi bruge PushCacheFilter klasse tilgængelig i org.eclipse.jetty.servlets pakke. PushCacheFilter bygger en cache med sekundære ressourcer tilknyttet en primær ressource som index.html og skubber dem til klienten.

Lad os konfigurere PushCacheFilter i vores web.xml:

 skub org.eclipse.jetty.servlets.PushCacheFilter-porte 8444 push / * 

3.4. Konfigurer Jetty Servlet og Servlet Mapping

Derefter opretter vi Http2JettyServlet klasse for at få adgang til billederne, og vi tilføjer servlet-kortlægning i vores web.xml fil:

 http2Jetty com.baeldung.jetty.http2.Http2JettyServlet http2Jetty / images / * 

4. Opsætning af HTTP / 2-klienten

Endelig opretter vi en for at kontrollere HTTP / 2 Push-funktionen og den forbedrede sideindlæsningstid http2.html fil, der indlæser et par billeder (sekundære ressourcer):

   Baeldung HTTP / 2 klient i anløbsbro 

HTTP / 2-demo

5. Test af HTTP / 2-klienten

For at få en basislinje for sideindlæsningstiden, lad os få adgang til HTTP / 1.1-applikationen på //localhost:8443/http2.html med udviklerværktøjerne for at kontrollere protokollen og indlæsningstiden:

Her kan vi se, at billederne indlæses i 3-6ms ved hjælp af HTTP / 1.1-protokollen.

Derefter får vi adgang til HTTP / 2-applikationen, som har Push aktiveret, kl //localhost:8444/http2.html:

Her observerer vi, at protokollen er h2initiativtager er Skubbe, og indlæsningstiden er 1 ms for alle billederne (sekundære ressourcer).

Derfor er den PushCacheFilter cacher de sekundære ressourcer til http2.html, skubber dem på porten 8444, og giver en stor forbedring af sidens indlæsningstid.

6. Konklusion

I denne vejledning har vi udforsket HTTP / 2 i anløbsbro.

Først undersøgte vi, hvordan man startede Jetty med HTTP / 2-protokollen sammen med dens konfigurationer.

Derefter har vi set en Java 8-webapplikation med HTTP / 2 Push-funktionen, konfigureret med en PushCacheFilterog observerede, hvordan indlæsningstiden for en side, der indeholder sekundære ressourcer, forbedrede sig i forhold til det, vi så med HTTP / 1.1-protokollen.

Som normalt er alle kodeimplementeringer tilgængelige på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found