Kepiye Quarkus nggabungake MicroProfile lan Spring

Halo kabeh, iki kiriman katelu ing seri Quarkus!

Kepiye Quarkus nggabungake MicroProfile lan Spring

Nalika ngembangake layanan mikro Jawa, asring dipercaya Gerhana MicroProfile ΠΈ Boot spring iku API kapisah lan sawijining. Kanthi gawan, programer cenderung nggunakake API sing wis digunakake, amarga sinau kerangka kerja lan komponen runtime anyar mbutuhake wektu akeh. Dina iki kita bakal nyoba kanggo nyederhanakake pangembangan sawetara populer MicroProfile API kanggo pangembang Spring lan nuduhake sampeyan carane bebarengan nggunakake Spring API lan fitur migunani anyar quarkus.

Kanthi luwih rinci, kita bakal ndeleng ruang lingkup lan rincian babagan carane Quarkus ndhukung Spring API kanggo nuduhake pangembang Spring carane nggunakake MicroProfile API ing karya saben dinane. Banjur kita bakal nutupi API MicroProfile, sing migunani kanggo pangembang Spring nalika nggawe layanan mikro.

Kenapa Quarkus? Kaping pisanan, iki coding langsung, yaiku, ngisi ulang otomatis saka owah-owahan ing MicroProfile API, Spring API lan API Java liyane, sing ditindakake kanthi mung siji prentah: mvn quarkus:dev. Kapindho, dibahas ing ing conto kita layanan Person (sing kompilasi saka Spring, MicroProfile, lan JPA API menyang binar nggunakake gambar GraalVM native) diwiwiti mung 0.055 detik lan njupuk udakara 90 MB RAM (RSS) ing titik pungkasan aplikasi RESTful. Kajaba iku, kompilasi dhewe ditindakake kanthi mung siji prentah: paket mvn -Pnative.

Kita ora bakal njlèntrèhaké rinci babagan MicroProfile, kajaba kanggo mbantu pangembang Spring ngerti carane bisa nggunakake Spring API karo MicroProfile API ing Quarkus.

Wadhah lan Kubernetes

Supaya artikel iki tetep prasaja, kita mung bakal nutupi aspek dhukungan tingkat dhuwur ing kene. Kubernetes, amarga iku penting kanggo ngerti. Quarkus dipanggonke minangka tumpukan Jawa kanggo Kubernetes, dirancang kanggo nyilikake konsumsi memori lan wektu wiwitan aplikasi lan layanan Jawa, lan, minangka asil, nambah Kapadhetan ing inang lan nyuda biaya sakabèhé.

Quarkus uga ndhukung generasi otomatis sumber daya Kubernetes lan nawakake kepemimpinan kanggo penyebaran ing platform Kubernetes lan Red Hat OpenShift. Kajaba iku, Quarkus kanthi otomatis ngasilake file Dockerfile.jvm (packaging JVM) lan Dockerfile.native (paket binar asli) sing dibutuhake kanggo nggawe wadhah.

Pungkasan, kanthi fokus ing Kubernetes minangka lingkungan panyebaran target, Quarkus ora nggunakake kerangka Java ing kasus nalika fungsi sing padha ditindakake ing tingkat platform Kubernetes dhewe. Tabel 1 nyedhiyakake peta korespondensi fungsional antarane Kubernetes lan kerangka Java khas sing digunakake dening pangembang Spring.

Tabel 1. Peta korespondensi fungsional antarane kerangka Jawa lan Kubernetes.

Fungsi
Boot Spring Tradisional
Kubernetes

Panemuan layanan
Eureka
DNS

konfigurasi
Spring Cloud Config
Konfigurasi Peta / Rahasia

Ngimbangi pengimbang
Pita (sisi klien)
Service, Replication Controller (sisih server)

Nglumpukake lan mbukak kode saka conto

Ing artikel iki kita deleng conto proyek, ngendi Spring lan MicroProfile API lan malah kelas Jawa padha digunakake bebarengan. Kode ing conto iki bisa disusun lan mbukak saka baris printah, ndeleng file README.md kanggo rincian.

Spring Framework API

Injeksi ketergantungan

Quarkus ndhukung sawetara Konteks lan Dependency Injection (CDI) API lan Spring Dependency Injection (Spring DI) API. Yen sampeyan nggarap MicroProfile, Jawa EE lan Jakarta EE, banjur sampeyan wis ngerti banget karo CDI. Ing tangan liyane, pangembang Spring bisa nggunakake Extension Quarkus kanggo Spring DI API kanggo entuk kompatibilitas karo Spring DI. Conto nggunakake Spring DI API sing didhukung diwenehi ing Tabel 2.

