Quarkus MicroProfile və Spring-i necə birləşdirir

Hər kəsə salam, Quarkus seriyasındakı üçüncü yazı!

Quarkus MicroProfile və Spring-i necə birləşdirir

Java mikroservislərini inkişaf etdirərkən çox vaxt buna inanırlar Eclipse MicroProfile и Yaz çəkmə ayrı və müstəqil API-lərdir. Varsayılan olaraq, proqramçılar artıq öyrəşdikləri API-lərdən istifadə etməyə meyllidirlər, çünki yeni çərçivələri və iş vaxtı komponentlərini öyrənmək çox vaxt aparır. Bu gün bəzi məşhurların inkişafını asanlaşdırmağa çalışacağıq Bahar tərtibatçıları üçün MicroProfile API və eyni zamanda Spring API və yeni faydalı funksiyalardan necə istifadə edəcəyinizi göstərin quarkus.

Bir az daha təfərrüatlı olaraq, Spring tərtibatçılarına gündəlik işlərində MicroProfile API-dən necə istifadə etmələrini göstərmək üçün Quarkus-un Spring API-lərini necə dəstəklədiyinin əhatə dairəsi və təfərrüatlarına baxacağıq. Sonra mikroservislər yaratarkən Spring tərtibatçıları üçün faydalı olan MicroProfile API-lərini əhatə edəcəyik.

Niyə Quarkus? Birincisi, bu, canlı kodlaşdırmadır, yəni MicroProfile API, Spring API və digər Java API-lərində hər hansı bir dəyişikliyin avtomatik yenidən yüklənməsi, yalnız bir əmrlə yerinə yetirilir: mvn quarkus:dev. İkincisi, nəzərə alınır bizim nümunəmizdə Person xidməti (Spring, MicroProfile və JPA API-lərindən yerli GraalVM təsvirindən istifadə edərək binar formada tərtib edən) cəmi 0.055 saniyəyə başlayır və RESTful tətbiqinin son nöqtəsində təxminən 90 MB RAM (RSS) tutur. Üstəlik, onun tərtibi yalnız bir əmrlə həyata keçirilir: mvn paketi -Pnative.

Bahar tərtibatçılarına Quarkusda MicroProfile API ilə Spring API-lərindən necə istifadə edə biləcəklərini başa düşməkdən başqa, MicroProfile haqqında təfərrüata girməyəcəyik.

Konteynerlər və Kubernetlər

Bu məqaləni sadə saxlamaq üçün biz burada yalnız dəstəyin yüksək səviyyəli aspektlərini əhatə edəcəyik. Kubernetes, çünki başa düşmək vacibdir. Quarkus Kubernetes üçün Java yığını kimi yerləşdirilib, yaddaş istehlakını və Java proqram və xidmətlərinin işə salınma vaxtını minimuma endirmək və nəticədə onların hostda sıxlığını artırmaq və ümumi xərcləri azaltmaq üçün nəzərdə tutulub.

Quarkus da avtomatik generasiyanı dəstəkləyir Kubernetes resursları və təklifləri bələdçilər Kubernetes və Red Hat OpenShift platformalarında yerləşdirmə üçün. Bundan əlavə, Quarkus avtomatik olaraq konteynerlər yaratmaq üçün lazım olan Dockerfile.jvm (JVM qablaşdırma) və Dockerfile.native (doğma ikili qablaşdırma) fayllarını yaradır.

Nəhayət, hədəf yerləşdirmə mühiti kimi Kubernetes-ə diqqət yetirməklə, Quarkus oxşar funksionallığın Kubernetes platformasının özü səviyyəsində həyata keçirildiyi hallarda Java çərçivələrindən istifadə etmir. Cədvəl 1, Kubernetes və Spring tərtibatçıları tərəfindən istifadə edilən tipik Java çərçivələri arasında funksional yazışmaların xəritəsini təqdim edir.

Cədvəl 1. Java çərçivələri və Kubernetes arasında funksional yazışmaların xəritəsi.

Funksional
Ənənəvi Yaz Çəkməsi
Kubernetes

Xidmət kəşfi
Evrika
DNS

