كيف يدمج Quarkus MicroProfile و Spring

مرحباً بالجميع ، ومعكم المنشور الثالث من سلسلة Quarkus! (بالمناسبة ، قم بالتسجيل وانتقل إلى ندوة الويب الخاصة بنا " هذا هو إطار عمل جافا الأصلي Quarkus - Kubernetes " ، والذي سيعقد في 27 مايو . سنوضح كيفية البدء من الصفر أو نقل الحلول الجاهزة)



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

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

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

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

حاويات و Kubernetes


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

كما تدعم Quarkus أيضًا إنشاء 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 وحتى نفس فئة Java. يمكن تجميع التعليمات البرمجية من هذا المثال وتشغيلها من سطر الأوامر ، راجع ملف README.md لمزيد من التفاصيل.

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


حقن التبعية


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

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

الجدول 2. أمثلة على استخدام API API Spring DI المدعومة.
ميزات الربيع DI المدعومة
Constructor Injection
public PersonSpringController(
   PersonSpringRepository personRepository,  // injected      
   PersonSpringMPService personService) {    // injected
      this.personRepository = personRepository;
      this.personService = personService;
}
Field Injection
Autowired
Value
@Autowired
@RestClient
SalutationRestClient salutationRestClient;

@Value("${fallbackSalutation}")
String fallbackSalutation;
Bean
@Configuration
@Configuration
public class AppConfiguration {
   @Bean(name = "capitalizeFunction")
   public StringFunction capitalizer() {
      return String::toUpperCase;
   }
}
Component
@Component("noopFunction")
public class NoOpSingleStringFunction implements StringFunction {
   @Override
   public String apply(String s) {
      return s;
   }
}
Service
@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 API المدعومة في الجدول 3 ، ويمكن العثور على مزيد من المعلومات والأمثلة حول هذا الموضوع في دليل Quarkus ، المسمى Spring Web Guide .

الجدول 3. أمثلة على استخدام Spring Web APIs المدعومة.
ميزات الربيع المدعومةأمثلة
@RestController
@RequestMapping
@RestController
@RequestMapping("/person")
public class PersonSpringController {
   ...
   ...
   ...
}
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
@RequestParam
@RequestHeader
@MatrixVariable
@PathVariable
@CookieValue
@RequestBody
@ResponseStatus
@ExceptionHandler
@RestControllerAdvice (partial)
@GetMapping(path = "/greet/{id}",
   produces = "text/plain")
   public String greetPerson(
   @PathVariable(name = "id") long id) {
   ...
   ...
   ...
}

Spring Data JPA


سيحب مستخدمو MicroProfile أيضًا Quarkus لدعم JPA باستخدام Hibernate ORM. هناك أنباء جيدة لمطوري Spring أيضًا: يدعم Quarkus أنواع التعليقات التوضيحية الشائعة و Spring Data JPA. أمثلة على استخدام واجهات برمجة تطبيقات Spring Data JPA المدعومة موضحة في الجدول 4.
في المشروع من مثالنا ، يتم استخدام واجهات برمجة تطبيقات Spring Data JPA ، وتتوفر معلومات إضافية في دليل Quarkus المسمى Spring Data JPA Guide .

الجدول 4. أمثلة على استخدام واجهات برمجة تطبيقات Spring Data JPA المدعومة.
ميزات JPA لبيانات الربيع المدعومةأمثلة
Crudrepository
public interface PersonRepository
         extends JpaRepository,
                 PersonFragment {
   ...
}
مستودع
JpaRepository
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);
}

API- MicroProfile


(Fault tolerance)


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

الجدول 5. أمثلة على استخدام واجهات برمجة تطبيقات MicroProfile Tolerance APIs المدعومة.
ميزات MicroProfile التسامح مع الخطأوصفأمثلة
@Asynchronous

@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

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

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

(Service Health)


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

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

Endpoint:
host:8080/health/live
@Liveness
public class MyHC implements HealthCheck {
  public HealthCheckResponse call() {

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

Endpoint:
host:8080/health/ready
@Readiness
public class MyHC implements HealthCheck {
  public HealthCheckResponse call() {

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


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

في المشروع من مثالنا ، يتم استخدام مقاييس MicroProfile لتوفير مقاييس التطبيق. لمزيد من المعلومات ، راجع دليل مقاييس Quarkus .

7. API- MicroProfile Metrics.
MicroProfile Metrics
@Counted
counter-,
@Counted(name = "fallbackCounter", 
  displayName = "Fallback Counter", 
  description = "Fallback Counter")
public String salutationFallback() {
   return fallbackSalutation;
}
@ConcurrentGauge
gauge-,
@ConcurrentGuage(
  name = "fallbackConcurrentGauge", 
  displayName="Fallback Concurrent", 
  description="Fallback Concurrent")
public String salutationFallback() {
   return fallbackSalutation;
}
@Gauge
gauge-,
@Metered(name = "FallbackGauge",
   displayName="Fallback Gauge",
   description="Fallback frequency")
public String salutationFallback() {
   return fallbackSalutation;
}
@Metered
meter-,
@Metered(name = "MeteredFallback",
   displayName="Metered Fallback",
   description="Fallback frequency")
public String salutationFallback() {
   return fallbackSalutation;
}
Metric
, ,
@Metric
@Metered(name = "MeteredFallback",
   displayName="Metered Fallback",
   description="Fallback frequency")
public String salutationFallback() {
   return fallbackSalutation;
}
Timed
,
@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


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

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

جدول 8. أمثلة على استخدام واجهات برمجة تطبيقات عميل MicroProfile Rest Client.
ميزات العميل MicroProfile الراحةوصفأمثلة
RegisterRestClient
يسجل واجهة Java المكتوبة كعميل 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());
النائب بقية / url
يحدد نقطة نهاية REST
application.properties:
org.example.MyRestClient/mp-rest/url=
   http://localhost:8081/myendpoint

ملخص


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

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

All Articles