קווארקוס היא ג'אווה תת-אטומית על-קולית. סקירה קצרה של המסגרת

קווארקוס היא ג'אווה תת-אטומית על-קולית. סקירה קצרה של המסגרת

מבוא

ב-XNUMX במרץ, RedHat (בקרוב IBM) מוצג מסגרת חדשה - קוורקוס. לדברי המפתחים, המסגרת הזו מבוססת על GraalVM ו-OpenJDK HotSpot ומיועדת עבור Kubernetes. ערימת Quarkus כוללת: JPA/Hibernate, JAX-RS/RESTEasy, Eclipse Vert.x, Netty, Apache Camel, Kafka, Prometheus ואחרים.

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

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

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

זמן מההתחלה ועד התגובה הראשונה:

תְצוּרָה
REST
REST+JPA

Quarkus+GraalVM
0.014
0.055

Quarkus+OpenJDK
0.75
2.5

ערימת ענן מסורתית*
4.3
9.5

צריכת זיכרון (Mb):

תְצוּרָה
REST
REST+JPA

Quarkus+GraalVM
13
35

Quarkus+OpenJDK
74
130

ערימת ענן מסורתית*
140
218

מרשים, לא?

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

שלום עולם!

היישום הפשוט ביותר שנכתב ב-Quarkus ייראה כך:

@Path("/hello")
public class GreetingResource {

   @GET
   @Produces(MediaType.TEXT_PLAIN)
   public String hello() {
       return "hello";
   }
}

זה ממש שיעור אחד וזה מספיק! אתה יכול להפעיל את היישום באמצעות Maven במצב פיתוח:

mvn compile quarkus:dev
…
$ curl http://localhost:8080/hello
hello

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

מה הלאה? אתה יכול להוסיף שירות לבקר באמצעות הערה להזריק. קוד שירות:

@ApplicationScoped
public class GreetingService {

   public String greeting(String name) {
       return "Hello " + name + "!";
   }
}

בקר:

@Path("/hello")
public class GreetingResource {

   @Inject
   GreetingService service;

   @GET
   @Produces(MediaType.TEXT_PLAIN)
   @Path("/{name}")
   public String greeting(@PathParam("name") String name) {
       return service.greeting(name);
   }
}

$ curl http://localhost:8080/hello/developer
Hello developer!

שימו לב ש-Quarkus משתמש בהערות סטנדרטיות ממסגרות מוכרות - CDI ו-JAX-RS. אין צורך ללמוד שום דבר חדש אם עבדת עם CDI ו-JAX-RS בעבר, כמובן.

עבודה עם מסד הנתונים

נעשה שימוש בהערות תרדמה והערות JPA סטנדרטיות עבור ישויות. כמו בקרי REST, אתה צריך לכתוב מינימום קוד. מספיק לציין את התלות בקובץ ה-assembly, להוסיף הערות @Entity ולהגדיר את מקור הנתונים ב- application.properties.

את כל. אין sessionFactory, persistence.xml או קבצי שירות אחרים. אנו כותבים רק את הקוד הדרוש. עם זאת, במידת הצורך, תוכל ליצור קובץ persistence.xml ולהגדיר את שכבת ORM בצורה עדינה יותר.

Quarkus תומך בשמירת מטמון של ישויות, אוספים עבור קשרים של אחד לרבים ושאילתות. במבט ראשון זה נראה נהדר, אבל זה כן מְקוֹמִי מטמון, עבור צומת Kubernetes אחד. הָהֵן. המטמונים של צמתים שונים אינם מסונכרנים זה עם זה. אני מקווה שזה זמני.

ביצוע קוד אסינכרוני

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

@Path("/hello")
public class GreetingResource {

   @GET
   @Produces(MediaType.TEXT_PLAIN)
   @Path("/{name}")
   public CompletionStage<String> greeting(@PathParam("name") String name) {
       return CompletableFuture.supplyAsync(() -> {
           return "Hello " + name + "!";
       });
   }
}

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

בדיקה

ניתן לכתוב מבחנים עבור יישומי Quarkus ב-JUnit4 או JUnit5. להלן מבחן לדוגמה עבור נקודת קצה, הוא נכתב באמצעות RestAssured, אך ניתן להשתמש במסגרת אחרת:

@QuarkusTest
public class GreetingResourceTest {

   @Test
   public void testGreetingEndpoint() {
       String uuid = UUID.randomUUID().toString();
       given()
         .pathParam("name", uuid)
         .when().get("/hello/{name}")
         .then()
           .statusCode(200)
           .body(is("Hello " + uuid + "!"));
   }
}

ההערה @QuarkusTest מורה לך להפעיל את היישום לפני הפעלת בדיקות. השאר הוא קוד המוכר לכל המפתחים.

אפליקציה ספציפית לפלטפורמה

מכיוון ש-Quarkus משולב בצורה הדוקה עם GraalVM, ניתן כמובן ליצור קוד ספציפי לפלטפורמה. לשם כך, עליך להתקין את GraalVM ולציין את משתנה הסביבה GRAALVM_HOME. נוסף לרשום פרופיל להרכבה וציין זאת בעת בניית האפליקציה:

mvn package -Pnative

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

@SubstrateTest
public class GreetingResourceIT extends GreetingResourceTest {

}

ניתן לארוז את התמונה שנוצרה ב-Docker ולהפעיל ב-Kubernetes או ב-OpenShift, המתואר בפירוט ב- הוראות.

ערכת כלים

ניתן להשתמש במסגרת Quarkus עם Maven ו- Gradle. Maven נתמכת באופן מלא, בניגוד ל- Gradle. למרבה הצער, כרגע Gradle אינו תומך ביצירת פרויקט ריק; יש מידע מפורט באתר ספר לימוד.

תוספים

Quarkus היא מסגרת הניתנת להרחבה. כרגע יש פקודה 40 הרחבות, אשר מוסיפים פונקציונליות שונות - מתמיכה מיכל קפיץ DI и אפאמל קאמל לפני רישום ופרסום מדדים להפעלת שירותים. וכבר יש הרחבה לתמיכה בכתיבת אפליקציות בקוטלין, בנוסף לג'אווה.

מסקנה

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

אתר רשמי - quarkus.io. דוגמאות לפרויקטים להתחלה מהירה כבר זמינות ב- GitHub.

מקור: www.habr.com

הוספת תגובה