Bagaimana Quarkus menggabungkan MicroProfile dan Spring

Hello semua, inilah siaran ketiga dalam siri Quarkus!

Bagaimana Quarkus menggabungkan MicroProfile dan Spring

Apabila membangunkan perkhidmatan mikro Java, ia sering dipercayai bahawa Eclipse MicroProfile ΠΈ Boot musim bunga adalah API yang berasingan dan bebas. Secara lalai, pengaturcara cenderung menggunakan API yang telah mereka gunakan, kerana mempelajari rangka kerja baharu dan komponen masa jalan mengambil banyak masa. Hari ini kita akan cuba untuk memudahkan pembangunan beberapa popular MicroProfile API untuk pembangun Spring dan menunjukkan kepada anda cara menggunakan API Spring dan ciri berguna baharu secara serentak quarkus.

Dengan lebih terperinci, kami akan melihat skop dan butiran tentang cara Quarkus menyokong Spring API untuk menunjukkan kepada pembangun Spring cara menggunakan MicroProfile API dalam kerja seharian mereka. Kemudian kami akan merangkumi API MicroProfile, yang berguna untuk pembangun Spring apabila membuat perkhidmatan mikro.

Kenapa Quarkus? Pertama, ini ialah pengekodan langsung, iaitu, muat semula automatik sebarang perubahan dalam API MicroProfile, Spring API dan API Java lain, yang dilakukan dengan hanya satu arahan: mvn quarkus:dev. Kedua, dipertimbangkan dalam dalam contoh kita perkhidmatan Person (yang menyusun daripada Spring, MicroProfile dan API JPA ke dalam binari menggunakan imej GraalVM asli) bermula dalam masa 0.055 saat sahaja dan mengambil kira-kira 90 MB RAM (RSS) pada titik akhir aplikasi RESTful. Selain itu, kompilasinya sendiri dilakukan dengan hanya satu arahan: pakej mvn -Pnative.

Kami tidak akan menerangkan secara terperinci tentang MicroProfile, selain untuk membantu pembangun Spring memahami cara mereka boleh menggunakan Spring API dengan MicroProfile API dalam Quarkus.

Bekas dan Kubernetes

Untuk memastikan artikel ini mudah, kami hanya akan membincangkan aspek sokongan peringkat tinggi di sini. Kubernetes, kerana ia penting untuk difahami. Quarkus diletakkan sebagai timbunan Java untuk Kubernetes, ia direka untuk meminimumkan penggunaan memori dan masa permulaan aplikasi dan perkhidmatan Java, dan, sebagai hasilnya, meningkatkan ketumpatannya pada hos dan mengurangkan kos keseluruhan.

Quarkus juga menyokong penjanaan auto Sumber dan tawaran Kubernetes panduan untuk penggunaan pada platform Kubernetes dan Red Hat OpenShift. Selain itu, Quarkus menjana fail Dockerfile.jvm (pembungkusan JVM) dan Dockerfile.native (pembungkusan binari asli) secara automatik yang diperlukan untuk mencipta bekas.

Akhir sekali, dengan memfokuskan pada Kubernetes sebagai persekitaran penggunaan sasaran, Quarkus tidak menggunakan rangka kerja Java dalam kes di mana fungsi serupa dilaksanakan pada tahap platform Kubernetes itu sendiri. Jadual 1 menyediakan peta korespondensi berfungsi antara Kubernetes dan rangka kerja Java biasa yang digunakan oleh pembangun Spring.

Jadual 1. Peta korespondensi fungsian antara rangka kerja Java dan Kubernetes.

Fungsian
Kasut Musim Bunga Tradisional
Kubernetes

Penemuan perkhidmatan
Eureka
DNS

konfigurasi
Konfigurasi Awan Musim Bunga
Peta Konfig/Rahsia

Pengimbangan beban
Reben (sebelah pelanggan)
Perkhidmatan, Pengawal Replikasi (sebelah pelayan)

Menyusun dan menjalankan kod daripada contoh

Dalam artikel ini kita merujuk kepada contoh projek, di mana API Spring dan MicroProfile dan juga kelas Java yang sama digunakan bersama. Kod dalam contoh ini boleh disusun dan dijalankan dari baris arahan, lihat fail README.md untuk butiran.

API Rangka Kerja Spring

Suntikan Ketergantungan

Quarkus menyokong pelbagai Konteks dan API Suntikan Ketergantungan (CDI). dan API Suntikan Ketergantungan Spring (Spring DI). Jika anda bekerja dengan MicroProfile, Java EE dan Jakarta EE, maka anda sudah biasa dengan CDI. Sebaliknya, pembangun Spring boleh menggunakan Sambungan Quarkus untuk API Spring DI untuk mencapai keserasian dengan Spring DI. Contoh penggunaan Spring DI API yang disokong diberikan dalam Jadual 2.

