Bagaimana Quarkus Mengintegrasikan MicroProfile dan Spring

Halo semuanya, dan bersama Anda pos ketiga dari seri Quarkus! (Ngomong-ngomong, daftarkan dan buka webinar kami " Ini adalah Quarkus - kerangka kerja asli Jawa Kubernetes ", yang akan diadakan pada tanggal 27 Mei. Kami akan menunjukkan bagaimana memulai dari awal atau mentransfer solusi yang sudah jadi)



Ketika mengembangkan layanan mikro Java, sering diyakini bahwa Eclipse MicroProfile dan Spring Boot adalah API yang terpisah dan independen. Secara default, programmer biasanya menggunakan API yang biasa mereka gunakan, karena mempelajari kerangka kerja baru dan komponen runtime membutuhkan banyak waktu. Hari ini kami akan mencoba menyederhanakan pengembangan beberapa API MicroProfile populer untuk pengembang Spring.dan tunjukkan cara menggunakan API Musim Semi dan fitur berguna baru Quarkus pada saat yang sama .

Jika sedikit lebih rinci, pertama-tama kita akan melihat ruang lingkup dan rincian tentang bagaimana Quarkus mendukung Spring API untuk menunjukkan kepada pengembang Spring bagaimana menggunakan MicroProfile API dalam pekerjaan sehari-hari mereka. Kemudian kita akan berbicara tentang API MicroProfile, yang akan berguna bagi pengembang Spring ketika membuat layanan microser.

Kenapa Quarkus? Pertama, ini adalah live coding, yaitu, reload otomatis setiap perubahan pada MicroProfile API, Spring API dan API Java lainnya, yang dilakukan hanya dengan satu perintah: mvn quarkus: dev. Kedua, dipertimbangkan dalam contoh kitalayanan Person (dikompilasi dari Spring, MicroProfile, dan JPA APIs ke dalam file biner menggunakan gambar GraalVM asli) dimulai hanya dalam 0,055 detik dan membutuhkan sekitar 90 MB RAM (RSS) pada titik akhir dari aplikasi RESTful. Selain itu, kompilasi itu sendiri dilakukan hanya dengan satu perintah: mvn package -Pnative.

Kami tidak akan membahas detail MicroProfile, tetapi hanya akan mencoba membantu pengembang Spring memahami bagaimana di Quarkus Anda dapat menggunakan Spring API bersama dengan MicroProfile APIs.

Wadah dan Kubernet


Agar tidak membebani artikel ini, kami hanya akan melihat aspek tingkat tinggi dari dukungan Kubernet di sini , karena ini penting untuk dipahami. Quarkus diposisikan sebagai tumpukan Java untuk Kubernetes, dirancang untuk meminimalkan konsumsi memori dan waktu mulai aplikasi dan layanan Java, dan, sebagai hasilnya, meningkatkan kepadatan penempatan mereka di host dan mengurangi biaya keseluruhan.

Quarkus juga mendukung sumber daya otomatis Kubernetes dan menawarkan panduan penyebaran pada platform Kubernetes dan Red Hat OpenShift. Selain itu, Quarkus secara otomatis menghasilkan file Dockerfile.jvm (kemasan JVM) dan Dockerfile.native (kemasan biner asli) yang diperlukan untuk membuat wadah.

Akhirnya, dengan fokus pada Kubernetes sebagai lingkungan penyebaran target, Quarkus tidak menggunakan kerangka kerja Java dalam kasus-kasus di mana fungsionalitas serupa diimplementasikan pada tingkat platform Kubernetes itu sendiri. Tabel 1 menunjukkan peta korespondensi fungsional Kubernetes dan kerangka kerja Java yang digunakan oleh pengembang Spring.

Tabel 1. Peta pemetaan fungsional untuk kerangka kerja Java dan Kubernetes.
FungsionalBoot Musim Semi TradisionalKubernetes
Penemuan layananEurekaDNS
KonfigurasiKonfigurasi cloud springKonfigurasi Peta / Rahasia
Penyeimbang bebanPita (sisi klien)Layanan, Pengendali Replikasi (sisi server)

Kompilasi dan jalankan kode dari contoh


Dalam artikel ini, kami merujuk ke proyek contoh di mana API Spring dan MicroProfile dan bahkan kelas Java yang sama dibagi. Kode dari contoh ini dapat dikompilasi dan dijalankan dari baris perintah, lihat file README.md untuk lebih jelasnya.

API Kerangka Pegas


Ketergantungan injeksi


Quarkus mendukung berbagai API Konteks dan Dependensi Injeksi (CDI) dan Spring Dependency Injection (Spring DI). Jika Anda bekerja dengan MicroProfile, Java EE dan Jakarta EE , maka Anda sudah terbiasa dengan CDI. Di sisi lain, pengembang Spring dapat menggunakan Quarkus Extension untuk Spring DI API untuk memastikan kompatibilitas dengan Spring DI. Contoh penggunaan musim semi DI API yang didukung diberikan dalam Tabel 2.

