Bagaimana Quarkus menggabungkan MicroProfile dan Spring

Halo semuanya, ini postingan ketiga dari seri Quarkus!

Bagaimana Quarkus menggabungkan MicroProfile dan Spring

Saat mengembangkan layanan mikro Java, sering kali diyakini demikian Profil Mikro Eclipse ΠΈ Sepatu bot musim semi adalah API yang terpisah dan independen. Secara default, pemrogram cenderung menggunakan API yang sudah biasa mereka gunakan, karena mempelajari kerangka kerja baru dan komponen runtime memerlukan banyak waktu. Hari ini kami akan mencoba menyederhanakan pengembangan beberapa yang populer MicroProfile API untuk pengembang Spring dan menunjukkan cara menggunakan Spring API dan fitur baru yang berguna secara bersamaan kuarkus.

Secara lebih rinci, pertama-tama kita akan melihat cakupan dan detail bagaimana Quarkus mendukung Spring API untuk menunjukkan kepada pengembang Spring cara menggunakan MicroProfile API dalam pekerjaan mereka sehari-hari. Kemudian kita akan membahas MicroProfile API, yang berguna bagi pengembang Spring saat membuat layanan mikro.

Mengapa Quarku? Pertama, ini adalah pengkodean langsung, yaitu memuat ulang secara otomatis setiap perubahan di API MicroProfile, API Spring, dan API Java lainnya, yang dilakukan hanya dengan satu perintah: mvn quarkus:dev. Kedua, dibahas dalam dalam contoh kita layanan Person (yang mengkompilasi dari Spring, MicroProfile, dan JPA API ke dalam biner menggunakan gambar GraalVM asli) dimulai hanya dalam 0.055 detik dan memakan sekitar 90 MB RAM (RSS) pada titik akhir aplikasi RESTful. Selain itu, kompilasinya sendiri dilakukan hanya dengan satu perintah: mvn package -Pnative.

Kami tidak akan membahas secara detail tentang MicroProfile, selain untuk membantu pengembang Spring memahami bagaimana mereka dapat menggunakan Spring API dengan MicroProfile API di Quarkus.

Kontainer dan Kubernet

Untuk menyederhanakan artikel ini, kami hanya akan membahas aspek dukungan tingkat tinggi di sini. Kubernetes, karena penting untuk dipahami. Quarkus diposisikan sebagai tumpukan Java untuk Kubernetes, dirancang untuk meminimalkan konsumsi memori dan waktu startup aplikasi dan layanan Java, dan sebagai hasilnya, meningkatkan kepadatannya pada host dan mengurangi biaya keseluruhan.

Quarku juga mendukung pembuatan otomatis Sumber daya dan penawaran Kubernetes panduan untuk diterapkan 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 container.

Terakhir, dengan berfokus pada Kubernetes sebagai lingkungan penerapan target, Quarkus tidak menggunakan kerangka kerja Java jika fungsi serupa diterapkan di tingkat platform Kubernetes itu sendiri. Tabel 1 memberikan peta korespondensi fungsional antara Kubernetes dan kerangka kerja Java pada umumnya yang digunakan oleh pengembang Spring.

Tabel 1. Peta korespondensi fungsional antara framework Java dan Kubernetes.

Fungsional
Sepatu Musim Semi Tradisional
Kubernetes

Penemuan layanan
Telah kudapat
DNS

konfigurasi
Konfigurasi Cloud Musim Semi
Konfigurasi Peta/Rahasia

Penyeimbang beban
Pita (sisi klien)
Layanan, Pengontrol Replikasi (sisi server)

Mengompilasi dan menjalankan kode dari contoh

Dalam artikel ini kami mengacu pada contoh proyek, tempat API Spring dan MicroProfile dan bahkan kelas Java yang sama digunakan bersama. Kode dalam contoh ini dapat dikompilasi dan dijalankan dari baris perintah, lihat file README.md untuk detailnya.

API Kerangka Musim Semi

Injeksi Ketergantungan

Quarkus mendukung berbagai API Konteks dan Injeksi Ketergantungan (CDI). dan API Injeksi Ketergantungan Musim Semi (Spring DI). Jika Anda bekerja dengan MicroProfile, Jawa EE dan Jakarta EE, maka anda sudah sangat familiar dengan CDI. Di sisi lain, pengembang Spring dapat menggunakan Ekstensi Quarkus untuk Spring DI API untuk mencapai kompatibilitas dengan Spring DI. Contoh penggunaan API Spring DI yang didukung diberikan pada Tabel 2.

