Kumaha Quarkus ngagabungkeun MicroProfile sareng Spring

Halo sadayana, ieu tulisan katilu dina séri Quarkus!

Kumaha Quarkus ngagabungkeun MicroProfile sareng Spring

Nalika ngembangkeun microservices Java, mindeng dipercaya yén Eclipse MicroProfile и Boot spring mangrupakeun API misah tur bebas. Sacara standar, programer condong nganggo API anu aranjeunna biasa dianggo, sabab diajar kerangka kerja sareng komponén runtime énggal peryogi seueur waktos. Dinten ieu kami baris coba simplify ngembangkeun sababaraha populér MicroProfile API pikeun pamekar Spring sareng nunjukkeun ka anjeun kumaha ngagunakeun Spring API sareng fitur anyar anu mangpaat quarkus.

Dina leuwih jéntré saeutik, urang mimiti kasampak di wengkuan jeung detil kumaha Quarkus ngarojong Spring API pikeun mintonkeun Spring pamekar kumaha ngagunakeun MicroProfile API dina karya maranéhanana poé-ka poé. Teras we bakal nutupan API MicroProfile, anu kapaké pikeun pamekar Spring nalika nyiptakeun layanan mikro.

Naha Quarkus? Anu mimiti, ieu mangrupikeun coding langsung, nyaéta, ngamuat ulang otomatis tina sagala parobihan dina MicroProfile API, Spring API sareng API Java anu sanés, anu dilakukeun ku ngan hiji paréntah: mvn quarkus: dev. Bréh, dibahas dina dina conto urang jasa Person (anu nyusun tina Spring, MicroProfile, sareng JPA API kana binér nganggo gambar GraalVM asli) dimimitian dina ngan 0.055 detik sareng nyandak kira-kira 90 MB RAM (RSS) dina titik aplikasi RESTful. Leuwih ti éta, kompilasi na sorangan dipigawé ku ngan hiji paréntah: pakét mvn -Pnative.

Kami moal masihan detil ngeunaan MicroProfile, sanés pikeun ngabantosan pamekar Spring ngartos kumaha aranjeunna tiasa nganggo Spring API sareng MicroProfile API di Quarkus.

Wadah sareng Kubernetes

Pikeun ngajaga tulisan ieu saderhana, urang ngan ukur nutupan aspék pangrojong tingkat luhur di dieu. Kubernetes, sabab éta penting pikeun ngarti. Quarkus diposisikan salaku tumpukan Java pikeun Kubernetes, éta dirancang pikeun ngaleutikan pamakean memori sareng waktos ngamimitian aplikasi sareng jasa Java, sareng, salaku hasilna, ningkatkeun dénsitas dina host sareng ngirangan biaya sadayana.

Quarkus ogé ngarojong generasi otomatis sumberdaya Kubernetes sarta nawaran kapamimpinan pikeun penyebaran dina platform Kubernetes sareng Red Hat OpenShift. Salaku tambahan, Quarkus otomatis ngahasilkeun file Dockerfile.jvm (bungkusan JVM) sareng Dockerfile.native (bungkusan binér pribumi) anu diperyogikeun pikeun nyiptakeun wadah.

Tungtungna, ku fokus kana Kubernetes salaku lingkungan panyebaran target, Quarkus henteu nganggo kerangka Java dina kasus dimana fungsionalitas anu sami dilaksanakeun dina tingkat platform Kubernetes sorangan. meja 1 nyadiakeun peta ngeunaan susuratan fungsi antara Kubernetes jeung frameworks Java has dipaké ku pamekar Spring.

Méja 1. Peta korespondensi fungsional antara kerangka Java sareng Kubernetes.

Fungsional
Sapatu Spring Tradisional
Kubernetes

Papanggihan jasa
Eureka
DNS

konfigurasi
Spring Cloud Konfigurasi
Config Maps / Rahasia

Beban balancing
Pita (sisi klien)
Service, Replikasi Controller (sisi server)

Nyusun sareng ngajalankeun kode tina conto

Dina artikel ieu kami tingal conto proyék, dimana Spring jeung MicroProfile API komo kelas Java sarua dipaké babarengan. Kodeu dina conto ieu bisa disusun tur ngajalankeun ti garis paréntah, tingali file README.md pikeun detil.

Spring Framework API

Suntikan kagumantungan

Quarkus ngarojong sauntuyan Konteks sareng Dependency Injection (CDI) API jeung Spring Dependency Injection (Spring DI) API. Upami anjeun damel sareng MicroProfile, Java EE jeung Jakarta EE, mangka anjeun geus akrab pisan jeung CDI. Di sisi anu sanés, pamekar Spring tiasa nganggo Quarkus Extension for Spring DI API pikeun ngahontal kasaluyuan sareng Spring DI. Conto ngagunakeun Spring DI API anu dirojong dirumuskeun dina Tabél 2.

