Red Hat’s Quarkus یک چارچوب جاوا متن باز و تمام پشته است که برای کانتینرها و محیط های ابری طراحی شده است. ببینید چرا جایگزین مناسبی برای بهار است.
Quarkus یک فریم ورک جاوا متن باز و فول استک است که در سال ۲۰۱۹ توسط Red Hat راه اندازی شد. کوارکوس جایگزینی برای اسپرینگ است (اگرچه میتوان آن را با اسپرینگ ادغام کرد)، با برخی ویژگیهای جالب.
Quarkus از ابتدا بهگونهای طراحی شده است که «ابر بومی» باشد، به این معنی که برای Kubernetes، پلتفرمهای بدون سرور، و انواع کتابخانهها مانند Apache Kafka (برای پردازش جریان) و JAX-RS (برای خدمات وب RESTful) تنظیم شده است. . Quarkus همچنین دارای یک موتور کامل CDI (تزریق زمینه و وابستگی) و پشتیبانی از برنامهنویسی Reactive است.
برای معرفی عملی کوارکوس به ادامه مطلب مراجعه کنید.
Quarkus CLI
را نصب کنید
Quarkus از Maven و Gradle به عنوان بستهبندی ابزار ساخت پشتیبانی میکند، اما با یک ابزار خط فرمان رابط (CLI) نیز عرضه میشود. ما با نصب CLI از طریق JBang. از خط فرمان، کد موجود در فهرست ۱ را اجرا کنید.
فهرست ۱. نصب Quarkus CLI
// Linux and iOS:
curl -Ls https://sh.jbang.dev | bash -s - app install --fresh --force quarkus@quarkusio
// PowerShell:
iex "& { $(iwr https://ps.jbang.dev) } app install --fresh --force quarkus@quarkusio"
پس از تکمیل فرمان، تایپ کردن quarkus -version
باید یک نتیجه را نشان دهد.
یک برنامه Quarkus ایجاد کنید
یک برنامه جدید با تایپ کردن quarkus create app com.infoworld:my-quarkus:1.0
ایجاد کنید، جایی که com.infoworld
شناسه گروه است، my- quarkus
شناسه مصنوع است و ۱.۰
شماره نسخه است.
ابزار خط فرمان گزینه های زیادی دارد که می توانید از آنها برای پیکربندی موارد استفاده کنید. می توانید با تایپ quarkus --help
به این گزینه ها نگاهی بیاندازید. با تایپ quarkus create app --help
می توانید در مورد دستور خاصی کمک بگیرید. توجه داشته باشید که میتوانید مواردی مانند پوشش ابزار ساخت را برای استفاده تعریف کنید.
اجرای برنامه Quarkus
اکنون به پوشه جدید my-quarkus بروید و quarkus dev
را تایپ کنید. حالت توسعه کوارکوس نشان دهنده یک رویکرد منظم است. این برنامه از بارگذاری کد داغ پشتیبانی می کند و به شما امکان می دهد بدون توقف کانتینر، آزمایش ها را به دلخواه اجرا کنید. به همین دلیل است که پس از چرخش محفظه توسعه دهنده با دستور:
، چند گزینه دستوری به شما داده می شود
Tests paused Press [r] to resume testing, [o] Toggle test output, [h] for more options>
این بدان معناست که میتوانید کد را تغییر دهید، از جمله اضافه کردن آزمایشها، و سپس آزمایشها را با r
اجرا کنید. همچنین میتوانید سطوح گزارش را با h
تغییر دهید یا ظرف را با q
متوقف کنید.
اجرای حالت توسعه دهنده Quarkus در یک ماشین راه دور
بهطور پیشفرض، حالت برنامهنویس Quarkus فقط در لوکال هاست گوش میدهد. اگر میخواهید در همه شبکهها گوش دهید، میتوانید پارامتر میزبان را اضافه کنید:
quarkus dev -Dquarkus.http.host=0.0.0.0
برای ساخت برنامه برای تولید، از دستور quarkus build
استفاده میکنید.
هنگامی که برنامه در حالت توسعهدهنده در حال اجرا است، از localhost:8080 دیدن کنید و صفحه خوشآمدگویی مشابه شکل ۱ را مشاهده خواهید کرد.
شکل ۱. Quarkus خوش آمدید
کاوش در طرحبندی پروژه کوارکوس
داخل دایرکتوری برنامه جدید، دایرکتوری src قرار دارد که از چیدمان معمولی Maven پیروی می کند، با تست برای تست ها و اصلی برای فایل های برنامه. در داخل /src/main سه دایرکتوری وجود دارد: /src/main/resources، جایی که فایلهای استاتیک شما در آن زندگی میکنند (از جمله صفحات HTML که صفحات شما را هدایت میکنند مانند src/main/resources/META-INF/resources/index.html). /src/main/java، جایی که کد بکاند و کد میانافزار شما زندگی میکنند. و /src/main/docker، جایی که Quarkus Dockerfiles پیشفرض را برای شما ایجاد کرده است (از جمله Dockerfile.native برای اجرای بدون JVM).
هر تغییری که در برنامه ایجاد میکنید وقتی مرورگر بهروزرسانی شود منعکس میشود. برای مثال، میتوانید فایل src/main/java/com/infoworld/GreetingResource.java را باز کنید و یک نقطه پایانی JAX-RS را ببینید. اگر پیام را تغییر دهید و localhost:8080/hello را مجدداً بارگیری کنید، تغییرات شما منعکس شده است.
فهرست ۲. نقطه پایانی /hello REST
package com.infoworld;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
@Path("/hello")
public class GreetingResource {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String hello() {
return "Welcome to the machine";
}
}
برنامه های افزودنی Quarkus
Quarkus قابلیتهای زیادی دارد که از طریق برنامههای افزودنی ارائه میشوند که میتوان آنها را با دستور اضافه کرد. برای درک آنچه که Quarkus پشتیبانی می کند، نگاهی به این مخزن Git بیندازید که شامل چندین ده نمونه هایی برای استفاده از Quarkus با مواردی مانند JPA، Kafka، MongoDB، Amazon S3 و Knative. این مثالها همچنین برای استفاده بهعنوان نقطه شروع در هنگام توسعه یک برنامه Quarkus با این فناوریها (از این رو نام سریع شروع میشود) خوب است.
با اجرای quarkus ext ls
میتوانید ببینید کدام برنامههای افزودنی در برنامه شما نصب شدهاند. خواهید دید که در حال حاضر فقط quarkus-resteasy نصب شده است. با quarkus ext ls -i
میتوانید فهرستی از ماژولهای قابل نصب موجود را دریافت کنید.
نصب با دستور quarkus ext add
انجام میشود.
تزریق وابستگی Quarkus CDI
Quarkus با موتور تزریق وابستگی سفارشی به نام ArC عرضه میشود. ArC یک پیاده سازی جزئی از مشخصات CDI است و همچنین ویژگی های خاص خود را دارد. به طور کلی، سیستم ArC نسبت به CDI ساده تر و قابل درک تر است.
بیایید ببینیم چگونه یک کلاس سرویس برای استفاده توسط منبع RESTful اضافه کنیم. با ایجاد یک فایل جدید در /src/main/java/com/infoworld/service/MyService.java شروع کنید. کد مشاهده شده در فهرست ۳ را اضافه کنید.
فهرست ۳. کلاس MyService
package com.infoworld.service;
import javax.enterprise.context.ApplicationScoped;
import java.util.Random;
@ApplicationScoped
public class MyService {
public Integer getRandom(){
Random random = new Random();
return random.nextInt(100);
}
}
MyService یک کلاس بسیار ساده با یک متد به نام getRandom()
است که یک عدد صحیح تصادفی را برمی گرداند. با حاشیه نویسی استاندارد CDI، @ApplicationScoped
، حاشیه نویسی شده است که آن را در اختیار سیستم DI قرار می دهد. (درباره حوزهها و زمینههای CDI اینجا بیشتر بیاموزید .) توجه داشته باشید که Quarkus CDI در پروژه شما گنجانده شده است زیرا پسوند RESTEasy از آن استفاده می کند.
اکنون کلاس /src/main/java/com/infoworld/GreetingResource.java را باز کنید و آن را همانطور که در لیست ۴ مشاهده می کنید تغییر دهید.
فهرست ۴. GreetingResource با استفاده از MyService
package com.infoworld;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.inject.Inject;
import com.infoworld.service.MyService;
@Path("/hello")
public class GreetingResource {
@Inject
MyService myService;
@GET
@Produces(MediaType.TEXT_PLAIN)
public String hello() {
return "Welcome to the machine. Your number is: " + myService.getRandom();
}
}
عنصر کلیدی در اینجا حاشیهنویسی @Inject
است که باعث میشود موتور CDI مرجع myService
را با منبع bean که در فهرست ۴ ایجاد کردیم، انجام دهد. برای تولید عدد تصادفی برای مسیر /hello استفاده می شود.
تست GreetingResource را برطرف کنید
اکنون اگر به خط فرمانی که Quarkus dev در حال اجرا است برگردید و r
را برای اجرای مجدد تستها تایپ کنید، خواهید دید که مورد آزمایشی برای نقطه پایانی RESTEasy با شکست مواجه میشود. بیایید آن را رفع کنیم. test/java/com/infoworld/GreetingResourceTest.java را باز کنید. توجه داشته باشید که این کلاس از چندین کتابخانه آزمایشی مختلف استفاده میکند که قبلاً توسط Quarkus ارائه شده است، از جمله کتابخانه RestAssured
، که آزمایش نقاط پایانی RESTful را آسان میکند.
GreetingResourceTest
را همانطور که در فهرست ۵ مشاهده می شود، تغییر دهید.
فهرست ۵. به روز شده GreetingResourceTest
package com.infoworld;
import io.quarkus.test.junit.QuarkusTest;
import org.junit.jupiter.api.Test;
import static io.restassured.RestAssured.given;
import static org.hamcrest.CoreMatchers.containsString; // changed
@QuarkusTest
public class GreetingResourceTest {
@Test
public void testHelloEndpoint() {
given()
.when().get("/hello")
.then()
.statusCode(200)
.body(containsString("machine")); // changed
}
}
همانطور که در نظرات ذکر شد، فقط دو خط تغییر کرده است. شما به سادگی وجود کلمه “machine” را در بدنه پاسخ بررسی کنید. حالا اگر تست ها را با دستور r
اجرا کنید، جواب می دهند.
افزودن پسوندهای مشتری REST
بیایید کمی عمیقتر برویم و با یک REST API خارجی (Star Wars API تماس بگیریم، با نام مستعار SWAPI) در کلاس خدمات. با افزودن کلاینت quarkus-rest-api با اجرای quarkus ext add quarkus-rest-client
شروع کنید. توجه داشته باشید که می توانید این کار را در پنجره دیگری در حالی که برنامه هنوز در حال اجرا است انجام دهید و Quarkus پسوند را اعمال می کند. بسیار چشمگیر است.
ما همچنین از افزونه rest-client-jackson برای سادهسازی مدلسازی دادهها استفاده میکنیم. quarkus ext add rest-client-jackson
را تایپ کنید.
کلاس مدل
یک کلاس مدل در یک فهرست جدید ایجاد کنید: src/main/java/com/infoworld/client/Person.java. این یک شی انتقال داده بسیار ساده خواهد بود که جکسون آن را برای ما پر خواهد کرد، همانطور که در فهرست ۶ مشاهده می شود.
فهرست ۶. کلاس مدل افراد
package com.infoworld.client;
import java.util.List;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
@JsonIgnoreProperties(ignoreUnknown = true)
public class Person {
public String name;
}
توجه کنید که ما از @JsonIgnoreProperties
استفاده میکنیم، بنابراین وقتی فیلدهایی در منبع JSON وجود دارند که در شی مدل وجود ندارند، هیچ خطایی ایجاد نمیشود.
در همان فهرست، یک کلاس سرویس جدید ایجاد کنید که به نقطه پایانی SWAPI برخورد می کند: /src/main/java/com/infoworld/client/SwapiClient.java. محتویات آن فایل را در فهرست ۷ ببینید.
فهرست ۷. SwapiClient.java
package com.infoworld.client;
import org.eclipse.microprofile.rest.client.inject.RegisterRestClient;
import org.jboss.resteasy.annotations.jaxrs.PathParam;
import org.jboss.resteasy.annotations.jaxrs.QueryParam;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import java.util.Set;
@RegisterRestClient
public interface SwapiClient {
@GET
@Path("/people/{id}")
@Produces("application/json")
Person getById(@PathParam Integer id);
}
توجه داشته باشید که رابط به عنوان یک سرویس گیرنده استراحت با حاشیه نویسی @RegisterRestClient
ثبت شده است. روش getById
نیز حاشیه نویسی شده است تا آن را به عنوان ضربه زدن به روش GET HTTP که به عنوان "/people/{id}"
یافت می شود، تعریف می کند، جایی که id
قرار است با فراخوانی روش getById(@PathParam Integer id)
ارائه شود. ما در اینجا با همان حاشیهنویسی تعریف میکنیم که یک نقطه پایانی آرام، یک کلاینت آرام را تعریف میکند.
اما ریشه نقطه پایانی کجا تعریف شده است؟ src/main/resources/application.properties
را باز کنید و دو خط مشاهده شده در فهرست ۸ را اضافه کنید.
فهرست ۸. تعریف ویژگی های کلاینت REST در application.properties
com.infoworld.client.SwapiClient/mp-rest/url=https://swapi.dev/api
com.infoworld.client.SwapiClient/mp-rest/scope=javax.inject.Singleton
اطلاعات بیشتر در مورد این ویژگی ها و نحوه اتصال آنها به برنامه اینجا موجود است.< /p>
اکنون GreetingResource را برای استفاده از سرویس مشتری جدید، مانند فهرست ۹، به روز کنید.
فهرست ۹. GreetingResource با استفاده از مشتری REST
package com.infoworld;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.inject.Inject;
import com.infoworld.service.MyService;
import com.infoworld.client.SwapiClient;
import org.eclipse.microprofile.rest.client.inject.RestClient;
import org.jboss.resteasy.annotations.jaxrs.PathParam;
@Path("/hello")
public class GreetingResource {
@Inject
MyService myService;
@Inject
@RestClient
SwapiClient swapiClient;
@GET
@Produces(MediaType.TEXT_PLAIN)
public String hello() {
return "Hello, your Star Wars character is: " + swapiClient.getById(myService.getRandom()).name;
}
}
اکنون ماست مشتری را به متغیر swapiClient
تزریق می کنیم و روش getById
را با یک شناسه تصادفی از سرویس شماره تصادفی که قبلا ایجاد کرده اید فراخوانی می کنیم. اکنون پاسخی از localhost:8080/hello دریافت خواهید کرد که چیزی شبیه به این است:
Hello, your Star Wars character is: Ric Olié
جاوا بومی ابر
این یک تور گردبادی از برخی از قدرتهای کوارکوس بود، اما فقط ابتدا. Quarkus قطعا جایگزین معتبری برای Spring است و همچنان شاهد توسعه فعال است و ویژگیهای جدید و مفیدی که مکررا اضافه میشوند. دفعه بعد که به یک چارچوب جاوا دست یافتید، Quarkus را در نظر بگیرید.
همه کدهای این آموزش اینجا موجود است.
پست های مرتبط
Quarkus: با جاوا بومی Kubernetes شروع کنید
Quarkus: با جاوا بومی Kubernetes شروع کنید
Quarkus: با جاوا بومی Kubernetes شروع کنید