The proyek dari contoh kita menggunakan kedua CDI dan musim semi Dependency Injection. Untuk informasi dan contoh lebih lanjut tentang topik ini, lihat Panduan Quarkus, yang disebut Panduan Spring DI .

Tabel 2. Contoh penggunaan API DI Spring yang didukung.
Fitur Spring DI yang Didukung
Constructor Injection
public PersonSpringController(
   PersonSpringRepository personRepository,  // injected      
   PersonSpringMPService personService) {    // injected
      this.personRepository = personRepository;
      this.personService = personService;
}
Field Injection
Autowired
Value
@Autowired
@RestClient
SalutationRestClient salutationRestClient;

@Value("${fallbackSalutation}")
String fallbackSalutation;
Bean
@Configuration
@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;
   }
}

-


Pengguna MicroProfile akan menikmati Quarkus yang mendukung JAX-RS, MicroProfile Rest Client, JSON-P dan JSON-B sebagai model pemrograman web utama mereka. Pengembang Spring akan senang dengan dukungan terbaru dari Spring Web API di Quarkus, khususnya, antarmuka REST. Mirip dengan Spring DI, tujuan utama mendukung Spring Web API adalah agar pengembang Spring menggunakan Spring Web API bersama dengan MicroProfile APIs. Contoh penggunaan API Web Spring yang didukung diberikan pada Tabel 3, dan lebih banyak informasi dan contoh tentang topik ini dapat ditemukan di Panduan Quarkus, yang disebut Panduan Web Spring .

Tabel 3. Contoh penggunaan API Web Spring yang didukung.
Fitur Web Musim Semi yang DidukungContohnya
@RestController
@RequestMapping
@RestController
@RequestMapping("/person")
public class PersonSpringController {
   ...
   ...
   ...
}
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
@RequestParam
@RequestHeader
@MatrixVariable
@PathVariable
@CookieValue
@RequestBody
@ResponseStatus
@ExceptionHandler
@RestControllerAdvice (partial)
@GetMapping(path = "/greet/{id}",
   produces = "text/plain")
   public String greetPerson(
   @PathVariable(name = "id") long id) {
   ...
   ...
   ...
}

Spring Data JPA


Pengguna MicroProfile juga akan menyukai Quarkus untuk mendukung JPA menggunakan Hibernate ORM. Ada kabar baik untuk pengembang Spring juga: Quarkus mendukung anotasi umum dan tipe Spring Data JPA. Contoh penggunaan API JPA Data Spring yang didukung diberikan pada tabel 4.
Dalam proyek dari contoh kami , API Data JPA Spring digunakan, dan informasi tambahan tersedia dalam panduan Quarkus yang disebut Spring Data JPA Guide .

Tabel 4. Contoh penggunaan API Data JPA Musim Semi yang didukung.
Fitur JPA Data Musim Semi yang DidukungContohnya
Crudrepository
public interface PersonRepository
         extends JpaRepository,
                 PersonFragment {
   ...
}
Repositori
PagingAndSortingRepository
JpaRepository
public class PersonRepository extends 

    Repository {

    Person save(Person entity);

    Optional findById(Person entity);
}
Fragmen Repositori
public interface PersonRepository
         extends JpaRepository,
                 PersonFragment {
   ...
}
Metode kueri yang diturunkan
public interface PersonRepository extends CrudRepository {

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

    Boolean existsBookByYearOfBirthBetween(
            Integer start, Integer end);
}
Kueri yang ditentukan pengguna
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


(Fault tolerance)


Desain toleransi kesalahan sangat penting untuk mencegah kegagalan kaskade dan membangun arsitektur layanan mikro yang kuat. Pengembang pegas telah menggunakan pemutus sirkuit Hystrix untuk toleransi kesalahan selama bertahun-tahun . Namun, Hystrix belum diperbarui untuk waktu yang lama, tetapi MicroProfile's Fault Tolerance sekarang aktif berkembang dan telah memiliki beberapa tahun penggunaan produksi. Oleh karena itu, untuk meningkatkan keandalan layanan di Quarkus, disarankan untuk menggunakan MicroProfile Fault Tolerance APIs, contohnya diberikan pada Tabel 5. Untuk informasi lebih lanjut tentang ini, lihat Panduan Toleransi Sesar Quarkus .

Tabel 5. Contoh penggunaan API Toleransi Kesalahan MicroProfile yang didukung.
Fitur Toleransi Patahan MicroProfileDeskripsiContohnya
@Asynchronous

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

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

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

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

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

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

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

(Service Health)


Platform Kubernetes memantau kesehatan kontainer menggunakan layanan khusus. Agar platform yang mendasari dapat memantau layanan, pengembang Spring biasanya menggunakan HealthIndicator kustom dan Spring Boot Actuator. Di Quarkus, ini dapat dilakukan dengan menggunakan MicroProfile Health, yang secara default melakukan pemeriksaan liveness, tetapi dapat dikonfigurasi untuk secara bersamaan memeriksa liveness dan kesiapan. Contoh penggunaan API Kesehatan MikroProfil yang didukung ditunjukkan pada Tabel 6, dan informasi lebih lanjut diberikan dalam Panduan Kesehatan Quarkus .