В proyék ti conto urang Nganggo CDI sareng Spring Dependency Injection. Kanggo inpo nu leuwih lengkep sareng conto dina topik ieu, tingali pituduh Quarkus disebut Spring DI Guide.

meja 2. Conto pamakéan dirojong Spring DI API.

Dirojong Spring DI Fitur
conto

Suntikan Konstruktor

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

Suntikan lapangan
Autowired
ajen

@Autowired
@RestClient
SalutationRestClient salutationRestClient;

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

Bean
@ Konfigurasi

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

komponen

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

palayanan

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

   public String getPrefix() {
      return message;
   }
}

kerangka wéb

Pangguna MicroProfile bakal resep yén Quarkus ngadukung JAX-RS, MicroProfile Rest Client, JSON-P, sareng JSON-B salaku modél program wéb primér. Pamekar musim semi bakal resep kana dukungan panganyarna Quarkus pikeun Spring Web API, khususna antarmuka REST. Sarupa jeung Spring DI, tujuan utama pangrojong Spring Web API nyaéta sangkan pamekar Spring ngagunakeun Spring Web API ditéang jeung MicroProfile API. Conto cara ngagunakeun Spring Web API anu dirojong disayogikeun dina Tabél 3, sareng seueur inpormasi sareng conto ngeunaan topik ieu tiasa dipendakan dina tutorial Quarkus anu disebut. Spring Web Guide.

meja 3. Conto ngagunakeun Spring Web API dirojong.

Dirojong Fitur Wéb Spring
conto

@RestController
@RequestMapping

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

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

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

Spring DataJPA

Pangguna MicroProfile ogé bakal ngahargaan yén Quarkus ngadukung JPA nganggo ORM Hibernate. Aya ogé warta alus pikeun pamekar Spring: Quarkus ngarojong umum Spring Data annotations JPA sarta jenis. Conto ngagunakeun API JPA Data Spring anu dirojong dibere dina Tabél 4.
В proyék ti conto urang Spring Data JPA API dipaké sarta informasi leuwih sadia dina tutorial Quarkus disebut Spring Data JPA Guide.

meja 4. Conto ngagunakeun didukung Spring Data JPA API.

Dirojong Spring Data JPA Fitur
conto

CrudRepository

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

Repository
JpaRepository
PagingAndSortingRepository

public class PersonRepository extends 

    Repository {

    Person save(Person entity);

    Optional findById(Person entity);
}

Fragmén Repository

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

Métode query turunan

public interface PersonRepository extends CrudRepository {

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

    Boolean existsBookByYearOfBirthBetween(
            Integer start, Integer end);
}

queries-diartikeun pamaké

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

Kasalahan toleransi

Konstruksi kasabaran sesar penting pisan pikeun nyegah kagagalan cascading sareng nyiptakeun arsitéktur microservice anu dipercaya. Pamekar musim semi parantos nganggo pemutus sirkuit pikeun kasabaran kasalahan mangtaun-taun. Hystrix. Sanajan kitu, Hystrix teu acan diropéa keur lila, tapi MicroProfile's Fault Tolerance ayeuna aktip ngembang sarta geus sababaraha taun pamakéan produksi balik deui. Ku alatan éta, pikeun ngaronjatkeun reliabiliti jasa di Quarkus, disarankeun pikeun ngagunakeun MicroProfile Fault Tolerance API, conto nu dipaké dina Table 5. Kanggo inpo nu langkung lengkep ihwal ieu, tingali manual Quarkus. Panungtun Kasalahan Kasalahan.

meja 5. Conto pamakéan dirojong MicroProfile Sesar Tolerance API.

Fitur Kasabaran Sesar MicroProfile
gambaran
conto

@Asynchronous

Executing logika dina thread misah

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

@Bulkhead

Ngawatesan jumlah requests simultaneous

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

@CircuitBreaker

Penanganan gagal pinter sareng pamulihan tina kagagalan

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

@Dijengkang

Nelepon logika alternatif bisi gagal

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

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

Coba deui

Coba deui dina gagal pamundut

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

Séép waktos

Kagagalan kontrol timeout

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

Palayanan Mariksa (Service Health)

