HTTP / 2 u Jettyju

1. Pregled

HTTP / 2 protokol dolazi s push značajka koja omogućuje poslužitelju da klijentu pošalje više resursa za jedan zahtjev. Stoga poboljšava vrijeme učitavanja stranice smanjenjem višestrukih povratnih putovanja potrebnih za dohvaćanje svih resursa.

Jetty podržava HTTP / 2 protokol za implementaciju klijenta i poslužitelja.

U ovom uputstvu istražit ćemo podršku za HTTP / 2 u Jettyu i stvoriti Java web aplikaciju za ispitivanje značajke HTTP / 2 Push.

2. Početak rada

2.1. Preuzimanje Jettyja

Jetty zahtijeva JDK 8 ili noviji i ALPN (Application-Layer Protocol Negotiation Protocol) podršku za pokretanje HTTP / 2.

Tipično, Jetty poslužitelj raspoređen je preko SSL-a i omogućava HTTP / 2 protokol putem TLS proširenja (ALPN).

Prvo ćemo morati preuzeti najnoviju distribuciju Jettyja i postaviti JETTY_HOME varijabilna.

2.2. Omogućavanje HTTP / 2 konektora

Dalje, pomoću naredbe Java možemo omogućiti HTTP / 2 konektor na Jetty poslužitelju:

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

Ova naredba dodaje podršku za HTTP / 2 protokol SSL konektoru na portu 8443. Također, tranzitivno omogućuje ALPN modul za pregovaranje o protokolu:

INFO: poslužitelj tranzitivno omogućen, ini predložak dostupan s --add-to-start = server INFO: alpn-impl / alpn-1.8.0_131 dinamička ovisnost alpn-impl / alpn-8 INFO: alpn-impl tranzitivno omogućen INFO: alpn tranzitivno omogućen, ini predložak dostupan s --add-to-start = alpn INFO: alpn-impl / alpn-8 dinamička ovisnost alpn-impl INFO: http2 inicijaliziran u $ {jetty.base} /start.ini INFO: ssl tranzitivno omogućen, ini predložak dostupan s --add-to-start = ssl INFO: threadpool tranzitivno omogućen, ini predložak dostupan s --add-to-start = threadpool INFO: bytebufferpool tranzitivno omogućen, ini predložak dostupan s --add-to- start = bytebufferpool INFO: Izmijenjen je osnovni direktorij

Ovdje zapisnici prikazuju informacije o modulima poput ssl i alpn-impl / alpn-8 koji su tranzitivno omogućeni za HTTP / 2 konektor.

2.3. Pokretanje Jetty poslužitelja

Sada smo spremni za pokretanje Jetty poslužitelja:

java -jar $ JETTY_HOME / start.jar

Kada se poslužitelj pokrene, zapisivanje će prikazati omogućene module:

INFO :: glavno: Evidentiranje je inicijalizirano @ 228ms na org.eclipse.jetty.util.log.StdErrLog ... INFO: oejs.AbstractConnector: main: Započeto [zaštićen e-poštom] {SSL, (ssl, alpn, h2)} {0.0 .0.0: 8443} INFO: oejs.Server: main: Started @ 872ms

2.4. Omogućavanje dodatnih modula

Slično tome, možemo omogućiti i druge module poput http i http2c:

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

Provjerimo zapisnike:

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: Započeto @ 685ms

Također, možemo navesti sve module koje pruža Jetty:

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

Izlaz će izgledati ovako:

Dostupni moduli: ================== oznake: [-internal] Moduli za oznaku '*': ---------------- ---- Modul: alpn: Omogućuje TLS proširenje ALPN (pregovaranje o protokolu sloja aplikacija). Ovisi: ssl, alpn-impl LIB: lib / jetty-alpn-client - $ {jetty.version} .jar LIB: lib / jetty-alpn-server - $ {jetty.version} .jar XML: etc / jetty-alpn .xml Omogućeno: prijelazni davatelj alpn za http2 // ... Moduli za oznaku 'konektor': ---------------------------- Modul: http2: Omogućuje podršku za HTTP2 protokol na TLS (SSL) priključku,: pomoću proširenja ALPN za odabir protokola koji će se koristiti. Oznake: konektor, http2, http, ssl Ovisi: ssl, alpn LIB: lib / http2 / *. Jar XML: etc / jetty-http2.xml Omogućeno: $ {jetty.base} /start.ini // ... Omogućeno Moduli: ================ 0) alpn-impl / alpn-8 dinamička ovisnost alpn-impl 1) http2 $ {jetty.base} /start.ini // .. .

2.5. Dodatna konfiguracija

Slično kao –List-moduli argument, možemo koristiti –List-config za popis svih XML konfiguracijskih datoteka za svaki modul:

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

Da biste konfigurirali uobičajena svojstva poput domaćin i luka za Jetty poslužitelj možemo izvršiti promjene u start.ini datoteka:

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

Također, ima ih nekoliko http2 svojstva poput maxConcurrentStreams i maxSettingsKeys koje možemo konfigurirati:

jetty.http2.maxConcurrentStreams = 128 jetty.http2.initialStreamRecvWindow = 524288 jetty.http2.initialSessionRecvWindow = 1048576 jetty.http2.maxSettingsKeys = 64 jetty.http2.rateContsrol.Control.Control

