چگونه کوارکوس MicroProfile و Spring را با هم ترکیب می کند

سلام به همه، اینم پست سوم از سری کوارکوس!

چگونه کوارکوس MicroProfile و Spring را با هم ترکیب می کند

هنگام توسعه میکروسرویس های جاوا، اغلب این باور وجود دارد که Eclipse MicroProfile и چکمه بهاری APIهای مجزا و مستقل هستند. به‌طور پیش‌فرض، برنامه‌نویسان تمایل دارند از APIهایی استفاده کنند که قبلاً به آن‌ها عادت کرده‌اند، زیرا یادگیری چارچوب‌های جدید و اجزای زمان اجرا زمان زیادی می‌برد. امروز ما سعی خواهیم کرد توسعه برخی از محبوب ها را ساده کنیم MicroProfile API برای توسعه دهندگان Spring و به شما نشان می دهد که چگونه به طور همزمان از Spring API و ویژگی های مفید جدید استفاده کنید کوارکوس.

با کمی جزئیات بیشتر، ابتدا به محدوده و جزئیات نحوه پشتیبانی Quarkus از Spring APIها نگاه می کنیم تا به توسعه دهندگان Spring نحوه استفاده از MicroProfile API در کارهای روزمره خود را نشان دهیم. سپس ما API های MicroProfile را پوشش خواهیم داد، که برای توسعه دهندگان Spring هنگام ایجاد میکروسرویس ها مفید هستند.

چرا کوارکوس؟ اولاً، این کدگذاری زنده است، یعنی بارگذاری مجدد خودکار هرگونه تغییر در MicroProfile API، Spring API و سایر API های جاوا، که تنها با یک دستور انجام می شود: mvn quarkus:dev. ثانیاً در مورد بحث در مثال ما سرویس Person (که از Spring، MicroProfile، و APIهای JPA به یک باینری با استفاده از تصویر اصلی GraalVM کامپایل می‌شود) تنها در 0.055 ثانیه شروع می‌شود و حدود 90 مگابایت رم (RSS) را در نقطه پایانی برنامه RESTful اشغال می‌کند. علاوه بر این، خود کامپایل آن تنها با یک دستور انجام می شود: بسته mvn -Pnative.

ما به جزییات در مورد MicroProfile نمی پردازیم، به جز اینکه به توسعه دهندگان Spring کمک کنیم بفهمند چگونه می توانند از Spring API با MicroProfile API در Quarkus استفاده کنند.

کانتینرها و Kubernetes

برای ساده نگه داشتن این مقاله، در اینجا فقط جنبه های سطح بالای پشتیبانی را پوشش می دهیم. کوبرنیتس، زیرا درک آن مهم است. Quarkus به عنوان پشته جاوا برای Kubernetes قرار گرفته است، برای به حداقل رساندن مصرف حافظه و زمان راه اندازی برنامه ها و سرویس های جاوا و در نتیجه افزایش تراکم آنها بر روی هاست و کاهش هزینه های کلی طراحی شده است.

کوارکوس نیز از تولید خودکار پشتیبانی می کند منابع و پیشنهادات Kubernetes راهنماها برای استقرار در پلتفرم های Kubernetes و Red Hat OpenShift. علاوه بر این، Quarkus به طور خودکار فایل های Dockerfile.jvm (بسته بندی JVM) و Dockerfile.native (بسته بندی باینری بومی) مورد نیاز برای ایجاد کانتینرها را تولید می کند.

در نهایت، با تمرکز بر Kubernetes به عنوان محیط استقرار هدف، Quarkus از چارچوب های جاوا در مواردی که عملکرد مشابه در سطح خود پلت فرم Kubernetes پیاده سازی می شود، استفاده نمی کند. جدول 1 نقشه ای از مطابقت عملکردی بین Kubernetes و چارچوب های جاوای معمولی که توسط توسعه دهندگان Spring استفاده می شود را ارائه می دهد.

جدول 1. نقشه تناظر عملکردی بین چارچوب های جاوا و Kubernetes.

عملکردی
چکمه سنتی بهاری
کوبرنیتس