Konfiqurasiya
Bahar Bulud Konfiqurasiyası
Xəritələri/Sirləri konfiqurasiya edin

Yük tarazlığı
Lent (müştəri tərəfi)
Xidmət, Replikasiya Nəzarətçisi (server tərəfi)

Nümunədən kodun tərtib edilməsi və işə salınması

Bu yazıda istinad edirik nümunə layihə, burada Spring və MicroProfile API-ləri və hətta eyni Java sinfi birlikdə istifadə olunur. Bu misaldakı kod tərtib edilə və komanda xəttindən işlədilə bilər, təfərrüatlar üçün README.md faylına baxın.

Spring Framework API-ləri

Asılılıq Enjeksiyonu

Quarkus bir sıra dəstəkləyir Kontekstlər və Dependency Injection (CDI) API-ləri və Spring Dependency Injection (Spring DI) API-ləri. MicroProfile ilə işləyirsinizsə, Java EE və Cakarta EE, onda siz artıq CDI ilə çox tanışsınız. Digər tərəfdən, Spring tərtibatçıları Spring DI ilə uyğunluğa nail olmaq üçün Spring DI API üçün Quarkus Extension-dan istifadə edə bilərlər. Dəstəklənən Spring DI API-lərindən istifadə nümunələri Cədvəl 2-də verilmişdir.

В bizim nümunəmizdən layihə Həm CDI, həm də Spring Dependency Injection istifadə edir. Bu mövzuda əlavə məlumat və nümunələr üçün Quarkus adlı bələdçiyə baxın Bahar DI Bələdçisi.

Cədvəl 2. Dəstəklənən Spring DI API-lərindən istifadə nümunələri.

Dəstəklənən Spring DI Xüsusiyyətləri
Nümunələr

Konstruktor inyeksiyası

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

Sahə inyeksiyası
Avtomatik simli
Dəyər

@Autowired
@RestClient
SalutationRestClient salutationRestClient;

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

Lobya
@ Konfiqurasiya

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

Komponent

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

xidmət

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

   public String getPrefix() {
      return message;
   }
}

Veb çərçivə

MicroProfile istifadəçiləri Quarkus-un JAX-RS, MicroProfile Rest Client, JSON-P və JSON-B-ni əsas veb proqramlaşdırma modeli kimi dəstəkləməsini sevəcəklər. Bahar tərtibatçıları Quarkusun Spring Web API, xüsusən REST interfeysləri üçün son dəstəyindən məmnun qalacaqlar. Spring DI kimi, Spring Web API dəstəyinin əsas məqsədi Spring tərtibatçılarına MicroProfile API-ləri ilə birlikdə Spring Web API-lərindən istifadə etmək imkanı verməkdir. Dəstəklənən Spring Web API-lərinin necə istifadə ediləcəyinə dair nümunələr Cədvəl 3-də verilmişdir və bu mövzuda daha çox məlumat və nümunələr Quarkus adlı təlimatda tapıla bilər. Bahar veb bələdçisi.

Cədvəl 3. Dəstəklənən Spring Web API-lərindən istifadə nümunələri.

Dəstəklənən Bahar Veb Xüsusiyyətləri
Nümunələr

@RestController
@RequestMapping

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

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

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

Spring DataJPA

MicroProfile istifadəçiləri Quarkusun Hibernate ORM-dən istifadə edərək JPA-nı dəstəklədiyini də qiymətləndirəcəklər. Bahar tərtibatçıları üçün də yaxşı xəbər var: Quarkus ümumi Spring Data JPA annotasiyalarını və növlərini dəstəkləyir. Dəstəklənən Spring Data JPA API-lərindən istifadə nümunələri Cədvəl 4-də verilmişdir.
В bizim nümunəmizdən layihə Spring Data JPA API istifadə olunur və daha çox məlumat Quarkus adlı təlimatda mövcuddur Spring Data JPA Bələdçisi.

Cədvəl 4. Dəstəklənən Spring Data JPA API-lərindən istifadə nümunələri.

Dəstəklənən Spring Data JPA Xüsusiyyətləri
Nümunələr

CrudRepository

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

