HTTP / 2 na móle

1. Prehľad

Protokol HTTP / 2 sa dodáva s funkcia push, ktorá umožňuje serveru poslať klientovi viac zdrojov na jednu žiadosť. Zlepšuje preto čas načítania stránky znížením počtu spiatočných letov potrebných na načítanie všetkých zdrojov.

Jetty podporuje protokol HTTP / 2 pre implementáciu klienta aj servera.

V tomto tutoriáli preskúmame podporu protokolu HTTP / 2 v Jetty a vytvoríme webovú aplikáciu Java na preskúmanie funkcie HTTP / 2 Push.

2. Začíname

2.1. Sťahuje sa mólo

Mólo vyžaduje pre spustenie protokolu HTTP / 2 podporu JDK 8 alebo novšiu a podporu ALPN (Application-Layer Protocol Negotiation).

Typicky server Jetty je nasadený cez SSL a umožňuje protokol HTTP / 2 cez rozšírenie TLS (ALPN).

Najskôr si budeme musieť stiahnuť najnovšiu distribúciu Jetty a nastaviť JETTY_HOME premenná.

2.2. Povolenie konektora HTTP / 2

Ďalej môžeme pomocou príkazu Java povoliť konektor HTTP / 2 na serveri Jetty:

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

Tento príkaz pridáva podporu protokolu HTTP / 2 ku konektoru SSL na porte 8443. Prechodne tiež umožňuje modulu ALPN pre vyjednávanie protokolu:

INFO: server je prechodne povolený, šablóna ini je k dispozícii s --add-to-start = server INFO: alpn-impl / alpn-1.8.0_131 dynamická závislosť alpn-impl / alpn-8 INFO: alpn-impl je přechodně povolen INFO: alpn prechodne povolená, šablóna ini dostupná s --add-to-start = alpn INFO: alpn-impl / alpn-8 dynamická závislosť alpn-impl INFO: http2 inicializovaná v $ {jetty.base} /start.ini INFO: ssl prechodne povolené, ini šablóna k dispozícii s --add-to-start = ssl INFO: threadpool prechodne povolená, ini šablóna k dispozícii s --add-to-start = threadpool INFO: bytebufferpool prechodne povolená, ini šablóna k dispozícii s --add-to- start = bytebufferpool INFO: Bol zmenený základný adresár

Tu sa v denníkoch zobrazujú informácie o moduloch ako ssl a alpn-impl / alpn-8 ktoré sú prechodne povolené pre konektor HTTP / 2.

2.3. Spustenie servera Jetty

Teraz sme pripravení spustiť server Jetty:

java -jar $ JETTY_HOME / start.jar

Keď sa server spustí, v protokole sa zobrazia povolené moduly:

INFO :: main: Prihlásenie inicializované @ 228ms na org.eclipse.jetty.util.log.StdErrLog ... INFO: oejs.AbstractConnector: main: Started [email protected] {SSL, (ssl, alpn, h2)} {0,0 .0.0: 8443} INFO: oejs.Server: main: Started @ 872ms

2.4. Povolenie ďalších modulov

Podobne môžeme povoliť ďalšie moduly ako http a http2c:

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

Poďme si overiť protokoly:

