مرحباً بالجميع ، وها هو المنشور الثالث من سلسلة Quarkus!
عند تطوير خدمات Java المصغرة ، غالبًا ما يُفترض ذلك
بمزيد من التفاصيل ، سننظر أولاً في نطاق وتفاصيل كيفية دعم Quarkus لواجهات برمجة تطبيقات Spring لتوضيح لمطوري Spring كيفية استخدام MicroProfile API في عملهم اليومي. ثم سنتحدث عن MicroProfile API ، والتي ستكون مفيدة لمطوري Spring عند إنشاء الخدمات المصغرة.
لماذا كواركوس؟ أولاً ، هذا هو الترميز المباشر ، أي إعادة التحميل التلقائي لأية تغييرات في MicroProfile API و Spring API و Java APIs الأخرى ، والتي يتم تنفيذها بأمر واحد فقط: mvn quarkus: dev. ثانيًا ، يعتبر في
لن نتعمق في تفاصيل MicroProfile ، لكننا سنحاول فقط مساعدة مطوري Spring على فهم كيف يمكن لـ Quarkus استخدام واجهات برمجة تطبيقات Spring جنبًا إلى جنب مع MicroProfile APIs.
حاويات و Kubernetes
حتى لا تفرط في تحميل هذه المقالة ، سنغطي فقط جوانب الدعم عالية المستوى هنا.
كواركوس أيضا
وأخيرًا ، بالتركيز على Kubernetes كبيئة نشر مستهدفة ، لا يستخدم Quarkus أطر عمل Java في الحالات التي يتم فيها تنفيذ وظائف مماثلة على مستوى منصة Kubernetes نفسها. يوفر الجدول 1 تعيينًا وظيفيًا بين Kubernetes وأطر عمل Java النموذجية التي يستخدمها مطورو Spring.
الجدول 1. الخريطة الوظيفية لأطر عمل Java و Kubernetes.
وظيفي
حذاء الربيع التقليدي
Kubernetes
اكتشاف الخدمة
يوريكا
DNS
الاعداد
تكوين سحابة الربيع
تكوين الخرائط / الأسرار
تحميل موازنة
الشريط (جانب العميل)
الخدمة ، وحدة التحكم في النسخ المتماثل (جانب الخادم)
تجميع وتشغيل الكود من المثال
في هذه المقالة نشير إلى
واجهات برمجة تطبيقات Spring Framework
حقن التبعية
يدعم Quarkus نطاقًا من
В
الجدول 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.
В
الجدول 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
التسامح مع الخطأ
تكوينات تحمل الأعطال مهمة جدًا لمنع حالات الفشل المتتالية وبناء بنيات قوية للخدمات الدقيقة. يستخدم مطورو الربيع قواطع دوائر للتسامح مع الأعطال لسنوات عديدة.
الجدول 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.
В
الجدول 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;
}
نقاط نهاية المقاييس
مقاييس التطبيق
المقاييس الأساسية
مقاييس البائعين
جميع المقاييس
عميل استعادة MicroProfile
غالبًا ما توفر الخدمات المصغرة نقاط نهاية RESTful تتطلب واجهات برمجة تطبيقات العميل المناسبة للعمل معها. لاستخدام نقاط نهاية RESTful ، يستخدم مطورو Spring عادةً RestTemplate. يقدم Quarkus واجهات برمجة تطبيقات MicroProfile Rest Client لهذه المهمة ، وترد أمثلة على ذلك في الجدول 8.
В
الجدول 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 ، بالإضافة إلى الكثير من المعلومات المفيدة الأخرى ، في
المصدر: www.habr.com