Quarkus qanday qilib MicroProfile va Springni birlashtiradi

Hammaga salom, Quarkus turkumidagi uchinchi post!

Quarkus qanday qilib MicroProfile va Springni birlashtiradi

Java mikroservislarini ishlab chiqishda ko'pincha bunga ishonishadi Eclipse MicroProfile и Bahorgi yuklash alohida va mustaqil API hisoblanadi. Odatiy bo'lib, dasturchilar allaqachon o'rganib qolgan API-lardan foydalanadilar, chunki yangi ramkalar va ish vaqti komponentlarini o'rganish ko'p vaqtni oladi. Bugun biz ba'zi mashhurlarning rivojlanishini soddalashtirishga harakat qilamiz Spring dasturchilari uchun MicroProfile API va bir vaqtning o'zida Spring API va yangi foydali xususiyatlardan qanday foydalanishni ko'rsataman Kvarkus.

Biroz batafsilroq, biz Spring dasturchilariga MicroProfile API-dan kundalik ishlarida qanday foydalanishni ko'rsatish uchun Quarkus Spring API-larni qanday qo'llab-quvvatlashini ko'rib chiqamiz. Keyin biz mikroservislarni yaratishda Spring dasturchilari uchun foydali bo'lgan MicroProfile API-larini ko'rib chiqamiz.

Nega Quarkus? Birinchidan, bu jonli kodlash, ya'ni MicroProfile API, Spring API va boshqa Java API-lardagi har qanday o'zgarishlarni avtomatik ravishda qayta yuklash, bu faqat bitta buyruq bilan amalga oshiriladi: mvn quarkus:dev. Ikkinchidan, muhokama qilingan bizning misolimizda Person xizmati (Spring, MicroProfile va JPA API'laridan mahalliy GraalVM tasviridan foydalangan holda binarga kompilyatsiya qilinadi) atigi 0.055 soniyada boshlanadi va RESTful ilovasining so'nggi nuqtasida taxminan 90 MB RAMni (RSS) egallaydi. Bundan tashqari, uning kompilyatsiyasi faqat bitta buyruq bilan amalga oshiriladi: mvn package -Pnative.

Biz MicroProfile haqida batafsil ma'lumot bermaymiz, faqat Spring dasturchilariga Quarkusdagi MicroProfile API bilan Spring API'laridan qanday foydalanishlari mumkinligini tushunishga yordam berishdan tashqari.

Konteynerlar va Kubernetlar

Ushbu maqolani sodda saqlash uchun biz bu yerda faqat yuqori darajadagi qo‘llab-quvvatlash jihatlarini yoritamiz. Kubernetes, chunki tushunish muhim. Quarkus Kubernetes uchun Java stek sifatida joylashtirilgan, u xotira sarfini va Java ilovalari va xizmatlarini ishga tushirish vaqtini minimallashtirish va natijada ularning xostdagi zichligini oshirish va umumiy xarajatlarni kamaytirish uchun moʻljallangan.

Kvarkus ham avtomatik ishlab chiqarishni qo'llab-quvvatlaydi Kubernetes resurslari va takliflari qo'llanmalar Kubernetes va Red Hat OpenShift platformalarida joylashtirish uchun. Bundan tashqari, Quarkus konteynerlarni yaratish uchun zarur bo'lgan Dockerfile.jvm (JVM packaging) va Dockerfile.native (native binar packaging) fayllarini avtomatik ravishda yaratadi.

Va nihoyat, Kubernetes-ga maqsadli joylashtirish muhiti sifatida e'tibor qaratib, Quarkus shunga o'xshash funksiya Kubernetes platformasining o'zi darajasida amalga oshirilgan hollarda Java ramkalaridan foydalanmaydi. 1-jadvalda Kubernetes va Spring dasturchilari tomonidan ishlatiladigan odatiy Java ramkalar o'rtasidagi funktsional yozishmalar xaritasi keltirilgan.

Jadval 1. Java ramkalari va Kubernetes o'rtasidagi funktsional yozishmalar xaritasi.

Funktsionallik
An'anaviy bahor etik
Kubernetes

Xizmat kashfiyoti
Eureka
DNS

konfiguratsiya
Spring Cloud konfiguratsiyasi
Xaritalar/sirlarni sozlash

Yuklarni muvozanatlash
Lenta (mijoz tomoni)
Xizmat, replikatsiya tekshiruvi (server tomoni)

Misoldagi kodni kompilyatsiya qilish va ishga tushirish

Ushbu maqolada biz havola qilamiz misol loyihasi, bu erda Spring va MicroProfile API'lari va hatto bir xil Java klassi birgalikda ishlatiladi. Ushbu misoldagi kod kompilyatsiya qilinishi va buyruq satridan ishga tushirilishi mumkin, batafsil ma'lumot uchun README.md fayliga qarang.

Spring Framework API

Qarama-qarshi in'ektsiya

Quarkus bir qator qo'llab-quvvatlaydi Kontekstlar va bog'liqlik kiritish (CDI) API'lari va Spring Dependency Injection (Spring DI) API. Agar siz MicroProfile bilan ishlayotgan bo'lsangiz, Java EE va Jakarta EE, keyin siz allaqachon CDI bilan juda tanishsiz. Boshqa tomondan, Spring ishlab chiquvchilari Spring DI bilan muvofiqlikka erishish uchun Spring DI API uchun Quarkus kengaytmasidan foydalanishlari mumkin. Qo'llab-quvvatlanadigan Spring DI API-laridan foydalanish misollari 2-jadvalda keltirilgan.

В bizning misolimizdan loyiha Ham CDI, ham Spring Dependency Injection dan foydalanadi. Ushbu mavzu bo'yicha qo'shimcha ma'lumot va misollar uchun Quarkus qo'llanmasiga qarang Bahor DI qo'llanma.

Jadval 2. Qo'llab-quvvatlanadigan Spring DI API-laridan foydalanishga misollar.

Qo'llab-quvvatlanadigan Spring DI xususiyatlari
misollar

Konstruktor in'ektsiyasi

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

Dala in'ektsiyasi
Avtomatik simli
qiymati

@Autowired
@RestClient
SalutationRestClient salutationRestClient;

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

loviya
@Konfiguratsiya

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

xizmat

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

   public String getPrefix() {
      return message;
   }
}

