Quarkus, MicroProfile ve Spring'i nasıl birleştiriyor?

Herkese merhaba, Quarkus serisinin üçüncü yazısı ile karşınızdayız!

Quarkus, MicroProfile ve Spring'i nasıl birleştiriyor?

Java mikro hizmetleri geliştirilirken genellikle şuna inanılır: Eclipse Mikro Profili и Bahar botu ayrı ve bağımsız API'lerdir. Yeni çerçeveleri ve çalışma zamanı bileşenlerini öğrenmek çok zaman aldığından, programcılar varsayılan olarak zaten alışık oldukları API'leri kullanma eğilimindedir. Bugün bazı popüler uygulamaların gelişimini basitleştirmeye çalışacağız. Spring geliştiricileri için MicroProfile API'si ve size Spring API'yi ve yeni kullanışlı özellikleri aynı anda nasıl kullanacağınızı göstereceğim kuarkus.

Biraz daha ayrıntılı olarak, Spring geliştiricilerine MicroProfile API'yi günlük çalışmalarında nasıl kullanacaklarını göstermek için öncelikle Quarkus'un Spring API'lerini nasıl desteklediğinin kapsamına ve ayrıntılarına bakacağız. Daha sonra, Spring geliştiricilerinin mikro hizmetler oluştururken yararlı olduğu MicroProfile API'lerini ele alacağız.

Neden Quarkus? Birincisi, bu canlı kodlamadır, yani MicroProfile API, Spring API ve diğer Java API'lerindeki herhangi bir değişikliğin otomatik olarak yeniden yüklenmesidir ve tek bir komutla gerçekleştirilir: mvn quarkus:dev. İkinci olarak, tartışılan bizim örneğimizde Person hizmeti (Spring, MicroProfile ve JPA API'lerinden yerel GraalVM görüntüsünü kullanarak bir ikili dosyada derlenen) yalnızca 0.055 saniyede başlar ve RESTful uygulama uç noktasında yaklaşık 90 MB RAM (RSS) kaplar. Üstelik derlemesi tek bir komutla gerçekleştirilir: mvn package -Pnative.

Spring geliştiricilerinin Quarkus'ta Spring API'lerini MicroProfile API'leri ile nasıl kullanabileceklerini anlamalarına yardımcı olmak dışında MicroProfile hakkında ayrıntılara girmeyeceğiz.

Konteynerler ve Kubernetes

Bu makaleyi basit tutmak için burada yalnızca desteğin üst düzey yönlerini ele alacağız. KubernetesÇünkü anlamak önemlidir. Quarkus, Kubernetes için bir Java yığını olarak konumlandırılmıştır; Java uygulamalarının ve hizmetlerinin bellek tüketimini ve başlatma süresini en aza indirmek ve bunun sonucunda ana bilgisayardaki yoğunluğunu artırmak ve genel maliyetleri azaltmak için tasarlanmıştır.

Kuarkus da otomatik oluşturmayı destekler Kubernetes kaynakları ve teklifleri kılavuzlar Kubernetes ve Red Hat OpenShift platformlarında dağıtım için. Ayrıca Quarkus, kapsayıcılar oluşturmak için gereken Dockerfile.jvm (JVM paketleme) ve Dockerfile.native (yerel ikili paketleme) dosyalarını otomatik olarak oluşturur.

Son olarak, hedef dağıtım ortamı olarak Kubernetes'e odaklanan Quarkus, benzer işlevlerin Kubernetes platformunun kendi düzeyinde uygulandığı durumlarda Java çerçevelerini kullanmaz. Tablo 1, Kubernetes ile Spring geliştiricileri tarafından kullanılan tipik Java çerçeveleri arasındaki işlevsel yazışmanın bir haritasını sunmaktadır.

Tablo 1. Java çerçeveleri ile Kubernetes arasındaki işlevsel yazışmaların haritası.

fonksiyonel
Geleneksel Bahar Çizme
Kubernetes