Tabel 6. Contoh penggunaan API Kesehatan MicroProfile yang didukung.
Fitur Kesehatan MicroProfileDeskripsiContohnya
@Kehidupan

Endpoint:
host:8080/health/live
@Liveness
public class MyHC implements HealthCheck {
  public HealthCheckResponse call() {

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

Endpoint:
host:8080/health/ready
@Readiness
public class MyHC implements HealthCheck {
  public HealthCheckResponse call() {

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


Aplikasi menyediakan metrik untuk tujuan operasional (untuk mengontrol indikator kinerja SLA) atau non-operasional (indikator SLA bisnis). Pengembang pegas memberikan metrik menggunakan Spring Boot Actuator dan Micrometer. Pada gilirannya, Quarkus menggunakan MicroProfile Metrics untuk menyediakan metrik dasar (JVM dan sistem operasi), metrik vendor (Quarkus), dan metrik aplikasi. MicroProfile Metrics mensyaratkan bahwa implementasi mendukung format output JSON dan OpenMetrics (Prometheus). Contoh-contoh penggunaan MicroProfile Metrics API diberikan pada Tabel 7.

Dalam proyek dari contoh kami, MicroProfile Metrics digunakan untuk menyediakan metrik aplikasi. Untuk informasi lebih lanjut, lihat Panduan Metrik Quarkus .

7. API- MicroProfile Metrics.
MicroProfile Metrics
@Counted
counter-,
@Counted(name = "fallbackCounter", 
  displayName = "Fallback Counter", 
  description = "Fallback Counter")
public String salutationFallback() {
   return fallbackSalutation;
}
@ConcurrentGauge
gauge-,
@ConcurrentGuage(
  name = "fallbackConcurrentGauge", 
  displayName="Fallback Concurrent", 
  description="Fallback Concurrent")
public String salutationFallback() {
   return fallbackSalutation;
}
@Gauge
gauge-,
@Metered(name = "FallbackGauge",
   displayName="Fallback Gauge",
   description="Fallback frequency")
public String salutationFallback() {
   return fallbackSalutation;
}
@Metered
meter-,
@Metered(name = "MeteredFallback",
   displayName="Metered Fallback",
   description="Fallback frequency")
public String salutationFallback() {
   return fallbackSalutation;
}
Metric
, ,
@Metric
@Metered(name = "MeteredFallback",
   displayName="Metered Fallback",
   description="Fallback frequency")
public String salutationFallback() {
   return fallbackSalutation;
}
Timed
,
@Timed(name = "TimedFallback",
   displayName="Timed Fallback",
   description="Fallback delay")
public String salutationFallback() {
   return fallbackSalutation;
}

Metrik Titik Akhir

Metrik untuk aplikasi host lokal : 8080 / metrik / aplikasi
Metrik dasar untuk host lokal : 8080 / metrik / basis
Metrik vendor untuk localhost : 8080 / metrik / vendor
Semua metrik untuk localhost : 8080 / metrik

Klien Istirahat MicroProfile


Layanan microser sering memberikan titik akhir yang tenang yang membutuhkan API klien yang sesuai. Untuk menggunakan titik akhir RESTful, pengembang Spring biasanya menggunakan RestTemplate. Quarkus juga menawarkan MicroProfile Rest Client APIs untuk menyelesaikan masalah ini, contoh penggunaannya diberikan pada Tabel 8.

Dalam proyek dari contoh kami, penggunaan titik akhir RESTful dilakukan dengan menggunakan MicroProfile Rest Client. Untuk informasi dan contoh lebih lanjut tentang topik ini, lihat Panduan Klien Istirahat Quarkus .

Tabel 8. Contoh penggunaan API Klien MicroProfile Istirahat.
Fitur Klien Istirahat MicroProfileDeskripsiContohnya
@RegisterRestClient
Mendaftarkan antarmuka Java yang diketik sebagai klien REST
@RegisterRestClient
@Path("/")
public interface MyRestClient {
    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String getSalutation();
}
@RestClient
Menandai implementasi instance dari antarmuka klien REST yang diketik
@Autowired // or @Inject
@RestClient
MyRestClient restClient;
Doa
Meminta titik akhir REST
System.out.println(
   restClient.getSalutation());
mp-rest / url
Menentukan titik akhir REST
application.properties:
org.example.MyRestClient/mp-rest/url=
   http://localhost:8081/myendpoint

Ringkasan


Dalam blog ini, yang terutama berguna bagi pengembang Spring, kami secara singkat melihat cara menggunakan Spring APIs di Quarkus bersama dengan MicroProfile APIs untuk mengembangkan layanan microser Java dan kemudian mengompilasinya menjadi kode biner asli, yang menghemat ratusan megabita RAM dan mulai dalam hitungan milidetik.

Seperti yang sudah Anda pahami, informasi tambahan tentang dukungan untuk API Spring dan MicroProfile, serta sejumlah informasi bermanfaat lainnya, dapat ditemukan di manual Quarkus .

All Articles