Veb-ramka

MicroProfile foydalanuvchilari Quarkus JAX-RS, MicroProfile Rest Client, JSON-P va JSON-B-ni asosiy veb-dasturlash modeli sifatida qo'llab-quvvatlashini yaxshi ko'radilar. Bahor ishlab chiquvchilari Quarkusning Spring Web API-ni, xususan, REST interfeyslarini qo'llab-quvvatlashidan mamnun bo'lishadi. Spring DI-ga o'xshab, Spring Web API-ni qo'llab-quvvatlashning asosiy maqsadi Spring ishlab chiquvchilariga Spring Web API-larini MicroProfile API-lari bilan birgalikda ishlatish imkonini berishdir. Qo'llab-quvvatlanadigan Spring Web API-dan qanday foydalanishga misollar 3-jadvalda keltirilgan va ushbu mavzu bo'yicha qo'shimcha ma'lumot va misollarni Quarkus qo'llanmasida topishingiz mumkin. Bahor veb-qo'llanma.

Jadval 3. Qo'llab-quvvatlanadigan Spring Web API-dan foydalanishga misollar.

Qo'llab-quvvatlanadigan Spring veb xususiyatlari
misollar

@RestController
@RequestMapping

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

@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
@RequestParam
@RequestHeader
@MatrixVariable
@PathVariable
@CookieValue
@RequestBody
@ResponseStatus
@ExceptionHandler
@RestControllerAdvice (qisman)

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

Spring DataJPA

MicroProfile foydalanuvchilari Quarkusning Hibernate ORM-dan foydalangan holda JPA-ni qo'llab-quvvatlashini ham qadrlashadi. Bahor ishlab chiquvchilari uchun yaxshi yangilik ham bor: Quarkus umumiy Spring Data JPA izohlari va turlarini qo'llab-quvvatlaydi. Qo'llab-quvvatlanadigan Spring Data JPA API-laridan foydalanish misollari 4-jadvalda keltirilgan.
В bizning misolimizdan loyiha Spring Data JPA API-laridan foydalaniladi va qo'shimcha ma'lumotni Quarkus qo'llanmasida topish mumkin Bahor ma'lumotlari JPA qo'llanmasi.

Jadval 4. Qo'llab-quvvatlanadigan Spring Data JPA API-laridan foydalanishga misollar.

Qo'llab-quvvatlanadigan Spring Data JPA xususiyatlari
misollar