Π’ proyek dari contoh kita Menggunakan CDI dan Injeksi Ketergantungan Pegas. Untuk informasi lebih lanjut dan contoh mengenai topik ini, lihat panduan Quarkus yang disebut Panduan Musim Semi DI.

Tabel 2. Contoh penggunaan API Spring DI yang didukung.

Fitur Spring DI yang Didukung
contoh

Injeksi Konstruktor

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

Injeksi Lapangan
Kabel otomatis
Nilai

@Autowired
@RestClient
SalutationRestClient salutationRestClient;

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

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

Pelayanan

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

   public String getPrefix() {
      return message;
   }
}

Kerangka web

Pengguna MicroProfile akan menyukai Quarkus yang mendukung JAX-RS, MicroProfile Rest Client, JSON-P, dan JSON-B sebagai model pemrograman web utama. Pengembang Spring akan senang dengan dukungan terbaru Quarkus untuk Spring Web API, khususnya antarmuka REST. Mirip dengan Spring DI, tujuan utama dukungan Spring Web API adalah untuk memungkinkan pengembang Spring menggunakan Spring Web API bersama dengan MicroProfile API. Contoh cara menggunakan Spring Web API yang didukung disediakan di Tabel 3, dan informasi lebih lanjut serta contoh mengenai topik ini dapat ditemukan di tutorial Quarkus yang disebut Panduan Web Musim Semi.

Tabel 3. Contoh penggunaan Spring Web API yang didukung.

Fitur Web Musim Semi yang Didukung
contoh

@RestController
@RequestMapping

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

@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
@RequestParam
@RequestHeader
@MatrixVariable
@Variabel Jalur
@Nilai Kue
@RequestBody
@ResponStatus
@ExceptionHandler
@RestControllerAdvice (sebagian)

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

Data Musim Semi JPA

Pengguna MicroProfile juga akan menghargai bahwa Quarkus mendukung JPA menggunakan Hibernate ORM. Ada juga kabar baik bagi pengembang Spring: Quarkus mendukung anotasi dan tipe umum Spring Data JPA. Contoh penggunaan API JPA Spring Data yang didukung diberikan pada Tabel 4.
Π’ proyek dari contoh kita API JPA Spring Data digunakan dan informasi lebih lanjut tersedia di tutorial Quarkus yang disebut Panduan JPA Data Musim Semi.

Tabel 4. Contoh penggunaan Spring Data JPA API yang didukung.

Fitur JPA Data Musim Semi yang Didukung
contoh

Repositori Mentah

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

Gudang
Repositori Jpa
PagingAndSortingRepositori

public class PersonRepository extends 

    Repository {

    Person save(Person entity);

    Optional findById(Person entity);
}

Fragmen Repositori

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

Metode kueri turunan

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 Profil Mikro

Toleransi kesalahan

Konstruksi toleransi kesalahan sangat penting untuk mencegah kegagalan berjenjang dan menciptakan arsitektur layanan mikro yang andal. Pengembang pegas telah menggunakan pemutus sirkuit untuk toleransi kesalahan selama bertahun-tahun. histrix. Namun, Hystrix sudah lama tidak diperbarui, tetapi Toleransi Kesalahan MicroProfile sekarang aktif berkembang dan memiliki penggunaan produksi selama beberapa tahun di belakangnya. Oleh karena itu, untuk meningkatkan keandalan layanan di Quarkus, disarankan untuk menggunakan MicroProfile Fault Tolerance API, contohnya digunakan pada Tabel 5. Untuk informasi lebih lanjut mengenai hal ini, lihat manual Quarkus Panduan Toleransi Kesalahan.

Tabel 5. Contoh penggunaan MicroProfile Fault Tolerance API yang didukung.

Fitur Toleransi Kesalahan MicroProfile
ОписаниС
contoh

@Asynchronous

Menjalankan logika di thread terpisah

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

@Sekat

Batasi jumlah permintaan simultan

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

@Pemutus arus

Penanganan kegagalan yang cerdas dan pemulihan dari kegagalan

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

@Kembali

Memanggil logika alternatif jika terjadi kegagalan

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

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

Mencoba kembali

Coba lagi jika permintaan gagal

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

batas waktu

Batas waktu pengendalian kegagalan

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

Pengecekan layanan (Layanan Kesehatan)

