كيف يجمع Quarkus بين MicroProfile و Spring

مرحباً بالجميع ، وها هو المنشور الثالث من سلسلة Quarkus!

كيف يجمع Quarkus بين MicroProfile و Spring

عند تطوير خدمات Java المصغرة ، غالبًا ما يُفترض ذلك ملف تعريف Eclipse MicroProfile и التمهيد الربيع هي واجهات برمجة تطبيقات منفصلة ومستقلة. بشكل افتراضي ، يميل المبرمجون إلى استخدام واجهات برمجة التطبيقات التي اعتادوا عليها بالفعل ، لأن تعلم الأطر الجديدة ومكونات وقت التشغيل يستغرق وقتًا طويلاً. اليوم سنحاول تبسيط تطوير بعض الشعبية MicroProfile API لمطوري الربيع وشرح كيفية استخدام Spring API والميزات المفيدة الجديدة في نفس الوقت كواركوس.

بمزيد من التفاصيل ، سننظر أولاً في نطاق وتفاصيل كيفية دعم Quarkus لواجهات برمجة تطبيقات Spring لتوضيح لمطوري Spring كيفية استخدام MicroProfile API في عملهم اليومي. ثم سنتحدث عن MicroProfile API ، والتي ستكون مفيدة لمطوري Spring عند إنشاء الخدمات المصغرة.

لماذا كواركوس؟ أولاً ، هذا هو الترميز المباشر ، أي إعادة التحميل التلقائي لأية تغييرات في MicroProfile API و Spring API و Java APIs الأخرى ، والتي يتم تنفيذها بأمر واحد فقط: mvn quarkus: dev. ثانيًا ، يعتبر في مثالنا تبدأ خدمة الشخص (التي تجمع من Spring و MicroProfile و JPA APIs إلى ثنائي باستخدام صورة GraalVM الأصلية) في 0.055 ثانية فقط وتستهلك حوالي 90 ميجابايت من ذاكرة الوصول العشوائي (RSS) في نقطة نهاية التطبيق RESTful. علاوة على ذلك ، يتم تنفيذ التجميع نفسه بأمر واحد فقط: mvn package -Pnative.

لن نتعمق في تفاصيل MicroProfile ، لكننا سنحاول فقط مساعدة مطوري Spring على فهم كيف يمكن لـ Quarkus استخدام واجهات برمجة تطبيقات Spring جنبًا إلى جنب مع MicroProfile APIs.

حاويات و Kubernetes

حتى لا تفرط في تحميل هذه المقالة ، سنغطي فقط جوانب الدعم عالية المستوى هنا. Kubernetesلأنه من المهم أن نفهم. تم وضع Quarkus كمكدس Java لـ Kubernetes ، وهو مصمم لتقليل استهلاك الذاكرة ووقت بدء تشغيل تطبيقات وخدمات Java ، ونتيجة لذلك ، زيادة كثافتها على المضيف وتقليل التكاليف الإجمالية.

كواركوس أيضا يدعم توليد السيارات موارد وعروض Kubernetes خطوط إرشاد للنشر على منصات Kubernetes و Red Hat OpenShift. بالإضافة إلى ذلك ، يقوم Quarkus تلقائيًا بإنشاء ملفات Dockerfile.jvm (حزمة JVM) و Dockerfile.native (الحزم الثنائية الأصلية) اللازمة لإنشاء الحاويات.

وأخيرًا ، بالتركيز على Kubernetes كبيئة نشر مستهدفة ، لا يستخدم Quarkus أطر عمل Java في الحالات التي يتم فيها تنفيذ وظائف مماثلة على مستوى منصة Kubernetes نفسها. يوفر الجدول 1 تعيينًا وظيفيًا بين Kubernetes وأطر عمل Java النموذجية التي يستخدمها مطورو Spring.

الجدول 1. الخريطة الوظيفية لأطر عمل Java و Kubernetes.

وظيفي
حذاء الربيع التقليدي
Kubernetes

اكتشاف الخدمة
يوريكا
DNS

الاعداد
تكوين سحابة الربيع
تكوين الخرائط / الأسرار

تحميل موازنة
الشريط (جانب العميل)
الخدمة ، وحدة التحكم في النسخ المتماثل (جانب الخادم)

تجميع وتشغيل الكود من المثال

في هذه المقالة نشير إلى مشروع عينة، حيث يتم مشاركة Spring و MicroProfile APIs ، وحتى نفس فئة Java. يمكن ترجمة التعليمات البرمجية الموجودة في هذا المثال وتشغيلها من سطر الأوامر ، راجع ملف README.md للحصول على التفاصيل.

