יצירת REST מיקרו-שירותים עם Javalin

1. הקדמה

Javalin היא מסגרת אינטרנטית קלת משקל שנכתבה עבור Java ו- Kotlin. זה כתוב על גבי שרת האינטרנט Jetty, מה שהופך אותו לביצועים גבוהים. Javalin מעוצב מקרוב מחוץ ל- koa.js, מה שאומר שהוא כתוב מהיסוד כדי שיהיה פשוט להבנה ולבנות עליו.

במדריך זה נלך בשלבים של בניית שירות מיקרו בסיסי של REST באמצעות מסגרת קלה זו.

2. הוספת תלות

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

 io.javalin javalin 1.6.1 

הגרסה הנוכחית נמצאת כאן.

3. הקמת Javalin

Javalin מקל על הגדרת יישום בסיסי. נתחיל בהגדרת המחלקה הראשית שלנו ובהקמת יישום פשוט "שלום עולם".

בואו ניצור קובץ חדש בחבילת הבסיס שלנו שנקרא JavalinApp.java.

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

אפליקציית Javalin = Javalin.create () .port (7000) .start (); app.get ("/ שלום", ctx -> ctx.html ("שלום, Javalin!"));

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

אנו מקימים את נקודת הקצה הראשונה שלנו בהאזנה ל- לקבל בקש ב /שלום נקודת סיום.

בואו נפעיל את היישום הזה ונבקר // localhost: 7000 / שלום כדי לראות את התוצאות.

4. יצירת א UserController

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

ראשית, עלינו ליצור מודל של האובייקט איתו אנו עובדים. אנו מתחילים ביצירת חבילה בשם מִשׁתַמֵשׁ תחת פרויקט השורש.

לאחר מכן, אנו מוסיפים חדש מִשׁתַמֵשׁ מעמד:

משתמש בכיתה ציבורית {מזהה אחרון גמר ציבורי; גמר ציבורי שם מחרוזת; // בונים}

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

אנו יוצרים כיתה חדשה ב מִשׁתַמֵשׁ ארוז קרא UserDao.java:

מחלקה UserDao {משתמשים ברשימה פרטית = Arrays.asList (משתמש חדש (0, "סטיב רוג'רס"), משתמש חדש (1, "טוני סטארק"), משתמש חדש (2, "קרול דנברס")); UserDao סטטי פרטי userDao = null; UserDao פרטי () {} מופע UserDao סטטי () {if (userDao == null) {userDao = UserDao חדש (); } להחזיר userDao; } אופציונלי getUserById (int id) {return users.stream () .filter (u -> u.id == id) .findAny (); } GetAllUsernames Iterable () {return users.stream () .map (user -> user.name) .collect (Collectors.toList ()); }}

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

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

אנו יוצרים כיתה חדשה בשם UserController.java בתוך ה מִשׁתַמֵשׁ חֲבִילָה:

מחלקה ציבורית UserController {מטפל ציבורי סטטי fetchAllUsernames = ctx -> {UserDao dao = UserDao.instance (); AllUsers ניתנים לשינוי = dao.getAllUsname (); ctx.json (allUsers); }; מטפל סטטי ציבורי fetchById = ctx -> {int id = Integer.parseInt (Objects.requireNonNull (ctx.param ("id"))); UserDao dao = UserDao.instance (); משתמש משתמש = dao.getUserById (id); אם (משתמש == null) {ctx.html ("לא נמצא"); } אחר {ctx.json (משתמש); }}; }

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

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

5. הוספת מסלולים

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

בואו נוסיף אותם למחלקת היישומים הראשית שלנו:

app.get ("/ משתמשים", UserController.fetchAllUsernames); app.get ("/ users /: id", UserController.fetchById);

לאחר הידור והפעלת היישום, אנו יכולים להגיש בקשה לכל אחת מנקודות הקצה החדשות הללו. שיחות // localhost: 7000 / משתמשים יפרטו את כל המשתמשים ושיחות // localhost: 7000 / משתמשים / 0 יקבלו את האובייקט JSON של המשתמש היחיד עם המזהה 0. כעת יש לנו מיקרו-שירות המאפשר לנו לאחזר מִשׁתַמֵשׁ נתונים.

6. הארכת מסלולים

אחזור נתונים הוא משימה חיונית של רוב המיקרו-שירותים.

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

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

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

app.post ("/") {ctx -> user user = ctx.bodyAsClass (User.class); }

יאפשר לנו לתפוס את ה- JSON מִשׁתַמֵשׁ חפץ מגוף הבקשה ותרגם אותו ל מִשׁתַמֵשׁ אובייקט מודל.

7. מסקנה

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

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

לקבלת דוגמאות מתקדמות יותר לשימוש ב- Javalin, הקפד לבדוק את התיעוד.

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


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