מבוא ל- JBoss Undertow

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

Undertow הוא שרת אינטרנט קל במיוחד ובעל ביצועים גבוהים מבית JBoss. הוא תומך בממשקי API לחסימה ולא לחסימה עם NIO.

מכיוון שכתוב זה Java, ניתן להשתמש בו בכל יישומים מבוססי JVM במצב מוטמע, אפילו של JBoss WilfFly שרת משתמש פנימי זֶרֶם תַחתִי לשיפור ביצועי השרת.

במדריך זה נציג את התכונות של Undertow וכיצד להשתמש בה.

2. מדוע Undertow?

  • קל: זֶרֶם תַחתִי הוא קל משקל תחת 1MB. במצב מוטבע, הוא משתמש רק ב -4 מגה-בייט של שטח ערימה בזמן הריצה
  • Servlet 3.1: הוא תומך במלואו סרוולט 3.1
  • Socket Web: הוא תומך בפונקציונליות Socket Web (כולל JSR-356)
  • חיבור מתמיד: כברירת מחדל, זֶרֶם תַחתִי כולל חיבורי HTTP קבועים על ידי הוספה להשאיר בחיים כותרת תגובה. זה עוזר ללקוחות התומכים בחיבורים מתמשכים לייעל את הביצועים על ידי שימוש חוזר בפרטי החיבור

3. שימוש ב- Undertow

נתחיל להשתמש זֶרֶם תַחתִי על ידי יצירת שרת אינטרנט פשוט.

3.1. תלות של Maven

להשתמש זֶרֶם תַחתִי, עלינו להוסיף את התלות הבאה שלנו pom.xml:

 io.undertow undertow-servlet 1.4.18 גמר 

כדי לבנות צנצנת ניתנת להפעלה, עלינו להוסיף תוסף Maven-Shade. לכן עלינו להוסיף גם את התצורה למטה:

 org.apache.maven.plugins חבילת maven-shadow-plugin 

הגרסה האחרונה של זֶרֶם תַחתִי זמין במאגר Central Maven.

3.2. שרת פשוט

עם קטע הקוד שלמטה, אנו יכולים ליצור שרת אינטרנט פשוט באמצעות Undertow's בּוֹנֶה ממשק API:

מחלקה ציבורית SimpleServer {ציבורי ריק ריק סטריטי (מחרוזת [] טענות) {שרת Undertow = Undertow.builder (). addHttpListener (8080, "localhost"). setHandler (exchange -> {exchange.getResponseHeaders () .put (Headers.CONTENT_TYPE) , "text / plain"); exchange.getResponseSender (). send ("Hello Baeldung");}). build (); server.start (); }}

הנה, השתמשנו ב- בּוֹנֶה ממשק API לאיגוד 8080 יציאה לשרת זה. כמו כן, שים לב שהשתמשנו בביטוי למבדה כדי להשתמש במטפל.

אנו יכולים גם להשתמש בקטע קוד להלן כדי לעשות את אותו הדבר מבלי להשתמש בביטויי למבדה:

שרת Undertow = Undertow.builder (). AddHttpListener (8080, "localhost") .setHandler (HttpHandler חדש () {@Override public void handleRequest (HttpServerExchange exchange) זורק חריג {exchange.getResponseHeaders (). Put (Headers.CONTENT_TYPE) טקסט / רגיל "); exchange.getResponseSender (). שלח (" שלום באלדונג ");}}). build ();

הדבר החשוב לציין כאן הוא השימוש ב- HttpHandler ממשק API. זהו התוסף החשוב ביותר להתאמה אישית של זֶרֶם תַחתִי יישום המבוסס על צרכינו.

במקרה זה, הוספנו מטפל מותאם אישית שיוסיף את ה- סוג תוכן: טקסט / רגיל כותרת תגובה עם כל בקשה.

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

exchange.getResponseSender () .send ("שלום באלדונג");

3.3. גישה מאובטחת

ברוב המקרים, אנו לא מאפשרים לכל המשתמשים לגשת לשרת שלנו. בדרך כלל משתמשים עם אישורים תקפים יכולים לקבל גישה. אנו יכולים ליישם את אותו מנגנון עם ה- זֶרֶם תַחתִי.

כדי ליישמו, עלינו ליצור מנהל זהויות אשר יבדוק את האותנטיות של המשתמש לכל בקשה.

אנחנו יכולים להשתמש ב- Undertow IdentityManager לזה:

מחלקה ציבורית CustomIdentityManager מיישמת את IdentityManager {משתמשי מפה פרטית; // קונסטרוקטורים סטנדרטיים @ Override אימות חשבון ציבורי (חשבון חשבון) {חשבון החזרה; } אימות חשבון ציבורי @ עקוף (אישורי אישורים) {החזר null; } אימות חשבון ציבורי @ עקוף (מזהה מחרוזת, אישורי אישורים) {חשבון חשבון = getAccount (מזהה); אם (חשבון! = null && אמת אישורים (חשבון, אישורים)) {החזר חשבון; } להחזיר אפס; }}

לאחר יצירת מנהל הזהות, עלינו ליצור תחום שיחזיק את אישורי המשתמש:

HttpHandler סטטי פרטי addSecurity (HttpHandler toWrap, IdentityManager identityManager) {HttpHandler handler = toWrap; מטפל = AuthenticationCallHandler חדש (מטפל); מטפל = AuthenticationConstraintHandler חדש (מטפל); מנגנוני רשימה = Collections.singletonList (חדש BasicAuthenticationMechanism ("Baeldung_Realm")); מטפל = AuthenticationMechanismsHandler חדש (מטפל, מנגנונים); מטפל = SecurityInitialHandler חדש (AuthenticationMode.PRO_ACTIVE, identityManager, handler); מטפל בחזרה; }

הנה, השתמשנו ב- AuthenticationMode כפי ש יזום כלומר כל בקשה שמגיעה לשרת זה תועבר למנגנוני האימות המוגדרים כדי לבצע אימות בשקיקה.

אם נגדיר AuthenticationMode כפי ש CONSTRAINT_DRIVEN, אז רק בקשות אלה יעברו דרך מנגנוני האימות שהוגדרו כאשר האילוצים / ים המחייבים אימות מופעלים.

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

ראשי סטטי ציבורי ריק (String [] args) {Map users = HashMap new (2); users.put ("root", "password" .toCharArray ()); users.put ("admin", "password" .toCharArray ()); IdentityManager idm = CustomIdentityManager חדש (משתמשים); שרת Undertow = Undertow.builder (). AddHttpListener (8080, "localhost") .setHandler (addSecurity (e -> setExchange (e), idm)). Build (); server.start (); } ריק ריק סטטי פרטית setExchange (HttpServerExchange exchange) {SecurityContext context = exchange.getSecurityContext (); exchange.getResponseSender (). שלח ("שלום" + context.getAuthenticatedAccount (). getPrincipal (). getName (), IoCallback.END_EXCHANGE); }

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

3.4. שקע אינטרנט

פשוט ליצור איתו ערוץ חילופי שקעים ברשת UnderTow's WebSocketHttpExchange ממשק API.

לדוגמא, אנו יכולים לפתוח ערוץ תקשורת שקעים בדרך baeldungApp עם קטע הקוד שלהלן:

main static public main (String [] args) {Undertow server = Undertow.builder (). addHttpListener (8080, "localhost") .setHandler (path (). addPrefixPath ("/ baeldungApp", שקע רשת ((exchange, channel) - > {channel.getReceiveSetter (). set (getListener ()); channel.resumeReceives ();})). addPrefixPath ("/", resource (new ClassPathResourceManager (SocketServer.class.getClassLoader (), SocketServer.class.getPackage ( addWelcomeFiles ("index.html"))) .build (); server.start (); } סטטי פרטי AbstractReceiveListener getListener () {להחזיר AbstractReceiveListener חדש () {@Override בטל ריק מוגן onFullTextMessage (ערוץ WebSocketChannel, הודעת BufferedTextMessage) {String messageData = message.getData (); עבור (מושב WebSocketChannel: channel.getPeerConnections ()) {WebSockets.sendText (messageData, session, null); }}}; }

אנו יכולים ליצור דף HTML בשם index.html והשתמש ב- JavaScript WebSocket ממשק API להתחברות לערוץ זה.

3.5. שרת קבצים

עם זֶרֶם תַחתִי, אנו יכולים גם ליצור שרת קבצים שיכול להציג תוכן בספריה ומגיש ישירות קבצים מהספריה:

ראשי ריק סטטי ציבורי (מחרוזת [] טענות) {שרת Undertow = Undertow.builder (). addHttpListener (8080, "localhost") .setHandler (משאב (PathResourceManager חדש (Paths.get (System.getProperty ("user.home")) ), 100)) .setDirectoryListingEnabled (true)) .build (); server.start (); }

איננו צריכים ליצור תוכן ממשק משתמש כדי להציג את תוכן הספריה. מחוץ לקופסא זֶרֶם תַחתִי מספק דף לפונקציונליות תצוגה זו.

4. תוסף אתחול האביב

חוץ מ טומקט ו מֵזַח,מגף אביב תומך זֶרֶם תַחתִי כמיכל השרת המשובץ. להשתמש זֶרֶם תַחתִי, עלינו להוסיף את התלות הבאה ב- pom.xml:

 org.springframework.boot spring-boot-starter-undertow 1.5.6.RELEASE 

הגרסה האחרונה של תוסף Spring Boot Undertow זמין במאגר Central Maven.

5. מסקנה

במאמר זה למדנו על זֶרֶם תַחתִי ואיך נוכל ליצור איתו סוגים שונים של שרתים.

כמו תמיד, קוד המקור המלא זמין ב- GitHub.


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