Hizmet keşfi
Buldum
DNS

yapılandırma
Bahar Bulutu Yapılandırması
Haritaları/Sırları Yapılandırma

Yük dengeleme
Şerit (istemci tarafı)
Hizmet, Çoğaltma Denetleyicisi (sunucu tarafı)

Örnekteki kodun derlenmesi ve çalıştırılması

Bu yazıda bahsettiğimiz örnek projeSpring ve MicroProfile API'lerinin ve hatta aynı Java sınıfının birlikte kullanıldığı yer. Bu örnekteki kod komut satırından derlenip çalıştırılabilir; ayrıntılar için README.md dosyasına bakın.

Spring Framework API'leri

Bağımlılık Enjeksiyonu

Quarkus bir dizi desteği destekler Bağlamlar ve Bağımlılık Ekleme (CDI) API'leri ve Spring Dependency Injection (Spring DI) API'leri. MicroProfile ile çalışıyorsanız, Java EE ve Cakarta EE, o zaman CDI'ya zaten çok aşinasınız. Öte yandan Spring geliştiricileri, Spring DI ile uyumluluk sağlamak için Spring DI API'si için Quarkus Uzantısını kullanabilir. Desteklenen Spring DI API'lerinin kullanımına ilişkin örnekler Tablo 2'de verilmiştir.

В örneğimizden proje Hem CDI hem de Spring Dependency Injection'ı kullanır. Bu konuyla ilgili daha fazla bilgi ve örnekleri Quarkus adlı rehberde bulabilirsiniz. Bahar DI Kılavuzu.

Tablo 2. Desteklenen Spring DI API'lerini kullanma örnekleri.

Desteklenen Spring DI Özellikleri
Örnekler

Yapıcı Enjeksiyon

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

Saha Enjeksiyonu
otomatik kablolu
Özellik

@Autowired
@RestClient
SalutationRestClient salutationRestClient;

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

Fasulye
@Yapılandırma

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

Bileşen

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

Hizmet

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

   public String getPrefix() {
      return message;
   }
}

Web çerçevesi

MicroProfile kullanıcıları Quarkus'un birincil web programlama modeli olarak JAX-RS, MicroProfile Rest Client, JSON-P ve JSON-B'yi desteklemesini seveceklerdir. Spring geliştiricileri Quarkus'un Spring Web API'sine, özellikle de REST arayüzlerine verdiği son destekten memnun kalacaklardır. Spring DI'ye benzer şekilde Spring Web API desteğinin ana amacı, Spring geliştiricilerinin Spring Web API'lerini MicroProfile API'leriyle birlikte kullanmasını sağlamaktır. Desteklenen Spring Web API'lerinin nasıl kullanılacağına ilişkin örnekler Tablo 3'te verilmiştir ve bu konuyla ilgili daha fazla bilgi ve örnekler, Quarkus adlı eğitimde bulunabilir. Bahar Web Rehberi.

Tablo 3. Desteklenen Spring Web API'lerini kullanma örnekleri.

Desteklenen Bahar Web Özellikleri
Örnekler

@RestController
@RequestMapping

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

@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
@RequestParam
@RequestHeader
@MatrixVariable
@PathVariable
@CookieValue
@RequestBody
@Yanıt Durumu
@Hayalhanemersin
@RestControllerAdvice (kısmi)

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

Yay Verileri JPA

MicroProfile kullanıcıları ayrıca Quarkus'un Hibernate ORM kullanarak JPA'yı desteklemesini takdir edeceklerdir. Spring geliştiricileri için de iyi haberler var: Quarkus, yaygın Spring Data JPA ek açıklamalarını ve türlerini destekler. Desteklenen Spring Data JPA API'lerinin kullanımına ilişkin örnekler Tablo 4'te verilmiştir.
В örneğimizden proje Spring Data JPA API'leri kullanılır ve daha fazla bilgi Quarkus eğitiminde mevcuttur. Bahar Verileri JPA Kılavuzu.