Depo
JpaRepository
PagingVəSortingRepository

public class PersonRepository extends 

    Repository {

    Person save(Person entity);

    Optional findById(Person entity);
}

Repozitor fraqmentləri

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

Alınan sorğu üsulları

public interface PersonRepository extends CrudRepository {

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

    Boolean existsBookByYearOfBirthBetween(
            Integer start, Integer end);
}

İstifadəçi tərəfindən müəyyən edilmiş sorğular

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-ləri

Səhv tolerantlığı

Arızaya dözümlülük konstruksiyaları kaskad uğursuzluqların qarşısının alınması və etibarlı mikroservis arxitekturalarının yaradılması üçün çox vacibdir. Bahar tərtibatçıları uzun illərdir ki, nasazlığa dözümlülük üçün elektrik açarlarından istifadə edirlər. Histrix. Bununla belə, Hystrix uzun müddətdir ki, yenilənməyib, lakin MicroProfile-nin Hata Dözümlülüyü indi aktiv şəkildə inkişaf edir və bunun arxasında bir neçə il istehsal istifadəsi var. Buna görə də, Quarkusda xidmətlərin etibarlılığını artırmaq üçün nümunələri Cədvəl 5-də istifadə olunan MicroProfile Fault Tolerance API-lərindən istifadə etmək tövsiyə olunur. Bu barədə ətraflı məlumat üçün Quarkus təlimatına baxın. Səhvlərə Dözümlülük Bələdçisi.

Cədvəl 5. Dəstəklənən MicroProfile Fault Tolerance API-lərindən istifadə nümunələri.

MicroProfile Hata Dözümlülük Xüsusiyyətləri
Təsvir
Nümunələr

@Asinxron

Ayrı bir mövzuda məntiqin icrası

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

@Bulkhead

Eyni vaxtda sorğuların sayını məhdudlaşdırın

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

@CircuitBreaker

Ağıllı uğursuzluqların idarə edilməsi və uğursuzluqların bərpası

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

@Geri çəkilmək

Uğursuzluq halında alternativ məntiq çağırmaq

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

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

Yenidən cəhd edin

Sorğu uğursuz olduqda yenidən cəhd edin

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

Vaxt

Uğursuzluğa nəzarət müddəti

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

Yoxlama xidmətləri (Xidmət Sağlamlığı)

Kubernetes platformaları xüsusi xidmətlərdən istifadə edərək konteynerlərin sağlamlığına nəzarət edir. Əsas platformanın xidmətləri izləməsinə icazə vermək üçün Bahar tərtibatçıları adətən xüsusi HealthIndicator və Spring Boot Actuator istifadə edirlər. Quarkusda bu, standart olaraq canlılıq yoxlanışı həyata keçirən, lakin canlılığı və hazırlığı eyni vaxtda yoxlamaq üçün konfiqurasiya edilə bilən MicroProfile Health-dən istifadə etməklə edilə bilər. Dəstəklənən MicroProfile Sağlamlıq API-lərinin necə istifadə ediləcəyinə dair nümunələr Cədvəl 6-da verilmişdir və əlavə məlumat Quarkus təlimatında verilmişdir. Sağlamlıq Bələdçisi.

Cədvəl 6: Dəstəklənən MicroProfile Sağlamlıq API-lərinin istifadə nümunələri.

MicroProfile Sağlamlıq xüsusiyyətləri
Təsvir
Nümunələr

@canlılıq

Platforma uğursuz konteyner tətbiqlərini yenidən yükləyir
Son nöqtə:
host:8080/sağlamlıq/canlı

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

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

@Hazırlıq

Platforma hazır deyilsə, konteynerləşdirilmiş tətbiqlərə trafik göndərməyəcək
Son nöqtə:
host:8080/sağlamlıq/hazır

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

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

Metriklər

