HTTP / 2 במזח

1. סקירה כללית

פרוטוקול HTTP / 2 מגיע עם תכונת דחיפה המאפשרת לשרת לשלוח מספר רב של משאבים ללקוח לבקשה אחת. לפיכך, זה משפר את זמן הטעינה של הדף על ידי צמצום מספר ההסעות הלוך ושוב הדרוש כדי להשיג את כל המשאבים.

Jetty תומך בפרוטוקול HTTP / 2 ליישומי לקוח וגם לשרת.

במדריך זה נחקור תמיכה ב- HTTP / 2 במזח וניצור יישום אינטרנט של Java לבחינת תכונת ה- HTTP / 2 Push.

2. תחילת העבודה

2.1. מוריד מזח

Jetty דורש JDK 8 ואילך ותמיכה ב- ALPN (Application-Layer Protocol Negotiation Negotiation) להפעלת HTTP / 2.

בדרך כלל, שרת המזח נפרס באמצעות SSL ומאפשר את פרוטוקול HTTP / 2 באמצעות סיומת TLS (ALPN).

ראשית, נצטרך להוריד את הפצת Jetty האחרונה ולהגדיר את JETTY_HOME מִשְׁתַנֶה.

2.2. הפעלת מחבר HTTP / 2

לאחר מכן נוכל להשתמש בפקודת Java להפעלת מחבר HTTP / 2 בשרת Jetty:

java -jar $ JETTY_HOME / start.jar - להוסיף-להתחלה = http2

פקודה זו מוסיפה תמיכה בפרוטוקול HTTP / 2 למחבר SSL ביציאה 8443. כמו כן, הוא מאפשר באופן מעברי את מודול ALPN למשא ומתן על פרוטוקולים:

INFO: שרת מופעל באופן מעברי, תבנית ini זמינה עם --add-to-start = server INFO: alpn-impl / alpn-1.8.0_131 תלות דינמית של alpn-impl / alpn-8 INFO: alpn-impl מופעלת באופן זמני INFO: alpn מופעלת באופן מעברי, תבנית ini זמינה עם --add-to-start = alpn INFO: alpn-impl / alpn-8 תלות דינמית של alpn-impl INFO: http2 מאותחל ב- $ {jetty.base} /start.ini INFO: ssl מעבר מופעלת, תבנית ini זמינה עם --add-to-start = ssl INFO: threadpool מופעלת באופן תמידי, תבנית ini זמינה עם --add-to-start = threadpool INFO: bytebufferpool מופעלת באופן זמני, תבנית ini זמינה עם --add-to- התחלה = bytebufferpool INFO: ספריית הבסיס שונתה

כאן, היומנים מציגים את המידע של מודולים כמו ssl ו alpn-impl / alpn-8 שמופעלים באופן מעברי עבור מחבר HTTP / 2.

2.3. הפעלת שרת המזח

כעת, אנו מוכנים להפעיל את שרת הג'טי:

java -jar $ JETTY_HOME / start.jar

כאשר השרת מתחיל, הרישום יציג את המודולים המופעלים:

INFO :: main: רישום התחיל @ 228ms ל- org.eclipse.jetty.util.log.StdErrLog ... INFO: oejs.AbstractConnector: main: התחיל [מוגן באמצעות דוא"ל] {SSL, (ssl, alpn, h2)} {0.0 .0.0: 8443} מידע: oejs.Server: ראשי: התחיל @ 872ms

2.4. הפעלת מודולים נוספים

באופן דומה, אנו יכולים לאפשר מודולים אחרים כמו http ו http2c:

java -jar $ JETTY_HOME / start.jar - להוסיף-להתחלה = http, http2c

בואו נאמת את היומנים:

מידע: oejs.AbstractConnector: ראשי: התחיל [מוגן באמצעות דוא"ל] {SSL, (ssl, alpn, h2)} {0.0.0.0:8443} מידע: oejs.AbstractConnector: ראשי: התחיל [מוגן באמצעות דוא"ל] {HTTP / 1.1, ( http / 1.1, h2c)} {0.0.0.0:8080} מידע: oejs.Server: ראשי: התחיל @ 685ms

כמו כן, אנו יכולים לרשום את כל המודולים המסופקים על ידי מזח:

java -jar $ JETTY_HOME / start.jar - רשימת-מודולים

הפלט ייראה כך:

מודולים זמינים: =================== תגיות: [-פנימי] מודולים לתג '*': ---------------- ---- מודול: alpn: מאפשר את סיומת TLPN של ALPN (Application Layer Protocol Negotiation)). תלוי: ssl, alpn-impl LIB: lib / jetty-alpn-client - $ {jetty.version} .jar LIB: lib / jetty-alpn-server - $ {jetty.version} .jar XML: וכו '/ jetty-alpn .xml מופעל: ספק מעבר של alpn עבור http2 // ... מודולים לתג 'מחבר': ---------------------------- מודול: http2: מאפשר תמיכה בפרוטוקול HTTP2 במחבר TLS (SSL): באמצעות סיומת ALPN כדי לבחור באיזה פרוטוקול להשתמש. תגיות: מחבר, http2, http, ssl תלוי: ssl, alpn LIB: lib / http2 / *. Jar XML: etc / jetty-http2.xml מופעל: $ {jetty.base} /start.ini // ... מופעל מודולים: ================= 0) alpn-impl / alpn-8 תלות דינמית של alpn-impl 1) http2 $ {jetty.base} /start.ini // .. .

2.5. תצורה נוספת

דומה ל –מודולים אנו יכולים להשתמש –List-config לרשימת כל קבצי התצורה של XML עבור כל מודול:

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

כדי להגדיר את המאפיינים הנפוצים כמו מנחה ו נמל עבור שרת המזח, אנו יכולים לבצע שינויים ב- התחל.יני קוֹבֶץ:

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

כמו כן, יש כמה http2 מאפיינים כמו maxConcurrentStreams ו maxSettingsKeys שנוכל להגדיר:

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

3. הגדרת יישום שרת מזח

3.1. תצורת Maven

כעת, לאחר שהגדרנו את Jetty, הגיע הזמן ליצור את היישום שלנו.

בואו נוסיף את תוסף jetty-maven תוסף Maven שלנו pom.xml יחד עם תלות של מייבן כמו שרת http2, jetty-alpn-openjdk8-server, ו מזחונים:

   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 

לאחר מכן נערך את השיעורים באמצעות פקודת Maven:

חבילה נקייה mvn

ולבסוף, אנו יכולים לפרוס את אפליקציית Maven הלא מורכבת לשרת הג'טי:

מזח mvn: מזלג רץ

כברירת מחדל, השרת מתחיל ביציאה 8080 עם פרוטוקול HTTP / 1.1:

oejmp.Starter: main: התחיל שרת המזח oejs.AbstractConnector: main: התחיל [מוגן באמצעות דוא"ל] {HTTP / 1.1, (http / 1.1)} {0.0.0.0:8080} oejs.Server: main: התחיל @ 1045ms

3.2. הגדר את HTTP / 2 ב jetty.xml

לאחר מכן, נגדיר את שרת ה- Jetty עם פרוטוקול HTTP / 2 אצלנו jetty.xml קובץ על ידי הוספת המתאים שִׂיחָה אֵלֵמֶנט:

             alpn h2 8444 

כאן, מחבר HTTP / 2 מוגדר עם ALPN ביציאה 8444 ביחד עם sslContextFactory ו httpConfig configs.

כמו כן, אנו יכולים להוסיף מודולים אחרים כמו h2-17 ו h2-16 (גרסאות טיוטה של h2) על ידי הגדרת טיעונים המופרדים בפסיקים ב- jetty.xml:

  h2, h2-17, h2-16 

לאחר מכן, נגדיר את המיקום של ה- jetty.xml בשלנו pom.xml:

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

הערה: כדי להפעיל HTTP / 2 באפליקציית Java 8 שלנו, הוספנו את צנצנת אתחול alpn ל- JVM BootClasspath. למרות זאת, תמיכה ב- ALPN כבר זמינה ב- Java 9 ואילך.

בואו נערך מחדש את הכיתות שלנו ונפעיל מחדש את היישום כדי לוודא אם פרוטוקול HTTP / 2 מופעל:

oejmp.Starter: main: התחיל שרת המזח oejs.AbstractConnector: main: התחיל [מוגן באמצעות דוא"ל] {SSL, (ssl, http / 1.1)} {0.0.0.0:8443} oejs.AbstractConnector: main: התחיל [מוגן בדוא"ל] { SSL, (ssl, alpn, h2)} {0.0.0.0:8444}

כאן אנו יכולים לצפות בנמל זה 8443 מוגדר באמצעות פרוטוקול HTTP / 1.1 ו- 8444 עם HTTP / 2.

3.3. הגדר את PushCacheFilter

לאחר מכן, אנו זקוקים למסנן שדוחף את המשאבים המשניים כמו תמונות, JavaScript ו- CSS ללקוח.

לשם כך, אנו יכולים להשתמש ב- PushCacheFilter בכיתה זמינה org.eclipse.jetty.servlets חֲבִילָה. PushCacheFilter בונה מטמון של משאבים משניים המשויכים למשאב ראשוני כמו index.html ודוחף אותם ללקוח.

בואו להגדיר את PushCacheFilter בשלנו web.xml:

 דחוף את org.eclipse.jetty.servlets.PushCacheFilter יציאות 8444 push / * 

3.4. הגדר תצורה של מיכל סרבל ומיפוי סרוולט

לאחר מכן, ניצור את Http2JettyServlet בכיתה כדי לגשת לתמונות, ואנחנו נוסיף את מיפוי סרוולט בשלנו web.xml קוֹבֶץ:

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

4. הגדרת לקוח HTTP / 2

לבסוף, כדי לאמת את תכונת ה- HTTP / 2 Push ואת זמן טעינת הדפים המשופר, ניצור http2.html קובץ הטוען כמה תמונות (משאבים משניים):

   לקוח HTTP / 2 של Baeldung במזח 

הדגמת HTTP / 2

5. בדיקת לקוח HTTP / 2

כדי לקבל קו בסיס לזמן טעינת הדף, בואו ניגש ליישום HTTP / 1.1 בכתובת //localhost:8443/http2.html עם כלים למפתחים לאימות הפרוטוקול וזמן הטעינה:

כאן, אנו יכולים לראות כי התמונות נטענות ב 3-6ms באמצעות פרוטוקול HTTP / 1.1.

לאחר מכן, ניגש ליישום HTTP / 2, שמפעיל את Push, בשעה //localhost:8444/http2.html:

הנה, אנו צופים כי הפרוטוקול הוא h2היוזם הוא לִדחוֹףוזמן הטעינה הוא 1ms עבור כל התמונות (משאבים משניים).

לכן, ה PushCacheFilter מטמון את המשאבים המשניים עבור http2.html, דוחף אותם לנמל 8444, ומספק שיפור גדול בזמן הטעינה של הדף.

6. מסקנה

במדריך זה חקרנו את HTTP / 2 במזח.

ראשית, בדקנו כיצד להפעיל את Jetty עם פרוטוקול HTTP / 2 יחד עם תצורותיו.

לאחר מכן ראינו יישום אינטרנט של Java 8 עם תכונת HTTP / 2 Push, מוגדרת עם PushCacheFilter, וצפה כיצד משך זמן הטעינה של דף המכיל משאבים משניים לעומת מה שראינו בפרוטוקול HTTP / 1.1.

כרגיל, כל יישומי הקוד זמינים ב- GitHub.


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