עבודה עם Apache Thrift

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

במאמר זה נגלה כיצד לפתח יישומי שרת לקוח חוצה פלטפורמות בעזרת מסגרת RPC הנקראת Apache Thrift.

אנו נסקור:

  • הגדרת סוגי נתונים וממשקי שירות עם IDL
  • התקנת הספרייה והפקת המקורות לשפות שונות
  • יישום הממשקים המוגדרים בשפה מסוימת
  • הטמעת תוכנת לקוח / שרת

אם אתה רוצה ללכת ישר לדוגמאות, המשך ישר לסעיף 5.

2. חסכון של אפאצ'י

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

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

Thrift משתמשת בשפת תיאור ממשק מיוחדת (IDL) כדי להגדיר סוגי נתונים וממשקי שירות המאוחסנים כ- .חִסָכוֹן קבצים ומשמשים מאוחר יותר כקלט על ידי המהדר ליצירת קוד המקור של תוכנת לקוח ושרת המתקשרים בשפות תכנות שונות.

כדי להשתמש ב- Apache Thrift בפרויקט שלך, הוסף תלות Maven זו:

 org.apache.thrift libthrift 0.10.0 

תוכל למצוא את הגרסה האחרונה במאגר Maven.

3. שפת תיאור הממשק

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

3.1. סוגי בסיסים

  • בול - ערך בוליאני (נכון או לא נכון)
  • בתים - מספר שלם חתום של 8 סיביות
  • i16 - מספר שלם של 16 סיביות חתום
  • i32 - מספר שלם של 32 סיביות חתום
  • i64 - מספר שלם של 64 סיביות חתום
  • לְהַכפִּיל - מספר נקודות צף של 64 סיביות
  • חוּט - מחרוזת טקסט המקודדת באמצעות קידוד UTF-8

3.2. סוגים מיוחדים

  • בינארי - רצף של בתים לא מקודדים
  • אופציונאלי - ג'אווה 8 אופציונאלי סוּג

3.3. סטרוקטורים

חִסָכוֹן סטרוקטורות הם המקבילה לשיעורים בשפות OOP אך ללא ירושה. א struct יש קבוצה של שדות שהוקלדו חזק, ולכל אחד מהם שם ייחודי כמזהה. בשדות עשויות להיות ביאורים שונים (מזהי שדה מספריים, ערכי ברירת מחדל אופציונליים וכו ').

3.4. מיכלים

מכולות חסכנות הן מכולות שהוקלדו חזק:

  • רשימה - רשימת אלמנטים מסודרת
  • מַעֲרֶכֶת - סט לא מסודר של אלמנטים ייחודיים
  • מַפָּה - מפה של מפתחות ערכים ייחודיים לחלוטין

רכיבי מיכל עשויים להיות מכל סוג חסכן תקף.

3.5. חריגים

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

3.6. שירותים

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

4. יצירת קוד מקור

4.1. תמיכת שפה

יש רשימה ארוכה של שפות הנתמכות כעת:

  • C ++
  • C #
  • ללכת
  • הסקל
  • ג'אווה
  • Javascript
  • Node.js
  • פרל
  • PHP
  • פִּיתוֹן
  • אוֹדֶם

תוכלו לבדוק את הרשימה המלאה כאן.

4.2. באמצעות קובץ ההפעלה של הספרייה

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

cd cd / to / thrift thrift -r --gen [LANGUAGE] [FILENAME]

בפקודות שהוגדרו לעיל, [שפה] היא אחת השפות הנתמכות ו- [שם קובץ] הוא קובץ עם הגדרת IDL.

שים לב ל -r דֶגֶל. זה אומר לחסכן ליצור קוד רקורסיבי ברגע שהוא שם לב לכלול נתון .חִסָכוֹן קוֹבֶץ.

4.3. באמצעות תוסף Maven

הוסף את התוסף שלך pom.xml קוֹבֶץ:

 org.apache.thrift.tools maven-thrift-plugin 0.1.11 נתיב / to / thrift thrift-sources generate-sources compile 

אחרי זה פשוט בצע את הפקודה הבאה:

mvn נקי להתקין

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

5. דוגמה ליישום שרת לקוח

5.1. הגדרת קובץ חסכון

בואו נכתוב שירות פשוט עם חריגים ומבנים:

מרחב שמות cpp com.baeldung.thrift.impl מרחב שמות java com.baeldung.thrift.impl חריג InvalidOperationException {1: קוד i32, 2: תיאור מחרוזת} מבנה CrossPlatformResource {1: מזהה i32, 2: שם מחרוזת, 3: הברכת מחרוזת אופציונלית} שירות CrossPlatformService {CrossPlatformResource get (1: i32 id) זורק (1: InvalidOperationException e), שמירה בטל (1: משאב CrossPlatformResource) זורק (1: InvalidOperationException e), רשימה getList () זורק (1: InvalidOperationException e), bool ) זורק (1: InvalidOperationException e)}

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