Π’ projek daripada contoh kami Menggunakan kedua-dua CDI dan Suntikan Ketergantungan Spring. Untuk maklumat lanjut dan contoh mengenai topik ini, lihat panduan Quarkus yang dipanggil Panduan Spring DI.

Jadual 2. Contoh penggunaan Spring DI API yang disokong.

Ciri Spring DI yang Disokong
contoh

Suntikan Pembina

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

Suntikan Medan
Autowayed
nilai

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

Servis

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

   public String getPrefix() {
      return message;
   }
}

Rangka kerja web

Pengguna MicroProfile pasti suka bahawa Quarkus menyokong JAX-RS, MicroProfile Rest Client, JSON-P dan JSON-B sebagai model pengaturcaraan web utama. Pembangun Spring akan gembira dengan sokongan Quarkus baru-baru ini untuk API Web Spring, khususnya antara muka REST. Sama seperti Spring DI, matlamat utama sokongan Spring Web API adalah untuk membolehkan pembangun Spring menggunakan Spring Web API bersama-sama dengan MicroProfile API. Contoh cara menggunakan API Web Spring yang disokong disediakan dalam Jadual 3, dan lebih banyak maklumat serta contoh tentang topik ini boleh didapati dalam tutorial Quarkus yang dipanggil Panduan Web Spring.

Jadual 3. Contoh penggunaan Spring Web API yang disokong.

Ciri Web Spring yang Disokong
contoh

@RestController
@RequestMapping

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

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

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

JPA Spring Data

Pengguna MicroProfile juga akan menghargai bahawa Quarkus menyokong JPA menggunakan ORM Hibernate. Terdapat juga berita baik untuk pembangun Spring: Quarkus menyokong anotasi dan jenis JPA Data Spring biasa. Contoh penggunaan Spring Data JPA API yang disokong diberikan dalam Jadual 4.
Π’ projek daripada contoh kami Spring Data JPA API digunakan dan lebih banyak maklumat tersedia dalam tutorial Quarkus yang dipanggil Panduan JPA Data Spring.

Jadual 4. Contoh menggunakan API JPA Data Spring yang disokong.

Ciri JPA Spring Data Disokong
contoh

CrudRepository

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

Repositori
JpaRepository
PagingAndSortingRepository

public class PersonRepository extends 

    Repository {

    Person save(Person entity);

    Optional findById(Person entity);
}

Serpihan Repositori

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

Kaedah pertanyaan terbitan

public interface PersonRepository extends CrudRepository {

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

    Boolean existsBookByYearOfBirthBetween(
            Integer start, Integer end);
}

Pertanyaan 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

Toleransi kesalahan

Pembinaan toleransi kesalahan adalah sangat penting untuk mencegah kegagalan melata dan mencipta seni bina perkhidmatan mikro yang boleh dipercayai. Pemaju spring telah menggunakan pemutus litar untuk toleransi kesalahan selama bertahun-tahun. Hystrix. Walau bagaimanapun, Hystrix telah lama tidak dikemas kini, tetapi MicroProfile's Fault Tolerance kini sedang giat membangun dan mempunyai beberapa tahun penggunaan pengeluaran di belakangnya. Oleh itu, untuk meningkatkan kebolehpercayaan perkhidmatan dalam Quarkus, adalah disyorkan untuk menggunakan MicroProfile Fault Tolerance API, contoh yang digunakan dalam Jadual 5. Untuk mendapatkan maklumat lanjut tentang ini, lihat manual Quarkus Panduan Toleransi Kesalahan.

Jadual 5. Contoh penggunaan API Toleransi Kesalahan MicroProfile yang disokong.

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

@Asynchronous

Melaksanakan logik dalam benang berasingan

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

@Kepala pukal

Hadkan bilangan permintaan serentak

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

@Pemutus litar

Pengendalian kegagalan pintar dan pemulihan daripada kegagalan

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

@Fallback

Memanggil logik alternatif sekiranya berlaku kegagalan

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

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

Cuba semula

Cuba semula apabila permintaan gagal

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

tamat masa

Tamat masa kawalan kegagalan

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

Perkhidmatan pemeriksaan (Kesihatan Perkhidmatan)