Π’ proyek saka conto kita Nggunakake CDI lan Spring Dependency Injection. Kanggo informasi luwih lengkap lan conto ing topik iki, waca pandhuan Quarkus disebut Spring DI Guide.

Tabel 2. Conto nggunakake Spring DI API didhukung.

Didhukung Spring DI Fitur
conto

Injeksi Konstruktor

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

Injeksi lapangan
Autowired
Value

@Autowired
@RestClient
SalutationRestClient salutationRestClient;

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

Bean
@Konfigurasi

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

Service

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

   public String getPrefix() {
      return message;
   }
}

kerangka web

Pangguna MicroProfile bakal seneng yen Quarkus ndhukung JAX-RS, MicroProfile Rest Client, JSON-P, lan JSON-B minangka model pemrograman web utama. Pangembang musim semi bakal seneng karo dhukungan Quarkus anyar kanggo Spring Web API, utamane antarmuka REST. Kaya Spring DI, tujuan utama dhukungan Spring Web API yaiku supaya pangembang Spring bisa nggunakake Spring Web API bebarengan karo MicroProfile API. Conto carane nggunakake Spring Web API sing didhukung kasedhiya ing Tabel 3, lan informasi lan conto liyane babagan topik iki bisa ditemokake ing tutorial Quarkus sing diarani Spring Web Guide.

Tabel 3. Conto nggunakake Spring Web API didhukung.

Didhukung Spring Web Fitur
conto

@RestController
@RequestMapping

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

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

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

Spring DataJPA

Pangguna MicroProfile uga bakal ngormati manawa Quarkus ndhukung JPA nggunakake ORM Hibernate. Ana uga kabar apik kanggo pangembang Spring: Quarkus ndhukung anotasi lan jinis JPA Spring Data umum. Conto nggunakake Spring Data JPA API sing didhukung diwenehi ing Tabel 4.
Π’ proyek saka conto kita Spring Data JPA API digunakake lan informasi liyane kasedhiya ing tutorial Quarkus disebut Spring Data JPA Guide.

Tabel 4. Conto nggunakake didhukung Spring Data JPA API.

Fitur Spring Data JPA sing Didhukung
conto

CrudRepository

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

Repository
JpaRepository
PagingAndSortingRepository

public class PersonRepository extends 

    Repository {

    Person save(Person entity);

    Optional findById(Person entity);
}

Fragmen Repositori

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

Metode pitakon sing diturunake

public interface PersonRepository extends CrudRepository {

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

    Boolean existsBookByYearOfBirthBetween(
            Integer start, Integer end);
}

Pitakonan sing ditemtokake pangguna

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

Toleransi kesalahan

Konstruksi toleransi kesalahan penting banget kanggo nyegah kegagalan runtun lan nggawe arsitektur layanan mikro sing dipercaya. Pangembang musim semi wis nggunakake pemutus sirkuit kanggo toleransi kesalahan sajrone pirang-pirang taun. Hystrix. Nanging, Hystrix wis suwe ora dianyari, nanging MicroProfile's Fault Tolerance saiki aktif berkembang lan wis pirang-pirang taun nggunakake produksi. Mulane, kanggo nambah linuwih layanan ing Quarkus, dianjurake kanggo nggunakake MicroProfile Fault Tolerance API, contone digunakake ing Tabel 5. Kanggo informasi luwih lengkap babagan iki, waca manual Quarkus Fault Tolerance Guide.

Tabel 5. Conto nggunakake didhukung MicroProfile Fault Tolerance API.

Fitur Toleransi Fault MicroProfile
Description
conto

@Asynchronous

Eksekusi logika ing thread kapisah

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

@Bulkhead

Matesi jumlah panjalukan bebarengan

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

@CircuitBreaker

Penanganan kegagalan cerdas lan pulih saka kegagalan

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

@Mundur

Nelpon logika alternatif yen gagal

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

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

Coba maneh

Coba maneh yen panjaluk gagal

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

Wektu ne entek

Wektu kontrol gagal

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

Pelayanan Pemeriksaan (Service Health)

Platform Kubernetes ngawasi kesehatan kontaner nggunakake layanan khusus. Kanggo ngidini platform dhasar kanggo ngawasi layanan, pangembang Spring biasane nggunakake HealthIndicator khusus lan Spring Boot Actuator. Ing Quarkus, iki bisa ditindakake kanthi nggunakake MicroProfile Health, sing kanthi standar nindakake mriksa liveness, nanging bisa dikonfigurasi kanggo mriksa liveness lan kesiapan bebarengan. Conto carane nggunakake MicroProfile Health API sing didhukung kasedhiya ing Tabel 6, lan informasi tambahan kasedhiya ing manual Quarkus Pandhuan Kesehatan.