کشف خدمات
ابراز پیروزی از اکتشاف
DNS

پیکر بندی
پیکربندی ابر Spring
پیکربندی نقشه ها / اسرار

تعادل بار
روبان (سمت مشتری)
سرویس، کنترل کننده تکرار (سمت سرور)

کامپایل و اجرای کد از مثال

در این مقاله به پروژه نمونه، جایی که API های Spring و MicroProfile و حتی کلاس جاوا یکسان با هم استفاده می شوند. کد موجود در این مثال را می توان از خط فرمان کامپایل و اجرا کرد، برای جزئیات به فایل README.md مراجعه کنید.

Spring Framework APIs

تزریق وابستگی

کوارکوس طیف وسیعی از APIهای زمینه و تزریق وابستگی (CDI). و APIهای تزریق وابستگی بهار (Spring DI). اگر با MicroProfile کار می کنید، جاوا EE و جاکارتا EE، پس شما قبلاً با CDI بسیار آشنا هستید. از سوی دیگر، توسعه دهندگان Spring می توانند از Quarkus Extension for Spring DI API برای دستیابی به سازگاری با Spring DI استفاده کنند. نمونه هایی از استفاده از Spring DI API های پشتیبانی شده در جدول 2 آورده شده است.

В پروژه از مثال ما هم از CDI و هم از تزریق وابستگی بهار استفاده می کند. برای اطلاعات بیشتر و مثال هایی در این زمینه به راهنمای کوارکوس به نام مراجعه کنید راهنمای DI بهار.

جدول 2. نمونه هایی از استفاده از Spring DI API های پشتیبانی شده.

پشتیبانی از ویژگی های Spring DI
نمونه

تزریق سازنده

public PersonSpringController(
   PersonSpringRepository personRepository,  // injected      
   PersonSpringMPService personService) {    // injected
      this.personRepository = personRepository;
      this.personService = personService;
}

تزریق میدانی
سیم کشی خودکار
ارزش

@Autowired
@RestClient
SalutationRestClient salutationRestClient;

@Value("${fallbackSalutation}")
String fallbackSalutation;

حبوبات
@ پیکربندی

@Configuration
public class AppConfiguration {
   @Bean(name = "capitalizeFunction")
   public StringFunction capitalizer() {
      return String::toUpperCase;
   }
}

جزء

@Component("noopFunction")
public class NoOpSingleStringFunction implements StringFunction {
   @Override
   public String apply(String s) {
      return s;
   }
}

محصولات

@Service
public class MessageProducer {
   @Value("${greeting.message}")
   String message;

   public String getPrefix() {
      return message;
   }
}

چارچوب وب

کاربران MicroProfile دوست دارند که Quarkus از JAX-RS، MicroProfile Rest Client، JSON-P و JSON-B به عنوان مدل اصلی برنامه نویسی وب پشتیبانی کند. توسعه دهندگان Spring از پشتیبانی اخیر Quarkus از Spring Web API، به ویژه رابط های REST خوشحال خواهند شد. مشابه Spring DI، هدف اصلی پشتیبانی Spring Web API این است که توسعه دهندگان Spring را قادر سازد تا از Spring Web APIها در ارتباط با MicroProfile API استفاده کنند. نمونه هایی از نحوه استفاده از Spring Web API های پشتیبانی شده در جدول 3 ارائه شده است و اطلاعات و نمونه های بیشتر در مورد این موضوع را می توانید در آموزش کوارکوس به نام راهنمای وب بهار.

جدول 3. نمونه هایی از استفاده از Spring Web APIهای پشتیبانی شده.

پشتیبانی از ویژگی های وب بهار
نمونه

@RestController
@RequestMapping

@RestController
@RequestMapping("/person")
public class PersonSpringController {
   ...
   ...
   ...
}

@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
@RequestParam
@RequestHeader
@MatrixVariable
@PathVariable
@CookieValue
@RequestBody
@ResponseStatus
@ExceptionHandler
@RestControllerAdvice (جزئی)