Tablo 4. Desteklenen Spring Data JPA API'lerini kullanma örnekleri.

Desteklenen Spring Data JPA Özellikleri
Örnekler

Crud Deposu

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

depo
Jpa Deposu
PagingAndSortingRepository

public class PersonRepository extends 

    Repository {

    Person save(Person entity);

    Optional findById(Person entity);
}

Depo Parçaları

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

Türetilmiş sorgu yöntemleri

public interface PersonRepository extends CrudRepository {

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

    Boolean existsBookByYearOfBirthBetween(
            Integer start, Integer end);
}

Kullanıcı tanımlı sorgular

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

Mikro Profil API'leri

Hata toleransı

Hata toleransı yapıları, basamaklı arızaların önlenmesi ve güvenilir mikro hizmet mimarilerinin oluşturulması açısından çok önemlidir. Spring geliştiricileri uzun yıllardan beri hata toleransı için devre kesiciler kullanıyor. Hystriks. Ancak Hystrix uzun süredir güncellenmedi ancak MicroProfile'ın Hata Toleransı şu anda aktif olarak gelişiyor ve arkasında birkaç yıllık üretim kullanımı var. Bu nedenle Quarkus'taki hizmetlerin güvenilirliğini artırmak için Tablo 5'te örnekleri kullanılan MicroProfile Fault Tolerance API'lerinin kullanılması önerilir. Bununla ilgili daha fazla bilgi için Quarkus kılavuzuna bakın. Hata Tolerans Kılavuzu.

Tablo 5. Desteklenen MicroProfile Hata Toleransı API'lerini kullanma örnekleri.

MicroProfile Hata Toleransı Özellikleri
Açıklama
Örnekler

@Eşzamansız

Mantığı ayrı bir iş parçacığında yürütme

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

@Bölme

Eşzamanlı isteklerin sayısını sınırlayın

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

@Devre kesici

Akıllı arıza yönetimi ve arızalardan kurtarma

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

@Geri çekilmek

Arıza durumunda alternatif mantığın çağrılması

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

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

Tekrar dene

İstek hatası üzerine yeniden deneme

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

Zaman Aşımı

Arıza kontrolü zaman aşımı

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

Hizmetleri kontrol etme (Hizmet Sağlığı)

Kubernetes platformları, özel hizmetleri kullanarak konteynerlerin durumunu izler. Temel platformun hizmetleri izlemesine izin vermek için Spring geliştiricileri genellikle özel bir HealthIndicator ve Spring Boot Actuator kullanır. Quarkus'ta bu, varsayılan olarak bir canlılık kontrolü gerçekleştiren ancak aynı anda canlılığı ve hazırlığı kontrol edecek şekilde yapılandırılabilen MicroProfile Health kullanılarak yapılabilir. Desteklenen MicroProfile Health API'lerinin nasıl kullanılacağına ilişkin örnekler Tablo 6'da verilmiştir ve ek bilgiler Quarkus kılavuzunda sağlanmaktadır. Sağlık rehberi.

Tablo 6: Desteklenen MicroProfile Health API'lerinin kullanım örnekleri.

MicroProfile Sağlık özellikleri
Açıklama
Örnekler

@canlılık

Platform, başarısız konteynerleştirilmiş uygulamaları yeniden başlatır
Son nokta:
ana bilgisayar:8080/sağlık/canlı

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

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

@Hazırlık

Platform hazır değilse konteynerli uygulamalara trafik göndermez
Son nokta:
ana bilgisayar:8080/sağlık/hazır

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

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

Metrikler