Platform Kubernetes memantau kesehatan container menggunakan layanan khusus. Untuk memungkinkan platform dasar memantau layanan, pengembang Spring biasanya menggunakan HealthIndicator kustom dan Spring Boot Actuator. Di Quarkus, hal ini dapat dilakukan menggunakan MicroProfile Health, yang secara default melakukan pemeriksaan keaktifan, namun dapat dikonfigurasi untuk memeriksa keaktifan dan kesiapan secara bersamaan. Contoh cara menggunakan MicroProfile Health API yang didukung disediakan di Tabel 6, dan informasi tambahan disediakan di manual Quarkus Panduan Kesehatan.

Tabel 6: Contoh penggunaan MicroProfile Health API yang didukung.

Fitur Kesehatan MicroProfile
ОписаниС
contoh

@Kehidupan

Platform me-reboot aplikasi-aplikasi dalam container yang gagal
Titik akhir:
tuan rumah:8080/kesehatan/hidup

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

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

@Kesiapan

Platform tidak akan mengirimkan lalu lintas ke aplikasi dalam container jika belum siap
Titik akhir:
host: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 menyediakan metrik untuk tujuan operasional (untuk memantau kinerja SLA) atau tujuan non-operasional (SLA bisnis). Pengembang pegas menyediakan metrik menggunakan Spring Boot Actuator dan Micrometer. Pada gilirannya, Quarkus menggunakan Metrik MicroProfile untuk menyediakan metrik dasar (JVM dan sistem operasi), metrik vendor (Quarkus), dan metrik aplikasi. Metrik MicroProfile mengharuskan penerapannya mendukung format keluaran JSON dan OpenMetrics (Prometheus). Contoh penggunaan MicroProfile Metrics API diberikan pada Tabel 7.

Π’ proyek dari contoh kita Metrik MicroProfile digunakan untuk menyediakan metrik aplikasi. Untuk informasi lebih lanjut, lihat manual Quarkus Panduan Metrik.

Tabel 7. Contoh penggunaan MicroProfile Metrics API.

Fitur Metrik MicroProfile
ОписаниС
contoh

@Terhitung

Menunjukkan counter counter yang menghitung berapa kali objek beranotasi dipanggil

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

@ConcurrentGauge

Menunjukkan ukuran yang menghitung jumlah panggilan bersamaan ke objek beranotasi

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

@Mengukur

Menunjukkan sensor pengukur yang mengukur nilai objek beranotasi

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

@Diukur

Menunjukkan sensor meteran yang memonitor frekuensi panggilan objek beranotasi

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

metrik

Anotasi yang berisi informasi tentang metadata ketika permintaan diterima untuk memasukkan atau menghasilkan metrik

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

Waktunya

Menunjukkan pengatur waktu yang melacak durasi objek yang dianotasi

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

Titik Akhir Metrik

Metrik aplikasi localhost:8080/metrik/aplikasi
Metrik dasar localhost:8080/metrik/basis
Metrik vendor localhost:8080/metrik/vendor
Semua metrik localhost:8080/metrik

Klien Istirahat MicroProfile

Layanan mikro sering kali menyediakan titik akhir RESTful yang memerlukan API klien yang sesuai untuk digunakan. Untuk menggunakan titik akhir RESTful, pengembang Spring biasanya menggunakan RestTemplate. Quarkus menawarkan MicroProfile Rest Client API untuk mengatasi masalah ini, contoh penggunaannya diberikan pada Tabel 8.

Π’ proyek dari contoh kita penggunaan RESTful endpoint dilakukan menggunakan MicroProfile Rest Client. Informasi lebih lanjut dan contoh mengenai topik ini dapat ditemukan di manual Quarkus Panduan Klien Istirahat.

Tabel 8. Contoh penggunaan MicroProfile Rest Client API.

Fitur Klien Istirahat MicroProfile
ОписаниС
contoh

@DaftarRestClient

Mendaftarkan antarmuka Java yang diketik sebagai klien REST

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

@RestClient

Menandai implementasi sebuah instance dari antarmuka klien REST yang diketik

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

Doa

Memanggil 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

Hasil

Di blog ini, yang ditujukan terutama untuk pengembang Spring, kami melihat sekilas cara menggunakan Spring API dengan MicroProfile API di Quarkus untuk mengembangkan layanan mikro Java dan kemudian mengkompilasinya menjadi kode biner asli yang menghemat ratusan megabyte RAM dan diluncurkan di hitungan milidetik.

Seperti yang sudah Anda pahami, informasi lebih lanjut tentang dukungan untuk Spring dan MicroProfile API, serta banyak informasi berguna lainnya, dapat ditemukan di Panduan Quarkus.

Sumber: www.habr.com

Tambah komentar