Platform Kubernetes memantau kesihatan kontena menggunakan perkhidmatan khas. Untuk membenarkan platform asas memantau perkhidmatan, pembangun Spring biasanya menggunakan HealthIndicator tersuai dan Spring Boot Actuator. Di Quarkus, ini boleh dilakukan menggunakan MicroProfile Health, yang secara lalai melakukan pemeriksaan keaktifan, tetapi boleh dikonfigurasikan untuk memeriksa kesediaan dan kesediaan secara serentak. Contoh cara menggunakan API Kesihatan MicroProfile yang disokong disediakan dalam Jadual 6 dan maklumat tambahan disediakan dalam manual Quarkus Panduan Kesihatan.

Jadual 6: Contoh penggunaan API Kesihatan MicroProfile yang disokong.

Ciri Kesihatan MicroProfile
ОписаниС
contoh

@Kehidupan

But semula platform gagal untuk aplikasi kontena
Titik Akhir:
hos: 8080/kesihatan/hidup

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

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

@Kesediaan

Platform tidak akan menghantar trafik ke aplikasi kontena jika ia tidak sedia
Titik Akhir:
hos:8080/kesihatan/sedia

@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 sama ada untuk tujuan operasi (untuk memantau SLA prestasi) atau tujuan bukan operasi (SLA perniagaan). Pembangun Spring menyediakan metrik menggunakan Spring Boot Actuator dan Micrometer. Seterusnya, Quarkus menggunakan MicroProfile Metrics untuk menyediakan metrik garis dasar (JVM dan sistem pengendalian), metrik vendor (Quarkus) dan metrik aplikasi. MicroProfile Metrics memerlukan pelaksanaan menyokong format output JSON dan OpenMetrics (Prometheus). Contoh penggunaan MicroProfile Metrics API diberikan dalam Jadual 7.

Π’ projek daripada contoh kami Metrik MicroProfile digunakan untuk menyediakan metrik aplikasi. Untuk maklumat lanjut, lihat manual Quarkus Panduan Metrik.

Jadual 7. Contoh penggunaan API MicroProfile Metrics.

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

@Dikira

Menandakan pembilang pembilang yang mengira bilangan kali objek beranotasi telah dipanggil

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

@ConcurrentGauge

Menandakan tolok yang mengira bilangan panggilan serentak ke objek beranotasi

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

@Tolok

Menandakan penderia tolok yang mengukur nilai objek beranotasi

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

@Bermeter

Menandakan penderia meter yang memantau kekerapan panggilan objek beranotasi

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

metrik

Anotasi yang mengandungi maklumat tentang metadata apabila permintaan diterima untuk memasukkan atau menghasilkan metrik

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

Berjadual

Menunjukkan pemasa yang menjejaki tempoh objek beranotasi

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

Titik Tamat Metrik

Metrik aplikasi localhost:8080/metrik/aplikasi
Metrik asas localhost:8080/metrik/asas
Metrik vendor localhost:8080/metrik/vendor
Semua metrik localhost:8080/metrik

Pelanggan Rehat MicroProfile

Perkhidmatan mikro selalunya menyediakan titik akhir RESTful yang memerlukan API pelanggan yang sepadan untuk berfungsi. Untuk menggunakan titik akhir RESTful, pembangun Spring biasanya menggunakan RestTemplate. Quarkus menawarkan MicroProfile Rest Client API untuk menyelesaikan masalah ini, contoh penggunaannya diberikan dalam Jadual 8.

Π’ projek daripada contoh kami penggunaan titik akhir RESTful dilakukan menggunakan MicroProfile Rest Client. Maklumat lanjut dan contoh mengenai topik ini boleh didapati dalam manual Quarkus Panduan Pelanggan Rehat.

Jadual 8. Contoh penggunaan MicroProfile Rest Client API.

Ciri Pelanggan Rehat MicroProfile
ОписаниС
contoh

@RegisterRestClient

Mendaftarkan antara muka Java yang ditaip sebagai klien REST

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

@RestClient

Menandai pelaksanaan contoh antara muka klien REST yang ditaip

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

Penyerahan

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

Keputusan

Dalam blog ini, yang ditujukan terutamanya kepada pembangun Spring, kami melihat dengan pantas cara menggunakan API Spring dengan MicroProfile API dalam Quarkus untuk membangunkan perkhidmatan mikro Java dan kemudian menyusunnya menjadi kod binari asli yang menjimatkan ratusan megabait RAM dan dilancarkan dalam hitungan milisaat.

Seperti yang telah anda fahami, maklumat lanjut tentang sokongan untuk API Spring dan MicroProfile, serta banyak maklumat berguna lain, boleh didapati dalam Manual Quarkus.

Sumber: www.habr.com

Tambah komen