HTTP / 2 i brygge

1. Oversikt

HTTP / 2-protokollen kommer med en push-funksjon som lar serveren sende flere ressurser til klienten for en enkelt forespørsel. Derfor forbedrer det lastetiden på siden ved å redusere flere rundturer som trengs for å hente alle ressursene.

Jetty støtter HTTP / 2-protokollen for både klient- og serverimplementeringer.

I denne opplæringen vil vi utforske HTTP / 2-støtte i Jetty og opprette en Java-webapplikasjon for å undersøke HTTP / 2 Push-funksjonen.

2. Komme i gang

2.1. Laster ned brygge

Jetty krever JDK 8 eller nyere og ALPN-støtte (Application-Layer Protocol Negotiation) for å kjøre HTTP / 2.

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

Først må vi laste ned den nyeste bryggedistribusjonen og angi JETTY_HOME variabel.

2.2. Aktivere HTTP / 2-kontakten

Deretter kan vi bruke en Java-kommando for å aktivere HTTP / 2-kontakten på Jetty-serveren:

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

Denne kommandoen legger til HTTP / 2-protokollstøtte til SSL-kontakten på porten 8443. Det muliggjør også ALPN-modulen for protokollforhandling:

INFO: server aktivt aktivert, ini-mal tilgjengelig med --add-to-start = server INFO: alpn-impl / alpn-1.8.0_131 dynamisk avhengighet av alpn-impl / alpn-8 INFO: alpn-impl transitivt aktivert INFO: alpn transitt aktivert, ini mal tilgjengelig med --add-to-start = alpn INFO: alpn-impl / alpn-8 dynamisk avhengighet av alpn-impl INFO: http2 initialisert i $ {jetty.base} /start.ini INFO: ssl transitively aktivert, ini mal tilgjengelig med --add-to-start = ssl INFO: threadpool transitively enabled, ini mal tilgjengelig med --add-to-start = threadpool INFO: bytebufferpool transitively enabled, ini mal tilgjengelig med --add-to- start = bytebufferpool INFO: Basekatalogen ble endret

Her viser loggene informasjonen til moduler som ssl og alpn-impl / alpn-8 som er aktivert transitt for HTTP / 2-kontakten.

2.3. Starter Jetty Server

Nå er vi klare til å starte Jetty-serveren:

java -jar $ JETTY_HOME / start.jar

Når serveren starter, viser loggingen modulene som er aktivert:

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

2.4. Aktivere tilleggsmoduler

På samme måte kan vi aktivere andre moduler som http og http2c:

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

La oss verifisere loggene:

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

Vi kan også liste opp alle modulene som leveres av Jetty:

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

Utgangen vil se ut som:

Tilgjengelige moduler: =================== tagger: [-intern] Moduler for tag '*': ---------------- ---- Modul: alpn: Aktiverer TLPN-utvidelsen ALPN (Application Layer Protocol Negotiation). Avhengig: ssl, alpn-impl LIB: lib / jetty-alpn-client - $ {jetty.version} .jar LIB: lib / jetty-alpn-server - $ {jetty.version} .jar XML: etc / jetty-alpn .xml aktivert: transitiv leverandør av alpn for http2 // ... Moduler for tag 'connector': ---------------------------- Modul: http2: Aktiverer HTTP2-protokollstøtte på TLS (SSL) -kontakten,: bruker ALPN-utvidelsen til å velge hvilken protokoll som skal brukes. Merkelapper: kobling, http2, http, ssl Avhengig: ssl, alpn LIB: lib / http2 / *. Jar XML: etc / jetty-http2.xml Aktivert: $ {jetty.base} /start.ini // ... Aktivert Moduler: ================ 0) alpn-impl / alpn-8 dynamisk avhengighet av alpn-impl 1) http2 $ {jetty.base} /start.ini // .. .

2.5. Tilleggskonfigurasjon

I likhet med –Liste-moduler argument, kan vi bruke –List-config for å liste opp alle XML-konfigurasjonsfilene for hver modul:

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

For å konfigurere de vanlige egenskapene som vert og havn for Jetty-serveren, kan vi gjøre endringer i start.ini fil:

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

Det er også noen få http2 egenskaper som maxConcurrentStreams og maxSettingsKeys som vi kan konfigurere:

brygge.http2.maxConcurrentStreams = 128 brygge.http2.initialStreamRecvWindow = 524288 brygge.http2.initialSessionRecvWindow = 1048576 jetty.http2.maxSettingsKeys = 64 jetty.http2.rateControl.er

