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

Techboy

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

مقدمه ای به Micronaut: یک چارچوب جاوا بومی ابری

Micronaut کامپایل زود هنگام، NIO واکنشی و پشتیبانی بومی ابری را برای میکروسرویس ها و توسعه بدون سرور ارائه می دهد. ممکن است فریم ورک جاوا بعدی شما باشد؟

Micronaut کامپایل زود هنگام، NIO واکنشی و پشتیبانی بومی ابری را برای میکروسرویس ها و توسعه بدون سرور ارائه می دهد. ممکن است فریم ورک جاوا بعدی شما باشد؟

چارچوب 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 را دانلود کرده و به مسیر خود اضافه کنید.

نحوه ترسیم روابط شی با استفاده از Dapper در ASP.NET Core

پس از اتمام نصب، ابزار 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 و دیگر چارچوب‌های جاوای ابری قرار دارد. این یک جایگزین با طراوت برای راه حل های موجود است.