3. Postavljanje aplikacije Jetty Server

3.1. Maven konfiguracija

Sad kad smo konfigurirali Jetty, vrijeme je za stvaranje naše aplikacije.

Dodajmo i dodatak za jetty-maven Maven dodatak za naš pom.xml zajedno s Mavenovim ovisnostima poput http2-poslužitelj, jetty-alpn-openjdk8-poslužitelj, i morski servleti:

   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 .mlazni mlaz-servleti 9.4.27.v20200227 

Zatim ćemo kompajlirati klase pomoću naredbe Maven:

mvn čist paket

I na kraju, našu neotvorenu aplikaciju Maven možemo rasporediti na Jetty poslužitelj:

mvn jetty: trčanje-račvanje

Prema zadanim postavkama, poslužitelj se pokreće na priključku 8080 s HTTP / 1.1 protokolom:

oejmp.Starter: main: Pokrenut Jetty Server oejs.AbstractConnector: main: Pokrenut [zaštićen e-poštom] {HTTP / 1.1, (http / 1.1)} {0.0.0.0:8080} oejs.Server: main: Pokrenut @ 1045ms

3.2. Konfigurirajte HTTP / 2 in jetty.xml

Dalje, konfigurirat ćemo Jetty poslužitelj s HTTP / 2 protokolom u našem jetty.xml datoteku dodavanjem odgovarajuće Poziv element:

             alpn h2 8444 

Ovdje je HTTP / 2 konektor konfiguriran s ALPN na priključku 8444 zajedno s sslContextFactory i httpConfig konfiguracije.

Također, možemo dodati i druge module poput h2-17 i h2-16 (skice inačica h2) definiranjem argumenata odvojenih zarezom u jetty.xml:

  h2, h2-17, h2-16 

Zatim ćemo konfigurirati mjesto jetty.xml u našem 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 / ... 

Napomena: Da biste omogućili HTTP / 2 u našoj aplikaciji Java 8, dodali smo alpn-staklenka na JVM BootClasspath. Međutim, Podrška za ALPN već je dostupna u Javi 9 ili novijoj.

Ponovno prevedimo naše klase i ponovno pokrenimo aplikaciju da provjerimo je li omogućen protokol HTTP / 2:

oejmp. SSL, (ssl, alpn, h2)} {0.0.0.0:8444}

Ovdje možemo promatrati tu luku 8443 je konfiguriran s protokolom HTTP / 1.1 i 8444 s HTTP / 2.

3.3. Konfigurirajte PushCacheFilter

Dalje, trebamo filtar koji klijentu gura sekundarne resurse poput slika, JavaScript-a i CSS-a.

Da bismo to učinili, možemo koristiti PushCacheFilter klasa dostupna u org.eclipse.jetty.servlets paket. PushCacheFilter gradi predmemoriju sekundarnih resursa povezanih s primarnim resursom poput index.html i gura ih prema klijentu.

Konfigurirajmo PushCacheFilter u našem web.xml:

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

3.4. Konfigurirajte Jetty Servlet i Mapiranje servleta

Zatim ćemo stvoriti Http2JettyServlet razreda za pristup slikama, a mi ćemo dodati mapiranje servleta u našem web.xml datoteka:

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

4. Postavljanje HTTP / 2 klijenta

Konačno, da bismo provjerili značajku HTTP / 2 Push i poboljšano vrijeme učitavanja stranice, stvorit ćemo http2.html datoteka koja učitava nekoliko slika (sekundarni resursi):

   Baeldung HTTP / 2 klijent u pomolu 

HTTP / 2 Demo

5. Testiranje HTTP / 2 klijenta

Da bismo dobili osnovnu vrijednost za vrijeme učitavanja stranice, pristupimo aplikaciji HTTP / 1.1 na //localhost:8443/http2.html s Developer Tools za provjeru protokola i vremena učitavanja:

Ovdje možemo primijetiti da se slike učitavaju za 3-6 ms pomoću HTTP / 1.1 protokola.

Zatim ćemo pristupiti aplikaciji HTTP / 2, koja ima omogućen Push, na adresi //localhost:8444/http2.html:

Ovdje primjećujemo da je protokol h2, inicijator je Gurnuti, a vrijeme učitavanja je 1 ms za sve slike (sekundarni resursi).

Stoga je PushCacheFilter kešira sekundarne resurse za http2.html, gura ih u luku 8444, i pruža veliko poboljšanje u vremenu učitavanja stranice.

6. Zaključak

U ovom uputstvu istražili smo HTTP / 2 u Jettyju.

Prvo smo ispitali kako pokrenuti Jetty s HTTP / 2 protokolom zajedno s njegovim konfiguracijama.

Zatim smo vidjeli web aplikaciju Java 8 sa značajkom HTTP / 2 Push, konfiguriranu s PushCacheFilteri primijetili kako se vrijeme učitavanja stranice koja sadrži sekundarne resurse poboljšalo u odnosu na ono što smo vidjeli s protokolom HTTP / 1.1.

Kao i obično, sve implementacije koda dostupne su na GitHubu.