ואז פשוט לאחסן אותו כ- service.thrift קוֹבֶץ.

5.2. חיבור ויצירת קוד

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

חסכון -r- נוצר --gen java /path/to/service.thrift

כפי שאתה עשוי לראות, הוספנו דגל מיוחד -הַחוּצָה כדי לציין את ספריית הפלט עבור קבצים שנוצרו. אם לא קיבלת שגיאות, נוצר הספרייה תכיל 3 קבצים:

  • CrossPlatformResource.java
  • CrossPlatformService.java
  • InvalidOperationException.java

בואו ניצור גרסת C ++ של השירות על ידי הפעלה:

חסכון -r- נוצר --gen cpp /path/to/service.thrift

כעת אנו מקבלים 2 יישומים תקפים שונים (Java ו- C ++) של אותו ממשק שירות.

5.3. הוספת יישום שירות

למרות שחסכנות עשתה את רוב העבודה בשבילנו, אנחנו עדיין צריכים לכתוב את היישומים שלנו CrossPlatformService. על מנת לעשות זאת, עלינו רק ליישם א CrossPlatformService.Iface מִמְשָׁק:

מחלקה ציבורית CrossPlatformServiceImpl מיישמת CrossPlatformService.Iface {@Override ציבור CrossPlatformResource מקבל (מזהה מזהה) זורק InvalidOperationException, TException {להחזיר CrossPlatformResource חדש (); } שמירה על בטל ציבורי @Override (משאב CrossPlatformResource) זורק InvalidOperationException, TException {saveResource (); } @Override רשימה ציבורית getList () זורק InvalidOperationException, TException {return Collections.emptyList (); } @Override פינג בוליאני ציבורי () זורק InvalidOperationException, TException {return true; }}

5.4. כתיבת שרת

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

מחלקה ציבורית CrossPlatformServiceServer {התחלה בטלנית ציבורית () זורקת TTransportException {TServerTransport serverTransport = TServerSocket חדש (9090); שרת = TSimpleServer חדש (TServer.Args חדש (serverTransport). מעבד (חדש CrossPlatformService.Processor (חדש CrossPlatformServiceImpl ()))); System.out.print ("הפעלת השרת ..."); server.serve (); System.out.println ("נעשה."); } עצירת חלל ציבורית () {if (server! = null && server.isServing ()) {System.out.print ("עצירת השרת ..."); server.stop (); System.out.println ("נעשה."); }}} 

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

  • TSimpleServer - לשרת פשוט
  • TThreadPoolServer - לשרת רב-הברגה
  • TNonblockingServer - לשרת רב חוטים שאינו חוסם

ולבסוף, ספק מימוש מעבד לשרת שנבחר שכבר נוצר עבורנו על ידי Thrift, כלומר. מעבד CrossPlatofformService מעמד.

5.5. כתיבת לקוח

והנה יישום הלקוח:

תחבורה תחבורה = TSocket חדש ("localhost", 9090); transport.open (); פרוטוקול TProtocol = TBinaryProtocol חדש (הובלה); לקוח CrossPlatformService.Client = CrossPlatformService.Client חדש (פרוטוקול); תוצאה בוליאנית = client.ping (); transport.close ();

מנקודת מבט של הלקוח, הפעולות די דומות.

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

מכיוון שהוא מבוסס על .חִסָכוֹן הגדרות קבצים אנו יכולים לקרוא ישירות לשיטות המתוארות שם. בדוגמה ספציפית זו, client.ping () יבצע שיחה מרוחקת לשרת שתגיב באמצעות נָכוֹן.

6. מסקנה

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

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


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