واجهات برمجة تطبيقات Spring Framework

حقن التبعية

يدعم Quarkus نطاقًا من السياقات وواجهات برمجة تطبيقات حقن التبعية (CDI) وواجهات برمجة تطبيقات حقن تبعية الربيع (Spring DI). إذا كنت تعمل مع MicroProfile ، Java EE و Jakarta EE، أنت بالفعل على دراية بـ CDI. من ناحية أخرى ، يمكن لمطوري Spring استخدام Quarkus Extension for Spring DI API ليكون متوافقًا مع Spring DI. أمثلة على استخدام واجهات API Spring DI المدعومة موضحة في الجدول 2.

В مشروع من مثالنا يستخدمه كل من CDI و Spring Dependency Injection. لمزيد من المعلومات والأمثلة حول هذا الموضوع ، راجع دليل Quarkus المسمى دليل Spring DI.

الجدول 2. أمثلة على استخدام واجهات API Spring DI المدعومة.

الميزات المدعومة لـ 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 بالدعم الأخير لـ Spring Web API في Quarkus ، ولا سيما الواجهات المسؤولة عن REST. على غرار Spring DI ، يتمثل الهدف الرئيسي لدعم Spring Web API في السماح لمطوري Spring باستخدام واجهات برمجة تطبيقات Spring Web جنبًا إلى جنب مع MicroProfile APIs. يتم عرض أمثلة على استخدام واجهات برمجة تطبيقات Spring Web المدعومة في الجدول 3 ، ويمكن العثور على مزيد من المعلومات والأمثلة حول هذا الموضوع في دليل Quarkus المسمى دليل الويب الربيع.

الجدول 3. أمثلة على استخدام Spring Web APIs المدعومة.

الميزات المدعومة من Spring Web
أمثلة

تضمين التغريدة
@RequestMapping

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

@GetMapping
@PostMapping
@PutMapping
@حذف الخريطة
@PatchMapping
@RequestParam
RequestHeader
تضمين التغريدة
@PathVariable
تضمين التغريدة
@RequestBody
@حالة الاستجابة
@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 APIs المدعومة موضحة في الجدول 4.
В مشروع من مثالنا يستخدم Spring Data JPA APIs ، ويتوفر المزيد من المعلومات في دليل Quarkus بعنوان دليل Spring Data JPA.

الجدول 4. أمثلة على استخدام واجهات برمجة تطبيقات Spring Data JPA المدعومة.

الميزات المدعومة Spring Data JPA
أمثلة

مستودع Crud

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

مستودع
مستودع Jpa
PagingAndSortingRepository

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);
}

واجهات برمجة تطبيقات MicroProfile

التسامح مع الخطأ

تكوينات تحمل الأعطال مهمة جدًا لمنع حالات الفشل المتتالية وبناء بنيات قوية للخدمات الدقيقة. يستخدم مطورو الربيع قواطع دوائر للتسامح مع الأعطال لسنوات عديدة. هيستريكس. ومع ذلك ، لم يتم تحديث Hystrix لفترة طويلة ، ولكن تسامح خطأ MicroProfile يتطور الآن بنشاط ولديه عدة سنوات من استخدام الإنتاج وراءه. لذلك ، لتحسين موثوقية الخدمات في Quarkus ، يوصى باستخدام واجهات برمجة التطبيقات MicroProfile Fault Tolerance API ، والتي ترد أمثلة عليها في الجدول 5. لمزيد من المعلومات حول هذا ، راجع دليل Quarkus. دليل التسامح مع الخطأ.

الجدول 5. أمثلة استخدام واجهة برمجة التطبيقات (API) المدعومة من MicroProfile Fault Tolerance.

ميزات التسامح مع أخطاء MicroProfile
وصف
أمثلة

@غير متزامن

تشغيل المنطق على موضوع منفصل

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

@حاجز إنشائي

تحديد عدد الطلبات المتزامنة

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

@قاطع دائرة

تجاوز الفشل والفشل الذكي

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

@تراجع

استدعاء منطق بديل في حالة الفشل

@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(); //...
}

خدمات الفحص (Service Health)

تراقب منصات Kubernetes حالة الحاويات باستخدام خدمات خاصة. من أجل النظام الأساسي الأساسي لمراقبة الخدمات ، يستخدم مطورو Spring عادةً مؤشر HealthIndicator المخصص و Spring Boot Actuator. في Quarkus ، يمكن القيام بذلك باستخدام MicroProfile Health ، والذي يقوم افتراضيًا بإجراء فحص مدى الحياة ، ولكن يمكن أيضًا تهيئته للتحقق في الوقت نفسه من الحيوية والاستعداد (الجاهزية). يتم عرض أمثلة حول كيفية استخدام واجهات برمجة التطبيقات MicroProfile Health APIs المدعومة في الجدول 6 ، ويتم توفير مزيد من المعلومات في دليل Quarkus. دليل الصحة.