Tətbiqlər ya əməliyyat məqsədləri (performans SLA-larına nəzarət etmək üçün) və ya qeyri-əməliyyat məqsədləri (biznes SLAs) üçün ölçüləri təmin edir. Bahar tərtibatçıları Spring Boot Aktuator və Mikrometrdən istifadə edərək ölçüləri təmin edirlər. Öz növbəsində, Quarkus əsas göstəriciləri (JVM və əməliyyat sistemi), satıcı ölçülərini (Quarkus) və tətbiq ölçülərini təmin etmək üçün MicroProfile Metriklərindən istifadə edir. MicroProfile Metrics tətbiqin JSON və OpenMetrics (Prometheus) çıxış formatlarını dəstəkləməsini tələb edir. MicroProfile Metrics API-dən istifadə nümunələri Cədvəl 7-də verilmişdir.

В bizim nümunəmizdən layihə MicroProfile Metrikləri tətbiq ölçülərini təmin etmək üçün istifadə olunur. Əlavə məlumat üçün Quarkus təlimatına baxın Metrik Bələdçi.

Cədvəl 7. MicroProfile Metrics API-lərindən istifadə nümunələri.

MicroProfile Metrik Xüsusiyyətləri
Təsvir
Nümunələr

@Sayılır

Annotasiya edilmiş obyektin neçə dəfə çağırıldığını hesablayan sayğac sayğacını bildirir

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

@ConcurrentGauge

Annotasiya edilmiş obyektə eyni vaxtda edilən zənglərin sayını hesablayan ölçünü bildirir

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

@Gauge

Annotasiya edilmiş obyektin dəyərini ölçən ölçü sensorunu bildirir

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

@Metered

Annotasiya edilmiş obyektin zəng tezliyinə nəzarət edən sayğac sensorunu bildirir

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

metrik

Metrik daxil etmək və ya yaratmaq üçün sorğu qəbul edildikdə metadata haqqında məlumatı ehtiva edən annotasiya

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

Müddətli

Annotasiya edilmiş obyektin müddətini izləyən taymeri göstərir

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

Metrik son nöqtələri

Tətbiq ölçüləri localhost:8080/metriklər/tətbiq
Əsas ölçülər localhost:8080/metrik/baza
Satıcı ölçüləri localhost:8080/metrics/vendor
Bütün ölçülər localhost:8080/metrik

MicroProfile İstirahət Müştərisi

Mikroservislər tez-tez işləmək üçün müvafiq müştəri API-lərini tələb edən RESTful son nöqtələri təmin edir. RESTful son nöqtələrindən istifadə etmək üçün Spring tərtibatçıları adətən RestTemplate istifadə edirlər. Quarkus bu problemi həll etmək üçün MicroProfile Rest Client API təklif edir, onlardan istifadə nümunələri Cədvəl 8-də verilmişdir.

В bizim nümunəmizdən layihə RESTful son nöqtələrinin istifadəsi MicroProfile Rest Client-dən istifadə etməklə həyata keçirilir. Bu mövzu ilə bağlı daha çox məlumat və nümunələr Quarkus təlimatında tapıla bilər İstirahət Müştəri Bələdçisi.

Cədvəl 8. MicroProfile Rest Client API-lərindən istifadə nümunələri.

MicroProfile İstirahət Müştəri Xüsusiyyətləri
Təsvir
Nümunələr

@RegisterRestClient

Yazılmış Java interfeysini REST müştərisi kimi qeyd edir

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

@RestClient

Yazılan REST müştəri interfeysinin nümunəsinin həyata keçirilməsini qeyd edir

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

Dəvət

REST son nöqtəsini çağırır

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

mp-istirahət/url

REST son nöqtəsini təyin edir

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

Nəticələri

Əsasən Bahar tərtibatçılarına yönəlmiş bu bloqda biz Java mikroservislərini inkişaf etdirmək və sonra onları yüzlərlə meqabayt operativ yaddaşa qənaət edən yerli ikili koda yığmaq üçün Quarkusda MicroProfile API ilə Spring API-lərindən necə istifadə olunacağına qısa nəzər saldıq. millisaniyə məsələsi.

Artıq başa düşdüyünüz kimi, Spring və MicroProfile API-lərinə dəstək haqqında daha çox məlumatı, eləcə də bir çox digər faydalı məlumatları burada tapa bilərsiniz. Quarkus təlimatlar.

Mənbə: www.habr.com

Добавить комментарий