Uygulamalar, operasyonel amaçlara (performans SLA'larını izlemek için) veya operasyonel olmayan amaçlara (iş SLA'ları) yönelik ölçümler sağlar. Spring geliştiricileri, Spring Boot Actuator ve Micrometer'ı kullanarak ölçümler sağlar. Buna karşılık Quarkus, temel ölçümleri (JVM ve işletim sistemi), satıcı ölçümlerini (Quarkus) ve uygulama ölçümlerini sağlamak için MicroProfile Metrics'i kullanır. MicroProfile Metrics, uygulamanın JSON ve OpenMetrics (Prometheus) çıktı formatlarını desteklemesini gerektirir. MicroProfile Metrics API'nin kullanımına ilişkin örnekler Tablo 7'de verilmiştir.

В örneğimizden proje Mikro Profil Metrikleri uygulama metriklerini sağlamak için kullanılır. Daha fazla bilgi için Quarkus kılavuzuna bakın Metrik Kılavuzu.

Tablo 7. MicroProfile Metrics API'lerini kullanma örnekleri.

Mikro Profil Metrikleri Özellikleri
Açıklama
Örnekler

@Sayıldı

Açıklamalı bir nesnenin kaç kez çağrıldığını sayan bir sayaç sayacını belirtir

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

@ConcurrentGauge

Açıklamalı bir nesneye yapılan eşzamanlı çağrıların sayısını sayan bir ölçeri belirtir

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

@Gösterge

Açıklamalı bir nesnenin değerini ölçen bir gösterge sensörünü belirtir

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

@Ölçülü

Açıklamalı bir nesnenin çağrı sıklığını izleyen bir ölçüm sensörünü belirtir

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

metrik

Bir metrik girmek veya üretmek için bir istek alındığında meta veriler hakkında bilgi içeren bir ek açıklama

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

zamanlanmış

Açıklamalı bir nesnenin süresini izleyen bir zamanlayıcıyı belirtir

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

Metrik Uç Noktaları

Uygulama metrikleri localhost:8080/metrikler/uygulama
Temel metrikler localhost:8080/metrik/taban
Satıcı metrikleri localhost:8080/metrikler/satıcı
Tüm metrikler localhost:8080/metrik

MicroProfile Dinlenme İstemcisi

Mikro hizmetler genellikle ilgili istemci API'lerinin birlikte çalışmasını gerektiren RESTful uç noktalar sağlar. RESTful uç noktalarını kullanmak için Spring geliştiricileri genellikle RestTemplate'i kullanır. Quarkus, bu sorunu çözmek için, kullanım örnekleri Tablo 8'de verilen MicroProfile Rest Client API'lerini sunmaktadır.

В örneğimizden proje RESTful uç noktalarının kullanımı MicroProfile Rest Client kullanılarak yapılır. Bu konuyla ilgili daha fazla bilgi ve örnekleri Quarkus kılavuzunda bulabilirsiniz. Dinlenme Müşteri Kılavuzu.

Tablo 8. MicroProfile Rest Client API'lerini kullanma örnekleri.

MicroProfile Rest İstemci Özellikleri
Açıklama
Örnekler

@RegisterRestClient

Yazılan bir Java arayüzünü REST istemcisi olarak kaydeder

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

@RestClient

Yazılan bir REST istemci arayüzü örneğinin uygulanmasını işaretler

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

Çağırma

Bir REST uç noktasını çağırır

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

mp-dinlenme/url

REST uç noktasını belirtir

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

sonuçlar

Öncelikle Spring geliştiricilerini hedef alan bu blogda, Java mikro hizmetlerini geliştirmek için Spring API'lerini Quarkus'taki MicroProfile API'leri ile nasıl kullanacağımıza ve ardından bunları yüzlerce megabayt RAM'den tasarruf eden ve başlatılan yerel ikili kodda nasıl derleyeceğimize hızlıca bir göz attık. milisaniyelik bir mesele.

Zaten anladığınız gibi, Spring ve MicroProfile API'lerine yönelik destek hakkında daha fazla bilginin yanı sıra diğer birçok yararlı bilgiyi şu adreste bulabilirsiniz: Quarkus kılavuzları.

Kaynak: habr.com

Yorum ekle