۳۰ شهریور ۱۴۰۳

Techboy

اخبار و اطلاعات روز تکنولوژی

Quarkus: با جاوا بومی Kubernetes شروع کنید

Red Hat's Quarkus یک چارچوب جاوا متن باز و تمام پشته است که برای کانتینرها و محیط های ابری طراحی شده است. ببینید چرا جایگزین مناسبی برای بهار است.

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 استفاده می‌کنید.

GitHub پناهندگان Bitbucket و Bamboo را جلب می کند

هنگامی که برنامه در حالت توسعه‌دهنده در حال اجرا است، از localhost:8080 دیدن کنید و صفحه خوش‌آمدگویی مشابه شکل ۱ را مشاهده خواهید کرد.

شکل ۱. Quarkus خوش آمدید

Quarkus Welcome

کاوش در طرح‌بندی پروژه کوارکوس

داخل دایرکتوری برنامه جدید، دایرکتوری 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 را تایپ کنید.

توسعه دهندگان Go می گویند بزرگترین چالش Golang مدیریت خطا و یادگیری است

کلاس مدل

یک کلاس مدل در یک فهرست جدید ایجاد کنید: 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 را در نظر بگیرید.

همه کدهای این آموزش اینجا موجود است.