3. Sette opp en bryggeserverapplikasjon

3.1. Maven-konfigurasjon

Nå som vi har konfigurert brygge, er det på tide å lage applikasjonen vår.

La oss legge til jetty-maven-plugin Maven plugin til vår pom.xml sammen med Maven avhengigheter som http2-server, jetty-alpn-openjdk8-server, og brygge-servlets:

   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 brygge-servlets 9.4.27.v20200227 

Deretter kompilerer vi klassene ved hjelp av Maven-kommandoen:

mvn ren pakke

Og til slutt kan vi distribuere vår umonterte Maven-app til Jetty-serveren:

mvn brygge: løpegaffel

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

oejmp.Starter: main: Startet Jetty Server oejs.AbstractConnector: main: Started [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

Deretter konfigurerer vi Jetty-serveren med HTTP / 2-protokollen i vår jetty.xml filen ved å legge til den aktuelle Anrop element:

             alpn h2 8444 

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

Vi kan også legge til andre moduler som h2-17 og h2-16 (utkast til versjoner av h2) ved å definere kommaseparerte argumenter i jetty.xml:

  h2, h2-17, h2-16 

Deretter konfigurerer vi plasseringen til jetty.xml i vår pom.xml:

 org.eclipse.jetty jetty-maven-plugin 9.4.27.v20200227 8888 avslutte -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 / ... 

Merk: For å aktivere HTTP / 2 i Java 8-appen vår, vi har lagt til alpn-boot jar til JVM BootClasspath. Derimot, ALPN-støtte er allerede tilgjengelig i Java 9 eller nyere.

La oss kompilere klassene våre på nytt og kjøre applikasjonen på nytt for å verifisere om HTTP / 2-protokollen er aktivert:

oejmp.Starter: main: Startet Jetty Server oejs.AbstractConnector: main: Started [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 porten 8443 er konfigurert med HTTP / 1.1-protokollen og 8444 med HTTP / 2.

3.3. Konfigurer PushCacheFilter

Deretter trenger vi et filter som skyver sekundære ressurser som bilder, JavaScript og CSS til klienten.

For å gjøre det kan vi bruke PushCacheFilter klasse tilgjengelig i org.eclipse.jetty.servlets pakke. PushCacheFilter bygger en cache med sekundære ressurser knyttet til en primær ressurs som index.html og skyver dem til klienten.

La oss konfigurere PushCacheFilter i vår web.xml:

 push org.eclipse.jetty.servlets.PushCacheFilter porter 8444 push / * 

3.4. Konfigurer Jetty Servlet og Servlet Mapping

Deretter lager vi Http2JettyServlet klasse for å få tilgang til bildene, så legger vi til servlet-mapping i vår web.xml fil:

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

4. Sette opp HTTP / 2-klienten

Til slutt, for å bekrefte HTTP / 2 Push-funksjonen og den forbedrede sideinnlastingstiden, oppretter vi en http2.html fil som laster inn noen få bilder (sekundære ressurser):

   Baeldung HTTP / 2 klient i brygge 

HTTP / 2 Demo

5. Testing av HTTP / 2-klienten

La oss få tilgang til HTTP / 1.1-applikasjonen på for å få en basislinje for sidelastningstiden //localhost:8443/http2.html med utviklerverktøyene for å verifisere protokollen og lastetiden:

Her kan vi observere at bildene lastes inn i 3-6ms ved hjelp av HTTP / 1.1-protokollen.

Deretter får vi tilgang til HTTP / 2-applikasjonen, som har Push aktivert, kl //localhost:8444/http2.html:

Her observerer vi at protokollen er h2er initiativtakeren Trykk, og lastetiden er 1 ms for alle bildene (sekundære ressurser).

derfor PushCacheFilter cacher sekundære ressurser for http2.html, skyver dem på porten 8444, og gir en stor forbedring i ladetiden til siden.

6. Konklusjon

I denne veiledningen har vi utforsket HTTP / 2 i brygge.

Først undersøkte vi hvordan du starter Jetty med HTTP / 2-protokollen sammen med konfigurasjonene.

Deretter har vi sett en Java 8-webapplikasjon med HTTP / 2 Push-funksjonen, konfigurert med en PushCacheFilter, og observerte hvordan lastetiden til en side som inneholder sekundære ressurser, ble bedre enn det vi så med HTTP / 1.1-protokollen.

Som vanlig er alle kodeimplementeringene tilgjengelige på GitHub.


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