@GetMapping(path = "/greet/{id}",
   produces = "text/plain")
   public String greetPerson(
   @PathVariable(name = "id") long id) {
   ...
   ...
   ...
}

بهار داده JPA

کاربران MicroProfile همچنین از اینکه Quarkus از JPA با استفاده از Hibernate ORM پشتیبانی می کند قدردانی خواهند کرد. همچنین خبر خوبی برای توسعه دهندگان Spring وجود دارد: Quarkus از حاشیه نویسی ها و انواع رایج Spring Data JPA پشتیبانی می کند. نمونه هایی از استفاده از Spring Data JPA API های پشتیبانی شده در جدول 4 آورده شده است.
В پروژه از مثال ما Spring Data JPA API استفاده می شود و اطلاعات بیشتر در آموزش کوارکوس به نام موجود است راهنمای JPA داده بهار.

جدول 4. نمونه هایی از استفاده از Spring Data JPA API های پشتیبانی شده.

پشتیبانی از ویژگی های Spring Data JPA
نمونه

CrudRepository

public interface PersonRepository
         extends JpaRepository,
                 PersonFragment {
   ...
}

مخزن
JpaRepository
مخزن PagingAndSorting

public class PersonRepository extends 

    Repository {

    Person save(Person entity);

    Optional findById(Person entity);
}

قطعات مخزن

public interface PersonRepository
         extends JpaRepository,
                 PersonFragment {
   ...
}

روش های پرس و جو مشتق شده

public interface PersonRepository extends CrudRepository {

    List findByName(String name);
    
    Person findByNameBySsn(String ssn);
    
    Optional 
       findByNameBySsnIgnoreCase(String ssn);

    Boolean existsBookByYearOfBirthBetween(
            Integer start, Integer end);
}

پرس و جوهای تعریف شده توسط کاربر

public interface MovieRepository
         extends CrudRepository {

    Movie findFirstByOrderByDurationDesc();

    @Query("select m from Movie m where m.rating = ?1")
    Iterator findByRating(String rating);

    @Query("from Movie where title = ?1")
    Movie findByTitle(String title);
}

API های MicroProfile

تحمل خطا

سازه های تحمل خطا برای جلوگیری از خرابی های آبشاری و ایجاد معماری های میکروسرویس قابل اعتماد بسیار مهم هستند. توسعه دهندگان فنری سال هاست که از مدارشکن برای تحمل خطا استفاده می کنند. هیستریکس. با این حال، Hystrix برای مدت طولانی به‌روزرسانی نشده است، اما Fault Tolerance MicroProfile اکنون به طور فعال در حال توسعه است و چندین سال استفاده از تولید را پشت سر گذاشته است. بنابراین، برای بهبود قابلیت اطمینان خدمات در کوارکوس، توصیه می شود از API های MicroProfile Fault Tolerance استفاده کنید که نمونه هایی از آن در جدول 5 استفاده شده است. برای اطلاعات بیشتر در این زمینه، به کتابچه راهنمای کوارکوس مراجعه کنید. راهنمای تحمل خطا.

جدول 5. نمونه هایی از استفاده از MicroProfile Fault Tolerance API های پشتیبانی شده.

ویژگی های MicroProfile Fault Tolerance
شرح
نمونه

@نامتقارن

اجرای منطق در یک موضوع جداگانه

@Asynchronous
@Retry
public Future<String> getSalutation() {
   ...
   return future;
}

@Bulkhead

تعداد درخواست های همزمان را محدود کنید

@Bulkhead(5)
public void fiveConcurrent() {
   makeRemoteCall(); //...
}

@CircuitBreaker

مدیریت هوشمند شکست و بازیابی از شکست

@CircuitBreaker(delay=500   // milliseconds
   failureRatio = .75,
   requestVolumeThreshold = 20,
   successThreshold = 5)
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
   makeRemoteCall(); //...
}

@Fallback

فراخوانی منطق جایگزین در صورت شکست

@Timeout(500) // milliseconds
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
   makeRemoteCall(); //...
}

public String fallback() {
   return "hello";
}

دوباره امتحان کنید