INFO: oejs.AbstractConnector: main: Started [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

Môžeme tiež uviesť zoznam všetkých modulov, ktoré poskytuje Jetty:

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

Výstup bude vyzerať takto:

Dostupné moduly: =================== tagy: [-interné] Moduly pre tag '*': ---------------- ---- Modul: alpn: Povolí rozšírenie TLS ALPN (Application Layer Protocol Negotiation). Závisí: ssl, alpn-impl LIB: lib / jetty-alpn-client - $ {jetty.version} .jar LIB: lib / jetty-alpn-server - $ {jetty.version} .jar XML: etc / jetty-alpn .xml povolené: tranzitívny poskytovateľ alpn pre http2 // ... moduly pre značku 'konektor': ---------------------------- Modul: http2: Povolí podporu protokolu HTTP2 na konektore TLS (SSL): pomocou rozšírenia ALPN vyberte, ktorý protokol sa má použiť. Značky: connector, http2, http, ssl Závisí: ssl, alpn LIB: lib / http2 / *. Jar XML: etc / jetty-http2.xml povolené: $ {jetty.base} /start.ini // ... povolené Moduly: ================ 0) alpn-impl / alpn-8 dynamická závislosť alpn-impl 1) http2 $ {jetty.base} /start.ini // .. .

2.5. Dodatočná konfigurácia

Podobne ako v –Zoznam-modulov argument, môžeme použiť –List-config pre zoznam všetkých konfiguračných súborov XML pre každý modul:

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

Ak chcete nakonfigurovať spoločné vlastnosti ako hostiteľ a prístav pre server Jetty môžeme robiť zmeny v start.ini spis:

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

Tiež je ich niekoľko http2 vlastnosti ako maxConcurrentStreams a maxSettingsKeys ktoré môžeme nakonfigurovať:

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

3. Nastavenie aplikácie servera Jetty

3.1. Konfigurácia Maven

Teraz, keď máme nakonfigurované Jetty, je čas vytvoriť našu aplikáciu.

Pridajme jetty-maven-plugin Maven plugin do nášho pom.xml spolu s Maven závislosťami ako server http2, jetty-alpn-openjdk8-servera móla-servlety:

   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 Jetty-Servlets 9.4.27.V20200227 

Potom triedy zostavíme pomocou príkazu Maven:

mvn čistý balíček

A nakoniec môžeme nasadiť našu nezloženú aplikáciu Maven na server Jetty:

mvn mólo: rozvetvené vidlicou

Server sa štandardne spúšťa na porte 8080 s protokolom HTTP / 1.1:

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

3.2. Nakonfigurujte HTTP / 2 v mólo.xml

Ďalej nakonfigurujeme server Jetty s protokolom HTTP / 2 v našom mólo.xml súboru pridaním príslušného súboru Volaj element:

             alpn h2 8444 

Tu je konektor HTTP / 2 nakonfigurovaný s ALPN na porte 8444 spolu s sslContextFactory a httpConfig konfigurácie.

Môžeme tiež pridať ďalšie moduly ako h2-17 a h2-16 (návrh verzie h2) definovaním argumentov oddelených čiarkou v mólo.xml:

  h2, h2-17, h2-16 

Potom nakonfigurujeme umiestnenie súboru mólo.xml v našom pom.xml:

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

Poznámka: Ak chcete povoliť protokol HTTP / 2 v našej aplikácii Java 8, pridali sme alpn-boot jar do JVM BootClasspath. Avšak Podpora ALPN je už k dispozícii v prostredí Java 9 alebo novšom.

Poďme znova skompilovať naše triedy a znovu spustiť aplikáciu a overiť, či je povolený protokol HTTP / 2:

oejmp.Starter: main: Started 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}

Tu môžeme tento prístav pozorovať 8443 je nakonfigurovaný s protokolom HTTP / 1.1 a 8444 s HTTP / 2.

3.3. Nakonfigurujte PushCacheFilter

Ďalej potrebujeme filter, ktorý do klienta tlačí sekundárne zdroje, ako sú obrázky, JavaScript a CSS.

K tomu môžeme použiť PushCacheFilter trieda k dispozícii v org.eclipse.jetty.servlets balíček. PushCacheFilter vytvára medzipamäť sekundárnych zdrojov spojených s primárnym zdrojom, ako je index.html a tlačí ich ku klientovi.

Poďme nakonfigurovať PushCacheFilter v našom web.xml:

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

3.4. Nakonfigurujte Jetty Servlet a Mapovanie servletov

Potom vytvoríme Http2JettyServlet triedy na prístup k obrázkom a my pridáme mapovanie servletu v našom web.xml spis:

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

4. Nastavenie klienta HTTP / 2

Nakoniec na overenie funkcie HTTP / 2 Push a vylepšeného času načítania stránky vytvoríme http2.html súbor, ktorý načíta niekoľko obrázkov (sekundárne zdroje):

   Klient Baeldung HTTP / 2 na móle 

Ukážka HTTP / 2

5. Testovanie klienta HTTP / 2

Ak chcete získať základňu pre čas načítania stránky, otvorme si aplikáciu HTTP / 1.1 na adrese //localhost:8443/http2.html pomocou Nástrojov pre vývojárov na overenie protokolu a času načítania:

Tu môžeme pozorovať, že obrázky sa načítajú za 3 - 6 ms pomocou protokolu HTTP / 1.1.

Potom vstúpime do aplikácie HTTP / 2, ktorá má povolený Push, na //localhost:8444/http2.html:

Tu pozorujeme, že protokol je h2, je iniciátor Tam, a doba načítania je 1 ms pre všetky obrázky (sekundárne zdroje).

Preto PushCacheFilter uloží sekundárne zdroje do http2.html, tlačí ich do prístavu 8444a poskytuje veľké zlepšenie v načítaní stránky.

6. Záver

V tomto tutoriáli sme preskúmali protokol HTTP / 2 v Jetty.

Najskôr sme preskúmali, ako spustiť Jetty s protokolom HTTP / 2 a jeho konfiguráciami.

Potom sme videli webovú aplikáciu Java 8 s funkciou HTTP / 2 Push, nakonfigurovanú s PushCacheFiltera sledovali sme, ako sa zlepšila doba načítania stránky obsahujúcej sekundárne zdroje oproti tomu, čo sme videli pri protokole HTTP / 1.1.

Ako obvykle sú všetky implementácie kódu dostupné na GitHub.


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