CrudRepository

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

Axborotlar
JpaRepository
PagingAndSortingRepository

public class PersonRepository extends 

    Repository {

    Person save(Person entity);

    Optional findById(Person entity);
}

Repozitariy fragmentlari

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

Olingan so'rov usullari

public interface PersonRepository extends CrudRepository {

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

    Boolean existsBookByYearOfBirthBetween(
            Integer start, Integer end);
}

Foydalanuvchi tomonidan belgilangan so'rovlar

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 API

Xatolarga chidamlilik

Xatolarga chidamlilik konstruksiyalari kaskadli nosozliklarning oldini olish va ishonchli mikroservis arxitekturasini yaratish uchun juda muhimdir. Bahor ishlab chiquvchilari ko'p yillar davomida nosozliklarga chidamlilik uchun o'chirgichlardan foydalanishgan. Hystrix. Biroq, Hystrix uzoq vaqt davomida yangilanmagan, ammo MicroProfile-ning xatoga chidamliligi hozirda faol rivojlanmoqda va uning ortida bir necha yillik ishlab chiqarishdan foydalanish mavjud. Shu sababli, Quarkusdagi xizmatlarning ishonchliligini oshirish uchun MicroProfile Fault Tolerance API-dan foydalanish tavsiya etiladi, ularning misollari 5-jadvalda keltirilgan. Bu haqda qo'shimcha ma'lumot olish uchun Quarkus qo'llanmasiga qarang. Xatolarga chidamlilik bo'yicha qo'llanma.

Jadval 5. Qo'llab-quvvatlanadigan MicroProfile Fault Tolerance API'laridan foydalanishga misollar.

MicroProfile xatolarga chidamlilik xususiyatlari
tavsifi
misollar

@Asinxron

Mantiqni alohida mavzuda bajarish

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

@Bulkhead

Bir vaqtning o'zida so'rovlar sonini cheklang

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

@CircuitBreaker

Muvaffaqiyatsizliklarni aqlli boshqarish va nosozliklarni tiklash

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

@Ortga qaytish

Muvaffaqiyatsiz bo'lgan taqdirda muqobil mantiqni chaqirish

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

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

qayta harakat qilib ko'ring

Soʻrov bajarilmasa, qayta urinib koʻring

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

Vaqt tugashi

Muvaffaqiyatsizlikni nazorat qilish vaqti tugashi

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

Xizmatlarni tekshirish (Salomatlik xizmati)

Kubernetes platformalari maxsus xizmatlardan foydalangan holda konteynerlarning sog'lig'ini kuzatib boradi. Asosiy platformaga xizmatlarni kuzatishga ruxsat berish uchun Spring dasturchilari odatda maxsus HealthIndicator va Spring Boot Actuator-dan foydalanadilar. Quarkusda buni MicroProfile Health yordamida amalga oshirish mumkin, u sukut bo'yicha jonlilikni tekshirishni amalga oshiradi, lekin bir vaqtning o'zida jonlilik va tayyorlikni tekshirish uchun sozlanishi mumkin. Qo'llab-quvvatlanadigan MicroProfile Health API'laridan qanday foydalanishga misollar 6-jadvalda keltirilgan va qo'shimcha ma'lumotlar Quarkus qo'llanmasida keltirilgan. Sog'liqni saqlash bo'yicha qo'llanma.

6-jadval: Qo'llab-quvvatlanadigan MicroProfile Health API'laridan foydalanish misollari.

MicroProfile Health xususiyatlari
tavsifi
misollar

@Tiriklik

Platforma muvaffaqiyatsiz konteynerlangan ilovalarni qayta ishga tushiradi
Yakuniy nuqta:
xost: 8080/salomatlik/jonli

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

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

@Tayyorlik

Platforma tayyor bo'lmasa, konteynerlashtirilgan ilovalarga trafik jo'natmaydi
Yakuniy nuqta:
xost: 8080/salomatlik/tayyor

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

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

Ko'rsatkichlar