Platform Kubernetes ngawas kasehatan wadah nganggo jasa khusus. Pikeun ngamungkinkeun platform dasar pikeun ngawas jasa, pamekar Spring biasana nganggo HealthIndicator khusus sareng Spring Boot Actuator. Dina Quarkus, ieu tiasa dilakukeun nganggo MicroProfile Health, anu sacara standar ngalaksanakeun cek liveness, tapi tiasa dikonpigurasi pikeun mariksa liveness sareng kesiapan sakaligus. Conto cara ngagunakeun API Kaséhatan MicroProfile anu dirojong disayogikeun dina Tabél 6, sareng inpormasi tambahan disayogikeun dina manual Quarkus. Pitunjuk Kaséhatan.

meja 6: conto pamakéan API Kaséhatan MicroProfile dirojong.

Fitur Kaséhatan MicroProfile
gambaran
conto

@Kahirupan

Platform reboots gagal aplikasi wadahna
Titik ahir:
host: 8080 / kasehatan / hirup

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

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

@Siap

Platformna moal ngirim lalu lintas ka aplikasi wadahna upami henteu siap
Titik ahir:
host: 8080 / kasehatan / siap

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

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

Métrik

Aplikasi nyayogikeun métrik pikeun tujuan operasional (pikeun ngawas kinerja SLA) atanapi tujuan non-operasional (SLA bisnis). Pamekar spring nyayogikeun métrik nganggo Spring Boot Actuator sareng Micrometer. Sabalikna, Quarkus nganggo MicroProfile Metrics pikeun nyayogikeun métrik dasar (JVM sareng sistem operasi), métrik vendor (Quarkus), sareng métrik aplikasi. MicroProfile Metrics merlukeun palaksanaan ngarojong JSON na OpenMetrics (Prometheus) format kaluaran. Conto pamakean MicroProfile Metrics API dibere dina Tabél 7.

В proyék ti conto urang MicroProfile metrics dipaké pikeun nyadiakeun metrics aplikasi. Kanggo inpo nu leuwih lengkep, tingali manual Quarkus Guide métrik.

meja 7. Conto ngagunakeun MicroProfile métrik API.

MicroProfile metrics Fitur
gambaran
conto

@Diitung

Ngalambangkeun counter counter nu diitung sabaraha kali hiji objek annotated geus disebut

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

@ConcurrentGauge

Ngalambangkeun gauge anu ngitung jumlah telepon sakaligus ka hiji objek annotated

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

@Gauge

Ngalambangkeun sensor gauge nu ngukur nilai hiji objek annotated

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

@Meter

Ngalambangkeun sénsor méteran anu ngawas frékuénsi panggero hiji obyék annotated

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

métrik

Hiji annotation ngandung émbaran ngeunaan metadata lamun hiji pamundut narima asupkeun atawa ngahasilkeun métrik a

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

Timed

Nunjukkeun timer anu ngalacak durasi hiji objek annotated

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

Métrik Endpoints

Métrik aplikasi localhost: 8080 / métrik / aplikasi
metrics dasar localhost: 8080 / métrik / basa
Métrik padagang localhost: 8080 / métrik / ngajual
Sadaya métrik localhost: 8080 / métrik

MicroProfile Rest Klién

Microservices sering nyayogikeun titik akhir RESTful anu peryogi API klien anu cocog pikeun dianggo. Pikeun nganggo titik tungtung RESTful, pamekar Spring biasana nganggo RestTemplate. Quarkus nawiskeun API Klién Istirahat MicroProfile pikeun ngarengsekeun masalah ieu, conto pamakean anu dipasihkeun dina Tabel 8.

В proyék ti conto urang pamakéan titik tungtung RESTful dipigawé ngagunakeun MicroProfile Rest Klién. Inpormasi sareng conto langkung seueur ngeunaan topik ieu tiasa dipendakan dina manual Quarkus Sésana Guide Klién.

meja 8. Conto ngagunakeun MicroProfile Rest Klien API.

MicroProfile Rest Fitur Klién
gambaran
conto

@RegisterRestClient

Ngadaptarkeun antarmuka Java anu diketik salaku klien REST

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

@RestClient

Nyirian palaksanaan hiji conto tina panganteur klien REST diketik

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

Namah

Nelepon titik tungtung REST

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

mp-sésana / url

Nangtukeun titik tungtung REST

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

hasil

Dina blog ieu, anu ditujukeun utamina pikeun pamekar Spring, urang gancang ningali kumaha cara ngagunakeun Spring API sareng MicroProfile API di Quarkus pikeun ngembangkeun microservices Java teras kompilasi kana kode binér asli anu ngahémat ratusan megabyte RAM sareng diluncurkeun dina hitungan milliseconds.

Sakumaha anjeun parantos kahartos, langkung seueur inpormasi ngeunaan dukungan pikeun Spring sareng MicroProfile API, ogé seueur inpormasi mangpaat anu sanés, tiasa dipendakan di manual Quarkus.

sumber: www.habr.com

Tambahkeun komentar