מבוא ל- Finagle

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

במדריך זה, נסתכל במהירות על Finagle, ספריית RPC של טוויטר.

נשתמש בו לבניית לקוח ושרת פשוטים.

2. אבני בניין

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

2.1. שירותים

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

2.2. מסננים

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

2.3. עתיד

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

3. שירות

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

לשם כך עלינו ליצור מחלקה שתאריך את המופשט שֵׁרוּת בכיתה מספריית Finagle, יישום שלה להגיש מועמדות שיטה.

מה שאנחנו עושים נראה דומה ליישום ממשק פונקציונלי. מעניין, עם זאת, איננו יכולים להשתמש בפונקציה ספציפית זו מכיוון ש- Finagle כתוב בסקאלה ואנחנו מנצלים את יכולת הפעולה ההדדית של Java-Scala:

מחלקה ציבורית GreetingService מרחיבה את השירות {@Override public Future להחיל (בקשת בקשה) {String greeting = "Hello" + request.getParam ("name"); קורא קורא = Reader.fromBuf (Buf.ByteArray חדש (greeting.getBytes (), 0, greeting.length ())); להחזיר Future.value (Response.apply (request.version (), Status.Ok (), קורא)); }}

4. סנן

לאחר מכן נכתוב פילטר שיירשם כמה נתונים על הבקשה למסוף. דומה ל שֵׁרוּת, נצטרך ליישם לְסַנֵןשל להגיש מועמדות שיטה שתקבל בקשה ותחזיר א עתיד תגובה, אך הפעם זה ייקח את השירות גם כפרמטר השני.

הבסיס לְסַנֵן בכיתה יש ארבעה פרמטרים מסוגים, אך לעתים קרובות מאוד איננו צריכים לשנות את סוגי הבקשות והתגובות בתוך המסנן.

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

מחלקה ציבורית LogFilter מרחיב את SimpleFilter {@Override public Future להחיל (בקשת בקשה, שירות שירות) {logger.info ("בקש מארח:" + בקשה.הוסט (). getOrElse (() -> "")); logger.info ("בקש פרמדים:"); request.getParams (). forEach (entry -> logger.info ("\ t" + entry.getKey () + ":" + entry.getValue ())); service service.apply (בקשה); }} 

5. שרת

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

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

Server serverService = LogFilter חדש (). ואז (GreetingService חדש ()); Http.serve (": 8080", serverService);

6. לקוח

לבסוף, אנו זקוקים ללקוח שישלח בקשה לשרת שלנו.

לשם כך, ניצור שירות HTTP באמצעות הנוח שירות חדש שיטה של ​​Finagle's Http מעמד. היא תהיה אחראית ישירות למשלוח הבקשה.

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

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

שירות clientService = LogFilter חדש (). ואז (Http.newService (": 8080")); בקשת בקשה = Request.apply (Method.Get (), "/? Name = John"); request.host ("localhost"); תגובה עתידית = clientService.apply (בקשה); Await.result (תגובה .onSuccess (r -> {assertEquals ("שלום ג'ון", r.getContentString ()); החזיר BoxedUnit.UNIT;}). OnFailure (r -> {זרוק RuntimeException (r);})) ;

שימו לב שאנחנו חוזרים BoxedUnit.UNIT. חוזר יחידה היא הדרך של הסקאלה להתמודד בָּטֵל שיטות, אז אנחנו עושים את זה כאן כדי לשמור על יכולת פעולה הדדית.

7. סיכום

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

כמו תמיד, ניתן למצוא את קוד המקור עם כל הדוגמאות ב- GitHub.


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