Tabel 6: Conto panggunaan API Kesehatan MicroProfile sing didhukung.

Fitur Kesehatan MicroProfile
Description
conto

@urip

Platform reboots gagal aplikasi containerized
Titik pungkasan:
inang: 8080 / kesehatan / urip

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

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

@Siaga

Platform kasebut ora bakal ngirim lalu lintas menyang aplikasi kontainer yen durung siyap
Titik pungkasan:
inang: 8080 / kesehatan / siap

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

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

Metrik

Aplikasi nyedhiyakake metrik kanggo tujuan operasional (kanggo ngawasi kinerja SLA) utawa tujuan non-operasional (SLA bisnis). Pangembang musim semi nyedhiyakake metrik nggunakake Spring Boot Actuator lan Micrometer. Sabanjure, Quarkus nggunakake MicroProfile Metrics kanggo nyedhiyakake metrik baseline (JVM lan sistem operasi), metrik vendor (Quarkus), lan metrik aplikasi. MicroProfile Metrics mbutuhake implementasine ndhukung format output JSON lan OpenMetrics (Prometheus). Conto nggunakake MicroProfile Metrics API diwenehi ing Tabel 7.

Π’ proyek saka conto kita Metrik MicroProfile digunakake kanggo nyedhiyakake metrik aplikasi. Kanggo informasi luwih lengkap, waca manual Quarkus Panduan Metrik.

Tabel 7. Conto nggunakake MicroProfile Metrics API.

Fitur Metrik MicroProfile
Description
conto

@Dietung

Nduduhake counter counter sing ngitung kaping pirang-pirang obyek sing dianotasi diarani

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

@ConcurrentGauge

Nduduhake ukuran sing ngitung jumlah panggilan bebarengan menyang obyek sing dianotasi

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

@Gauge

Nduduhake sensor gauge sing ngukur nilai obyek sing dianotasi

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

@Meter

Nduduhake sensor meter sing ngawasi frekuensi telpon saka obyek anotasi

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

Metrik

Anotasi sing ngemot informasi babagan metadata nalika panjalukan ditampa kanggo ngetik utawa ngasilake metrik

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

Dipasang

Nuduhake wektu sing nglacak durasi obyek sing dianotasi

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

Metrik Endpoints

Metrik aplikasi localhost:8080/metrik/aplikasi
Metrik dhasar localhost: 8080/metrik/basa
Metrik vendor localhost:8080/metrik/vendor
Kabeh metrik localhost: 8080/metrik

Klien Ngaso MicroProfile

Microservices asring nyedhiyakake titik pungkasan RESTful sing mbutuhake API klien sing cocog kanggo digarap. Kanggo nggunakake titik pungkasan RESTful, pangembang Spring biasane nggunakake RestTemplate. Quarkus nawakake MicroProfile Rest Client API kanggo ngatasi masalah iki, conto panggunaan sing diwenehake ing Tabel 8.

Π’ proyek saka conto kita panggunaan titik pungkasan RESTful rampung nggunakake Klien Rest MicroProfile. Informasi lan conto liyane babagan topik iki bisa ditemokake ing manual Quarkus Pandhuan Klien Istirahat.

Tabel 8. Conto nggunakake MicroProfile Rest Client API.

Fitur Klien Istirahat MicroProfile
Description
conto

@RegisterRestClient

Ndhaptar antarmuka Java sing diketik minangka klien REST

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

@RestClient

Nandhani implementasine conto antarmuka klien REST sing diketik

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

Panjaluk

Nelpon titik pungkasan REST

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

mp-rest/url

Nemtokake titik pungkasan REST

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

Hasil

Ing blog iki, ngarahake utamane kanggo pangembang Spring, kita ndeleng cepet babagan carane nggunakake Spring API karo MicroProfile API ing Quarkus kanggo ngembangake microservices Java lan banjur ngumpulake menyang kode binar asli sing ngirit atusan megabyte RAM lan diluncurake ing prakara milliseconds.

Kaya sing wis dingerteni, informasi luwih lengkap babagan dhukungan kanggo Spring lan MicroProfile API, uga akeh informasi migunani liyane, bisa ditemokake ing Manual Quarkus.

Source: www.habr.com

Add a comment