در صورت شکست درخواست دوباره امتحان کنید

@Retry(maxRetries=3)
public String getSalutation() {
   makeRemoteCall(); //...
}

وقفه

وقفه کنترل شکست

@Timeout(value = 500 )   // milliseconds
@Fallback(fallbackMethod = "fallback")
public String getSalutation() {
   makeRemoteCall(); //...
}

بررسی خدمات (سرویس سلامت)

پلتفرم های Kubernetes با استفاده از خدمات ویژه سلامت کانتینرها را نظارت می کنند. برای اجازه دادن به پلتفرم زیربنایی برای نظارت بر خدمات، توسعه دهندگان Spring معمولاً از HealthIndicator سفارشی و Spring Boot Actuator استفاده می کنند. در Quarkus، این کار را می توان با استفاده از MicroProfile Health انجام داد، که به طور پیش فرض یک بررسی زنده بودن را انجام می دهد، اما می توان آن را به گونه ای پیکربندی کرد که به طور همزمان زنده بودن و آمادگی را بررسی کند. نمونه هایی از نحوه استفاده از MicroProfile Health API های پشتیبانی شده در جدول 6 ارائه شده است و اطلاعات اضافی در کتابچه راهنمای Quarku ارائه شده است. راهنمای سلامت.

جدول 6: نمونه های استفاده از MicroProfile Health API های پشتیبانی شده.

ویژگی های MicroProfile Health
شرح
نمونه

@Liveness

پلتفرم برنامه‌های کانتینری ناموفق را راه‌اندازی مجدد می‌کند
نقطه پایان:
میزبان:8080/health/live