الجدول 6. أمثلة على استخدام واجهات برمجة تطبيقات MicroProfile Health المدعومة.

ميزات الصحة MicroProfile
وصف
أمثلة

@ الحياة

النظام الأساسي يعيد تحميل التطبيقات الحاوية الفاشلة
نقطة النهاية:
المضيف: 8080 / صحة / حي

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

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

@الاستعداد

لن ترسل المنصة حركة مرور إلى التطبيقات المعبأة في حاويات إذا لم تكن جاهزة
نقطة النهاية:
المضيف: 8080 / صحة / جاهز

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

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

المقاييس

توفر التطبيقات مقاييس إما للأغراض التشغيلية (لمراقبة مستوى أداء اتفاقيات مستوى الخدمة) أو للأغراض غير التشغيلية (اتفاقيات مستوى الخدمة للأعمال). يوفر مطورو Spring مقاييس باستخدام Spring Boot Actuator و Micrometer. في المقابل ، يستخدم Quarkus مقاييس MicroProfile لتوفير المقاييس الأساسية (JVM ونظام التشغيل) ، ومقاييس البائعين (Quarkus) ، ومقاييس التطبيق. تتطلب MicroProfile Metrics التنفيذ لدعم تنسيقات إخراج JSON و OpenMetrics (بروميثيوس). أمثلة على استخدام MicroProfile Metrics API موضحة في الجدول 7.

В مشروع من مثالنا تُستخدم مقاييس MicroProfile لتوفير مقاييس التطبيق. يمكن العثور على مزيد من المعلومات في دليل Quarkus دليل متري.

الجدول 7. أمثلة على استخدام واجهات برمجة تطبيقات MicroProfile Metrics.

وظائف مقاييس MicroProfile
وصف
أمثلة

تضمين التغريدة

يشير إلى العداد الذي يحسب عدد الاستدعاءات للكائن المشروح

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

تضمين التغريدة

يشير إلى مقياس يقوم بحساب عدد المكالمات المتزامنة للكائن المشروح

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

@كَيّل

يشير إلى مقياس يقيس قيمة كائن تم التعليق عليه.

@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;
}

نقاط نهاية المقاييس

مقاييس التطبيق مؤسسة الكوثر: 8080 / مقاييس / تطبيق
المقاييس الأساسية مؤسسة الكوثر: 8080 / مقاييس / قاعدة
مقاييس البائعين مؤسسة الكوثر: 8080 / مقاييس / بائع
جميع المقاييس مؤسسة الكوثر: 8080 / متري

عميل استعادة MicroProfile

غالبًا ما توفر الخدمات المصغرة نقاط نهاية RESTful تتطلب واجهات برمجة تطبيقات العميل المناسبة للعمل معها. لاستخدام نقاط نهاية RESTful ، يستخدم مطورو Spring عادةً RestTemplate. يقدم Quarkus واجهات برمجة تطبيقات MicroProfile Rest Client لهذه المهمة ، وترد أمثلة على ذلك في الجدول 8.

В مشروع من مثالنا يتم استخدام نقاط النهاية RESTful مع عميل MicroProfile Rest. لمزيد من المعلومات والأمثلة حول هذا الموضوع ، راجع دليل Quarkus بقية دليل العميل.

الجدول 8. أمثلة على استخدام واجهة برمجة تطبيقات عميل MicroProfile Rest.

ميزات عميل استعادة MicroProfile
وصف
أمثلة

تضمين التغريدة

يسجل واجهة Java المكتوبة كعميل REST

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

تضمين التغريدة

وضع علامة على إدخال مثيل لواجهة عميل 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 ، نظرنا بإيجاز في كيفية استخدام واجهات برمجة التطبيقات Spring API في Quarkus جنبًا إلى جنب مع MicroProfile APIs لتطوير خدمات Java المصغرة ثم تجميعها في ثنائي أصلي يوفر مئات الميجابايت من ذاكرة الوصول العشوائي. ويبدأ بالمللي ثانية.

كما فهمت بالفعل ، يمكن العثور على معلومات إضافية حول دعم واجهات برمجة تطبيقات Spring و MicroProfile ، بالإضافة إلى الكثير من المعلومات المفيدة الأخرى ، في كتيبات Quarkus.

المصدر: www.habr.com

إضافة تعليق