Micronaut کامپایل زود هنگام، NIO واکنشی و پشتیبانی بومی ابری را برای میکروسرویس ها و توسعه بدون سرور ارائه می دهد. ممکن است فریم ورک جاوا بعدی شما باشد؟
- ویژگی های Micronaut
- شروع به کار با Micronaut
- یک کنترلکننده Micronaut اضافه کنید
- افزودن یک لایه سرویس Micronaut
- NIO واکنشی با Micronaut
- استفاده از CLI Micronaut برای ایجاد اجزای جدید
- توسعه بومی Cloud با Micronaut
- نتیجهگیری
چارچوب Spring مدتهاست که بر توسعه جاوای پشتیبان تسلط داشته است، اما چندین چارچوب جدید این وضعیت موجود را به چالش میکشند. Micronaut در میان قانعکنندهترین آنهاست. Micronaut که توسط تیم سازنده Grails ساخته شده است، برای معماری های مدرن ساخته شده است.
این مقاله یک معرفی عملی برای Micronaut است. ما با یک برنامه ساده مبتنی بر API RESTful شروع می کنیم، آن را برای IO غیر مسدود کننده واکنشی (NIO واکنشی) بازسازی می کنیم، سپس نگاهی گذرا به پشتیبانی Micronaut برای توسعه ابری در میکروسرویس ها و معماری های بدون سرور بیندازیم.
چیزهای ویژه در مورد Micronaut
Micronaut مجموعهای از مزایای به دست آمده از چارچوبهای قدیمیتر مانند Spring و Grails را ارائه میدهد. این به عنوان “بومی ابر بومی” نامگذاری شده است، به این معنی که از ابتدا برای محیط های ابری ساخته شده است. قابلیتهای بومی ابری آن شامل تشخیص محیط، کشف سرویس، و ردیابی توزیع شده است.
Micronaut همچنین یک کانتینر جدید وارونگی کنترل (IoC) ارائه میکند که از کامپایلسازی پیش از زمان (AoT) برای راهاندازی سریعتر استفاده میکند. کامپایل AoT به این معنی است که زمان راه اندازی با اندازه پایگاه کد افزایش نمی یابد. این امر به ویژه برای استقرارهای بدون سرور و مبتنی بر کانتینر، که در آن گرهها اغلب در پاسخ به تقاضا بسته میشوند و چرخانده میشوند، بسیار مهم است.
Micronaut یک چارچوب JVM چند زبانه است که در حال حاضر جاوا، Groovy و Kotlin را پشتیبانی میکند و پشتیبانی Scala در حال انجام است.
در نهایت، Micronaut از برنامه نویسی واکنشی پشتیبانی می کند. توسعه دهندگان می توانند از ReactiveX یا استفاده کنند راکتور داخل چارچوب. از Micronaut 3 که در ژوئیه منتشر شد ۲۰۲۱، راکتور رویکرد توصیه شده است. (توجه داشته باشید که هیچ کتابخانه Reactive به عنوان وابستگی گذرا در نسخههای جدید گنجانده نشده است.)
شروع به کار با Micronaut
Micronaut از طریق SDKMan بر روی هر سیستم مبتنی بر Unix، از جمله Linux و macOS نصب میشود. اگر در ویندوز هستید، Micronaut Binary را دانلود کرده و به مسیر خود اضافه کنید.
پس از اتمام نصب، ابزار mn
را در خط فرمان خود خواهید یافت.
یک پوسته را باز کنید و یک نقطه مناسب پیدا کنید. mn create-app micronaut-idg --build maven
را تایپ کنید. Micronaut از Gradle و Maven از طریق wrapper ها پشتیبانی می کند، بنابراین نیازی به نصب خود ابزار ساخت ندارید. من Maven را ترجیح می دهم. اگر Gradle را دوست دارید، پرچم --build maven
را در دستور قبلی کنار بگذارید.
اگر سرور را با mvnw mn:run
اجرا میکنید، میتوانید http://localhost:8080/ را در مرورگر خود ضربه بزنید و به شما این امکان را میدهد یک پاسخ پیش فرض JSON “یافت نشد”.
اگر طرح پروژه نمونه را بررسی کنید، این یک پروژه استاندارد Maven با کلاس main
در src/main/java/micronaut/idg/Application.java
است. توجه داشته باشید که کلاس main
یک سرور جاسازی شده را اجرا می کند. هنگامی که کد را تغییر می دهید، سرور توسعه Micronaut به طور خودکار برنامه در حال اجرا را به روز می کند.
یک کنترلر Micronaut اضافه کنید
درست مانند Spring MVC، میتوانید کلاسهای کنترلکننده را برای نقشهبرداری URLها به کنترلکنندههای کد اضافه کنید. یک کلاس در src/main/java/micronaut/idg/controller/SimpleController
اضافه کنید. بیایید از این کنترلر برای ایجاد یک پاسخ متنی، همانطور که در فهرست ۱ نشان داده شده است، استفاده کنیم.
package micronaut.idg.controller;
import io.micronaut.http.MediaType;
import io.micronaut.http.annotation.Controller;
import io.micronaut.http.annotation.Get;
@Controller("/simple")
public class SimpleController {
@Get(produces = MediaType.TEXT_PLAIN)
public String index() {
return "A Simple Endpoint";
}
}
اکنون میتوانید ببینید که چقدر آسان است که یک پاسخ با قالب JSON را برگردانید، همانطور که در فهرست ۲ نشان داده شده است.
package micronaut.idg.controller;
import io.micronaut.http.MediaType;
import io.micronaut.http.annotation.Controller;
import io.micronaut.http.annotation.Get;
import java.util.Map;
import java.util.HashMap;
@Controller("/simple")
public class SimpleController {
@Get(produces = MediaType.APPLICATION_JSON)
public Map index() {
Map msg = new HashMap();
msg.put("message", "A simple message");
return msg;
}
}
فهرست ۲ مدیریت هوشمند Micronaut با آرگومان تولید
به حاشیهنویسی @Get
را نشان میدهد. در این مورد، پاسخی با فرمت JSON را که ما تنظیم کرده ایم صادر می کند.
افزودن یک لایه سرویس Micronaut
پیادهسازی IoC Micronaut منحصربهفرد است زیرا از قبل اجرا میشود، اما همچنان یک پیادهسازی کامل از مشخصات CDI (Contexts و Dependency Injection) است. این بدان معنی است که می توانید از تمام حاشیه نویسی های آشنای DI که احتمالاً از Spring می شناسید (مانند @Inject
) استفاده کنید.
در فهرست ۳، ما یک Bean لایه سرویس را برای ارائه پیام سیم کشی می کنیم. در یک برنامه واقعی، این کلاس می تواند از طریق یک Bean دسترسی به داده، به یک datastore یا برخی API راه دور دیگر فراخوانی کند.
یک پوشه src/main/java/micronaut/idg/service
ایجاد کنید و دو فایل مشاهده شده در فهرست ۳ را اضافه کنید – یک رابط (Simple
) و اجرای آن ( SimpleService
).
// Simple.java
package micronaut.idg.service;
public interface Simple {
public String getMessage();
}
// SimpleService.java
package micronaut.idg.service;
import jakarta.inject.Singleton;
@Singleton
public class SimpleService implements Simple {
public String getMessage(){
return "A simple service message";
}
}
اکنون میتوانید با تزریق سرویس به SimpleController
که در فهرست ۱ ایجاد کردهاید، از لایه سرویس جدید خود استفاده کنید. فهرست ۴ تزریق Constructor
را نشان میدهد.
@Controller("/simple")
public class SimpleController {
@Inject
private final Simple simpleService;
public SimpleController(@Named("simpleService") Simple simple) { // (۱)
this.simpleService = simple;
}
@Get(produces = MediaType.APPLICATION_JSON)
public Map index() {
Map msg = new HashMap();
msg.put("message", simpleService.getMessage());
return msg;
}
}
کار مهم در خطی که “(۱)” نوشته شده است، انجام می شود، جایی که سرویس bean با نام سیم کشی می شود. اکنون، اگر از http://localhost:8080/simple بازدید کنید، پاسخ لایه سرویس را خواهید دید: {"message":"یک پیام سرویس ساده"} کد>.
NIO واکنشی با Micronaut
بعد، بیایید با استفاده از Micronaut with Reactor کاوش کنیم. در این مورد، ما فقط برنامه فعلی خود را برای استفاده از Reactor و غیر مسدود کننده IO تغییر می دهیم. برنامه همان کار را انجام می دهد، اما با استفاده از یک پشته غیر مسدود - Reactor و Netty - در زیر سرپوش.
همانطور که قبلاً اشاره کردم، Micronaut 3 به طور پیشفرض شامل یک کتابخانه واکنشی نیست، بنابراین با افزودن هسته Reactor به Maven POM خود، همانطور که در فهرست ۵ نشان داده شده است، شروع کنید.
<dependency>
<groupId>io.projectreactor</groupId>
<artifactId>reactor-core</artifactId>
<version>3.4.11</version>
</dependency>
اکنون می توانید به SimpleController
برگردید و آن را همانطور که در لیست ۶ نشان داده شده است تغییر دهید.
import reactor.core.publisher.Mono;
//...
@Get
public Mono<map> index() {
Map msg = new HashMap();
msg.put("message", simpleService.getMessage());
return Mono.just(msg);
}
}
همانطور که می بینید، ما فقط همان نوع برگشتی (نقشه ای از string/string
) را با کلاس Reactor Mono
بسته بندی می کنیم.
پشتیبانی مشابه برای مصرف سرویس های راه دور به صورت واکنشی وجود دارد، بنابراین می توانید یک برنامه را به طور کامل در IO غیر مسدود کننده اجرا کنید.
استفاده از CLI Micronaut برای ایجاد اجزای جدید
می توانید از ابزار خط فرمان Micronaut برای حذف اجزا استفاده کنید. به عنوان مثال، اگر می خواهید یک کنترلر جدید اضافه کنید، می توانید از دستور mn add-controller MyController
استفاده کنید. همانطور که در فهرست ۷ نشان داده شده است، یک کنترلر جدید و آزمایشات مربوط به آن را خروجی می دهد.
mn create-controller MyController
| Rendered controller to src/main/java/micronaut/idg/MyControllerController.java
| Rendered test to src/test/java/micronaut/idg/MyControllerControllerTest.java
توسعه بومی Cloud با Micronaut
من قبلاً اشاره کردم که Micronaut از ابتدا برای میکروسرویسهای بومی ابری و توسعه بدون سرور ساخته شده است. یک مفهوم بومی ابری که Micronaut از آن پشتیبانی می کند فدراسیون است. ایده فدراسیون این است که چندین برنامه کوچکتر تنظیمات یکسانی را به اشتراک می گذارند و می توانند پشت سر هم مستقر شوند. اگر بسیار شبیه معماری میکروسرویس به نظر می رسد، حق با شماست. هدف این است که توسعه میکروسرویس را ساده تر کرده و آن را قابل مدیریت نگه دارد. برای اطلاعات بیشتر درباره خدمات فدرال، به مستندات Micronaut مراجعه کنید.. p>
Micronaut همچنین هدف قرار دادن محیط های ابری را برای استقرار آسان می کند. به عنوان مثال، همانطور که در فهرست ۸ نشان داده شده است، می توانید رجیستری Docker پلتفرم Google Cloud را هدف قرار دهید.
./mvnw deploy \
-Dpackaging=docker \
-Djib.to.image=gcr.io/my-org/my-project:latest
در این مورد، پروژه به عنوان یک تصویر Docker به رجیستری GCP Docker منتقل میشود. توجه داشته باشید که ما از افزونه Jib Maven استفاده کردهایم. یک پروژه جاوا در یک تصویر داکر بدون نیاز به ایجاد یک فایل داکر واقعی.
همچنین توجه داشته باشید که Docker را به عنوان ابزار بسته بندی با -Dpackaging=docker
شناسایی کرده ایم. هنگامی که بسته بندی کامل شد، می توانید پروژه خود را با ابزار خط فرمان GCP اجرا کنید، همانطور که در فهرست ۹ نشان داده شده است.
gcloud run deploy \
--image=gcr.io/my-org/my-project:latest \
--platform managed \
--allow-unauthenticated
Tracing یکی دیگر از ویژگیهای بومی ابری است که Micronaut از آن پشتیبانی میکند. به عنوان مثال، Micronaut فعال کردن Jaeger ردیابی توزیع شده از طریق حاشیه نویسی.
فهرست ۱۰ Jaeger را برای ردیابی تمام درخواستهای موجود در فایل application.xml
یک برنامه میکروسرویس پیکربندی میکند.
tracing:
jaeger:
enabled: true
sampler:
probability: 1
نتیجه گیری
Micronaut مجموعهای از ویژگیها را ارائه میدهد که برای توسعه ابری و میکروسرویس فوقالعاده هستند. در عین حال، این چارچوب توسعه سنتی مبتنی بر API را ساده و ساده میکند. و به خوبی با Reactor و Netty برای NIO واکنشی ادغام می شود.
Micronaut در کنار Quarkus، Dropwizard و دیگر چارچوبهای جاوای ابری قرار دارد. این یک جایگزین با طراوت برای راه حل های موجود است.
پست های مرتبط
مقدمه ای به Micronaut: یک چارچوب جاوا بومی ابری
مقدمه ای به Micronaut: یک چارچوب جاوا بومی ابری
مقدمه ای به Micronaut: یک چارچوب جاوا بومی ابری