@Liveness
public class MyHC implements HealthCheck {
  public HealthCheckResponse call() {

   ...
   return HealthCheckResponse
     .named("myHCProbe")
     .status(ready ? true:false)
     .withData("mydata", data)
     .build();  
}

@آمادگی

اگر پلتفرم آماده نباشد، ترافیک را به برنامه های کانتینری ارسال نمی کند
نقطه پایان:
میزبان:8080/health/ready

@Readiness
public class MyHC implements HealthCheck {
  public HealthCheckResponse call() {

   ...
   return HealthCheckResponse
     .named("myHCProbe")
     .status(live ? true:false)
     .withData("mydata", data)
     .build();  
}

معیارهای

برنامه‌ها معیارهایی را برای اهداف عملیاتی (برای نظارت بر SLAهای عملکرد) یا اهداف غیرعملیاتی (SLAهای تجاری) ارائه می‌کنند. توسعه دهندگان فنری معیارهایی را با استفاده از محرک و میکرومتر Spring Boot ارائه می دهند. به نوبه خود، Quarkus از MicroProfile Metrics برای ارائه معیارهای پایه (JVM و سیستم عامل)، معیارهای فروشنده (Quarkus) و معیارهای برنامه استفاده می کند. MicroProfile Metrics مستلزم آن است که پیاده‌سازی از فرمت‌های خروجی JSON و OpenMetrics (Prometheus) پشتیبانی کند. نمونه هایی از استفاده از MicroProfile Metrics API در جدول 7 آورده شده است.

В پروژه از مثال ما MicroProfile Metrics برای ارائه معیارهای برنامه استفاده می شود. برای اطلاعات بیشتر به کتابچه راهنمای کوارکوس مراجعه کنید راهنمای متریک.

جدول 7. نمونه هایی از استفاده از MicroProfile Metrics API.

ویژگی های MicroProfile Metrics
شرح
نمونه

@ شمارش شد

شمارنده ای را نشان می دهد که تعداد دفعاتی که یک شی مشروح فراخوانی شده است را می شمارد

@Counted(name = "fallbackCounter", 
  displayName = "Fallback Counter", 
  description = "Fallback Counter")
public String salutationFallback() {
   return fallbackSalutation;
}

@ConcurrentGauge

نشان‌دهنده گیجی است که تعداد تماس‌های همزمان یک شی مشروح را می‌شمارد

@ConcurrentGuage(
  name = "fallbackConcurrentGauge", 
  displayName="Fallback Concurrent", 
  description="Fallback Concurrent")
public String salutationFallback() {
   return fallbackSalutation;
}

@Gauge

یک سنسور سنج را نشان می دهد که مقدار یک شی مشروح را اندازه می گیرد

@Metered(name = "FallbackGauge",
   displayName="Fallback Gauge",
   description="Fallback frequency")
public String salutationFallback() {
   return fallbackSalutation;
}

@Metered

یک سنسور متر را نشان می دهد که فرکانس تماس یک شی مشروح را نظارت می کند

@Metered(name = "MeteredFallback",
   displayName="Metered Fallback",
   description="Fallback frequency")
public String salutationFallback() {
   return fallbackSalutation;
}

متری

حاشیه نویسی حاوی اطلاعاتی درباره ابرداده هنگام دریافت درخواست برای وارد کردن یا تولید یک معیار

@Metric
@Metered(name = "MeteredFallback",
   displayName="Metered Fallback",
   description="Fallback frequency")
public String salutationFallback() {
   return fallbackSalutation;
}

به پایان رسید

یک تایمر را نشان می دهد که مدت زمان یک شی مشروح را ردیابی می کند

@Timed(name = "TimedFallback",
   displayName="Timed Fallback",
   description="Fallback delay")
public String salutationFallback() {
   return fallbackSalutation;
}

نقاط پایانی متریک

معیارهای کاربردی localhost را:8080/metrics/application
معیارهای اساسی localhost را:8080/metrics/base
معیارهای فروشنده localhost را:8080/metrics/فروشنده
تمام معیارها localhost را:8080/metrics

MicroProfile Rest Client

Microservice ها اغلب نقاط پایانی RESTful را ارائه می دهند که برای کار با آنها به API های مشتری مربوطه نیاز دارند. برای استفاده از نقاط پایانی RESTful، توسعه دهندگان Spring معمولاً از RestTemplate استفاده می کنند. Quarkus API های MicroProfile Rest Client را برای حل این مشکل ارائه می دهد که نمونه هایی از استفاده از آن در جدول 8 آورده شده است.

В پروژه از مثال ما استفاده از نقاط پایانی RESTful با استفاده از MicroProfile Rest Client انجام می شود. اطلاعات بیشتر و مثال‌های مربوط به این موضوع را می‌توانید در کتابچه راهنمای کوارکوس بیابید راهنمای مشتری استراحت.

جدول 8. نمونه هایی از استفاده از MicroProfile Rest Client API.

ویژگی های MicroProfile Rest Client
شرح
نمونه

@RegisterRestClient

یک رابط جاوای تایپ شده را به عنوان مشتری REST ثبت می کند

@RegisterRestClient
@Path("/")
public interface MyRestClient {
    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String getSalutation();
}

@RestClient

اجرای نمونه ای از رابط مشتری REST تایپ شده را علامت گذاری می کند

@Autowired // or @Inject
@RestClient
MyRestClient restClient;

فراخوان

یک نقطه پایانی REST را فراخوانی می کند

System.out.println(
   restClient.getSalutation());

mp-rest/url

نقطه پایانی REST را مشخص می کند

application.properties:
org.example.MyRestClient/mp-rest/url=
   http://localhost:8081/myendpoint

نمایش نتایج: از

در این وبلاگ که هدف اصلی آن توسعه دهندگان Spring است، نگاهی گذرا به نحوه استفاده از API های Spring با رابط های برنامه کاربردی MicroProfile در کوارکوس برای توسعه میکروسرویس های جاوا انداختیم و سپس آنها را در کد باینری بومی کامپایل کردیم که صدها مگابایت رم ذخیره می کند و راه اندازی می شود. یک موضوع میلی ثانیه

همانطور که قبلا متوجه شدید، اطلاعات بیشتر در مورد پشتیبانی از API های Spring و MicroProfile و همچنین بسیاری از اطلاعات مفید دیگر را می توانید در کتابچه راهنمای کوارکوس.

منبع: www.habr.com

اضافه کردن نظر