בניית מיקרו-שירותים באמצעות Eclipse MicroProfile

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

במאמר זה נתמקד בבניית שירות מיקרו מבוסס על Eclipse MicroProfile.

נבדוק כיצד לכתוב יישום אינטרנט RESTful באמצעות ממשקי API של JAX-RS, CDI ו- JSON-P.

2. אדריכלות מיקרו-שירות

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

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

3. Eclipse MicroProfile

Eclipse MicroProfile היא יוזמה שמטרתה לייעל את Enterprise Java לאדריכלות המיקרו-שירותים. זה מבוסס על קבוצת משנה של ממשקי API של ג'קרטה EE WebProfile, כך שנוכל לבנות יישומי MicroProfile כמו שאנחנו בונים יישומי ג'קרטה EE.

המטרה של MicroProfile היא להגדיר ממשקי API סטנדרטיים לבניית שירותי מיקרוסופט ולספק יישומים ניידים במספר זמני זמן של MicroProfile.

4. תלות Maven

כל התלות הנדרשת לבניית יישום Eclipse MicroProfile מסופקות על ידי תלות זו ב- BOM (Bill of Materials):

 org.eclipse.microprofile microprofile 1.2 pom מסופק 

היקף מוגדר כ- בתנאי מכיוון שזמן הריצה של MicroProfile כבר כולל את ה- API ואת היישום.

5. מודל ייצוג

נתחיל ביצירת מחלקת משאבים מהירה:

ספר בכיתה ציבורית {מזהה מחרוזת פרטי; שם מחרוזת פרטי; סופר מחרוזת פרטי; דפי שלם פרטיים; // ...}

כפי שאנו רואים, אין שום הערה בנושא זה סֵפֶר מעמד.

6. שימוש ב- CDI

במילים פשוטות, CDI הוא API המספק הזרקת תלות וניהול מחזור חיים. זה מפשט את השימוש בשעועית ארגונית ביישומי אינטרנט.

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

@ApplicationScoped מחלקה ציבורית BookManager {ConcurrentMap פרטי inMemoryStore = ConcurrentHashMap חדש (); הוסף מחרוזת ציבורית (ספר ספרים) {// ...} ציבורי ספר קבל (מזהה מחרוזת) {// ...} רשימה ציבורית getAll () {// ...}} 

אנו מציינים את השיעור הזה עם @ApplicationScoped כי אנחנו זקוקים רק למופע אחד שהמצב משותף לכל הלקוחות. לשם כך השתמשנו ב- ConcurrentMap כחנות נתונים בטוחה בזיכרון. ואז הוספנו שיטות עבור CRUD פעולות.

כעת השעועית שלנו מוכנה ל- CDI וניתנת להזרקה לשעועית BookEndpoint באמצעות ה @לְהַזרִיק ביאור.

7. API של JAX-RS

כדי ליצור יישום REST עם JAX-RS, עלינו ליצור יישום הכיתה מוסברת עם @ApplicationPath ומשאב שמסומן עם @נָתִיב.

7.1. יישום JAX RS

יישום JAX-RS מזהה את ה- URI הבסיסי לפיו אנו חושפים את המשאב ביישום אינטרנט.

בואו ניצור את יישום JAX-RS הבא:

@ApplicationPath ("/ library") מחלקה ציבורית LibraryApplication מרחיב את היישום {}

בדוגמה זו, כל מחלקות המשאבים של JAX-RS ביישום האינטרנט משויכות ל- LibraryApplication מה שהופך אותם מתחת לאותו דבר סִפְרִיָה נתיב, זה הערך של ביאור נתיב.

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

7.2. נקודת סיום של JAX RS

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

כל מחלקת ג'אווה מסומנת עם @נָתִיב, או שיש לפחות שיטה אחת עם הערות @ Path או @ HTttMethod הוא נקודת סיום.

כעת ניצור נקודת סיום של JAX-RS שחושפת את הייצוג הזה:

@Path ("ספרים") @RequestScoped בכיתה ציבורית BookEndpoint {@ הזריק BookManager bookManager; @GET @Path ("{id}") @Produces (MediaType.APPLICATION_JSON) תגובה ציבורית getBook (@PathParam ("id") מזהה מחרוזת) {return Response.ok (bookManager.get (id)). Build (); } @GET @Produces (MediaType.APPLICATION_JSON) תגובה ציבורית getAllBooks () {return Response.ok (bookManager.getAll ()). Build (); } @ POST @ Consumes (MediaType.APPLICATION_JSON) הוספת תגובה ציבורית (ספר ספר) {String bookId = bookManager.add (ספר); החזר Response.created (UriBuilder.fromResource (this.getClass ()). path (bookId) .build ()) .build (); }} 

בשלב זה, אנו יכולים לגשת ל- BookEndpoint משאבים תחת ה- / ספרייה / ספרים נתיב ביישום האינטרנט.

7.3. JAX RS JSON סוג מדיה

JAX RS תומך בסוגי מדיה רבים לצורך תקשורת עם לקוחות REST, אך Eclipse MicroProfile מגביל את השימוש ב- JSON כפי שהוא מציין את השימוש ב- JSOP-P API. ככזה, עלינו להוסיף הערות לשיטות שלנו באמצעות @Consumes (MediaType.APPLICATION_JSON) ו- @מפיק (MediaType.APPLICATION_JSON).

ה @Consumes הערה מגבילה את הפורמטים המקובלים - בדוגמה זו, רק פורמט הנתונים של JSON מתקבל. כותרת בקשת HTTP סוג תוכן צריך להיות יישום / json.

אותו רעיון מסתתר מאחורי @Produces ביאור. זמן הריצה של JAX RS אמור לשמר את התגובה לפורמט JSON. כותרת HTTP הבקשה לְקַבֵּל צריך להיות יישום / json.

8. JSON-P

JAX RS Runtime תומך ב- JSON-P מהקופסה כדי שנוכל להשתמש בה JsonObject כפרמטר קלט שיטה או סוג החזרה.

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

לביצוע זרם קלט JSON ל סֵפֶר POJO, זו הפעלת שיטת משאבים עם פרמטר מסוג סֵפֶר, אנחנו צריכים ליצור כיתה BookMessageBodyReader:

@Provider @Consumes (MediaType.APPLICATION_JSON) מחלקה ציבורית BookMessageBodyReader מיישמת MessageBodyReader {@Override בוליאני ציבורי isReadable (סוג מחלקה, סוג genericType, הערות [] הערות, MediaType mediaType) {return type.equals (Book.class); } @Override Public Book readFrom (סוג מחלקה, סוג genericType, הערות [] הערות, MediaType mediaType, MultivaluedMap httpHeaders, InputStream entityStream) זורק IOException, WebApplicationException {return BookMapper.map (entityStream); }} 

אנו עושים את אותו התהליך כדי לבטל את מרשל א סֵפֶר לזרם הפלט של JSON, זו הפעלת שיטת משאבים שסוג ההחזרה שלה הוא סֵפֶר, על ידי יצירת a BookMessageBodyWriter:

@Provider @Produces (MediaType.APPLICATION_JSON) מחלקה ציבורית BookMessageBodyWriter מיישמת את MessageBodyWriter {@Override בוליאני ציבורי isWriteable (סוג מחלקה, סוג genericType, ביאור [] הערות, MediaType mediaType) {return type.equals (Book.class); } // ... @ ביטול בטל ציבורי ריק לכתיבה (ספר ספרים, סוג מחלקה, סוג genericType, הערות [] הערות, MediaType mediaType, MultivaluedMap httpHeaders, OutputStream entityStream) זורק IOException, WebApplicationException {JsonWriter jsonWriter = Json.createWriter (entityStream) JsonObject jsonObject = BookMapper.map (ספר); jsonWriter.writeObject (jsonObject); jsonWriter.close (); }} 

כפי ש BookMessageBodyReader ו BookMessageBodyWriter מסומנים עם @ ספק, הם רשומים באופן אוטומטי על ידי זמן הריצה של JAX RS.

9. בנייה והפעלת היישום

יישום MicroProfile הוא נייד ואמור לפעול בכל זמן ריצה תואם של MicroProfile. נסביר כיצד לבנות ולהריץ את היישום שלנו ב- Open Liberty, אך אנו יכולים להשתמש בכל מיקרו-פרופיל Eclipse תואם.

אנו מגדירים את זמן הריצה של Open Liberty באמצעות קובץ תצורה server.xml:

  jaxrs-2.0 cdi-1.2 jsonp-1.0 

בואו נוסיף את התוסף חירות-maven-plugin ל- pom.xml שלנו:

  net.wasdev.wlp.maven.plugins liberty-maven-plugin 2.1.2 io.openliberty openliberty-runtime 17.0.0.4 zip $ {basedir} /src/main/liberty/config/server.xml $ {package.file} $ {packaging.type} פרויקט כוזב / $ {project.artifactId} - $ {project.version} .war 9080 9443 התקנת שרת הכנת חבילת התקנה שרת יצירת שרת התקנת תכונה חבילה-שרת-עם-אפליקציות התקנת חבילת- שרת חבילות אפליקציות 

ניתן להגדיר תוסף זה לזרוק קבוצה של מאפיינים:

  ניתן להריץ את הספרייה $ {project.build.directory} / $ {app.name} -service.jar 

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

כדי ליצור צנצנת הפעלה, הפעל את הפקודה הבאה:

חבילת mvn 

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

java -jar target / library-service.jar

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

תלתל // localhost: 9080 / ספרייה / ספרים

התוצאה היא JSON:

[{"id": "0001-201802", "isbn": "1", "name": "בניית Microservice עם Eclipse MicroProfile", "author": "baeldung", "pages": 420}] 

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

תלתל // localhost: 9080 / ספרייה / ספרים / 0001-201802

והתוצאה היא JSON:

{"id": "0001-201802", "isbn": "1", "name": "בניית Microservice עם Eclipse MicroProfile", "author": "baeldung", "pages": 420}

כעת נוסיף ספר חדש על ידי אינטראקציה עם ה- API:

תלתל -H "סוג תוכן: יישום / json" -X POST -d '{"isbn": "22", "name": "Gradle in Action", "author": "baeldung", "pages": 420 } '// localhost: 9080 / ספרייה / ספרים 

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

<HTTP / 1.1 201 נוצר <מיקום: // localhost: 9080 / ספריה / ספרים / 0009-201802

10. מסקנה

מאמר זה הדגים כיצד לבנות מיקרו-שירות פשוט המבוסס על Eclipse MicroProfile, הדן ב- JAX RS, JSON-P ו- CDI.

הקוד זמין ב- Github; זהו פרויקט מבוסס Maven, ולכן צריך להיות פשוט לייבא ולהפעיל אותו כפי שהוא.


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