Ilovalar operatsion maqsadlarda (samaradorlik SLAlarini kuzatish uchun) yoki operatsion bo'lmagan maqsadlarda (biznes SLAs) ko'rsatkichlarni taqdim etadi. Bahor ishlab chiquvchilari Spring Boot Actuator va Micrometer yordamida o'lchovlarni taqdim etadilar. O'z navbatida, Quarkus asosiy ko'rsatkichlarni (JVM va operatsion tizim), sotuvchi ko'rsatkichlarini (Quarkus) va dastur ko'rsatkichlarini taqdim etish uchun MicroProfile Metricsdan foydalanadi. MicroProfile Metrics dastur JSON va OpenMetrics (Prometey) chiqish formatlarini qo'llab-quvvatlashini talab qiladi. MicroProfile Metrics API dan foydalanishga misollar 7-jadvalda keltirilgan.

В bizning misolimizdan loyiha MicroProfile ko'rsatkichlari dastur ko'rsatkichlarini ta'minlash uchun ishlatiladi. Qo'shimcha ma'lumot uchun Quarkus qo'llanmasiga qarang Ko'rsatkichlar bo'yicha qo'llanma.

Jadval 7. MicroProfile Metrics API-laridan foydalanishga misollar.

Microprofile ko'rsatkichlari xususiyatlari
tavsifi
misollar

@hisoblangan

Izohlangan ob'ektning necha marta chaqirilganligini hisoblovchi hisoblagichni bildiradi

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

@ConcurrentGauge

Izohlangan ob'ektga bir vaqtda qo'ng'iroqlar sonini hisoblaydigan o'lchagichni bildiradi

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

@Gauge

Izohlangan ob'ektning qiymatini o'lchaydigan o'lchov sensorini bildiradi

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

@Metered

Izohlangan ob'ektning qo'ng'iroq chastotasini kuzatuvchi hisoblagich sensorini bildiradi

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

Metrik

Ko'rsatkichni kiritish yoki ishlab chiqarish uchun so'rov olinganida metama'lumotlar haqida ma'lumotni o'z ichiga olgan izoh

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

Vaqt o‘tdi

Izohlangan ob'ektning davomiyligini kuzatuvchi taymerni bildiradi

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

Ko'rsatkichlar so'nggi nuqtalari

Ilova ko'rsatkichlari localhost:8080/metrikalar/ilova
Asosiy ko'rsatkichlar localhost:8080/metrik/baza
Sotuvchi ko'rsatkichlari localhost:8080/metrikalar/sotuvchi
Barcha ko'rsatkichlar localhost:8080/metrik

MicroProfile Rest Client

Mikroservislar ko'pincha RESTful so'nggi nuqtalarini taqdim etadi, ular bilan ishlash uchun mos keladigan mijoz API-larini talab qiladi. RESTful so'nggi nuqtalaridan foydalanish uchun Spring dasturchilari odatda RestTemplate-dan foydalanadilar. Quarkus ushbu muammoni hal qilish uchun MicroProfile Rest Client API-larini taklif qiladi, ulardan foydalanish misollari 8-jadvalda keltirilgan.

В bizning misolimizdan loyiha RESTful so'nggi nuqtalaridan foydalanish MicroProfile Rest Client yordamida amalga oshiriladi. Ushbu mavzu bo'yicha qo'shimcha ma'lumot va misollarni Quarkus qo'llanmasida topishingiz mumkin Dam olish uchun mijozlar uchun qo'llanma.

Jadval 8. MicroProfile Rest Client API-laridan foydalanishga misollar.

MicroProfile Rest Client xususiyatlari
tavsifi
misollar

@RegisterRestClient

Terilgan Java interfeysini REST mijozi sifatida ro'yxatdan o'tkazadi

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

@RestClient

Terilgan REST mijoz interfeysi namunasini amalga oshirishni belgilaydi

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

Chaqiruv

REST oxirgi nuqtasini chaqiradi

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

mp-dam olish/url

REST oxirgi nuqtasini belgilaydi

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

natijalar

Asosan Spring dasturchilariga qaratilgan ushbu blogda biz Java mikroservislarini ishlab chiqish va keyin ularni yuzlab megabayt operativ xotirani tejaydigan mahalliy ikkilik kodga kompilyatsiya qilish uchun Quarkusdagi MicroProfile API-lari bilan Spring API-laridan qanday foydalanishni tez ko'rib chiqdik. millisekundlar masalasi.

Siz allaqachon tushunganingizdek, Spring va MicroProfile API-larini qo'llab-quvvatlash haqida ko'proq ma'lumotni, shuningdek, boshqa ko'plab foydali ma'lumotlarni quyidagi havolada topishingiz mumkin. Quarkus qo'llanmalar.

Manba: www.habr.com

a Izoh qo'shish