Cách Quarkus kết hợp MicroProfile và Spring

Xin chào mọi người, đây là bài thứ ba trong loạt bài Quarkus!

Cách Quarkus kết hợp MicroProfile và Spring

Khi phát triển các microservices Java, người ta thường tin rằng Hồ sơ vi mô Eclipse и Khởi động mùa xuân là các API riêng biệt và độc lập. Theo mặc định, các lập trình viên có xu hướng sử dụng các API mà họ đã quen sử dụng vì việc học các khung công tác và thành phần thời gian chạy mới mất rất nhiều thời gian. Hôm nay chúng ta sẽ cố gắng đơn giản hóa việc phát triển một số ứng dụng phổ biến API MicroProfile dành cho nhà phát triển Spring và hướng dẫn bạn cách sử dụng đồng thời Spring API và các tính năng hữu ích mới quarkus.

Chi tiết hơn một chút, trước tiên chúng ta sẽ xem xét phạm vi và chi tiết về cách Quarkus hỗ trợ API Spring để chỉ cho các nhà phát triển Spring cách sử dụng API MicroProfile trong công việc hàng ngày của họ. Sau đó, chúng ta sẽ đề cập đến API MicroProfile, API này rất hữu ích cho các nhà phát triển Spring khi tạo vi dịch vụ.

Tại sao lại là Quarkus? Thứ nhất, đây là mã hóa trực tiếp, tức là tự động tải lại mọi thay đổi trong API MicroProfile, API Spring và các API Java khác, được thực hiện chỉ bằng một lệnh: mvn quarkus:dev. Thứ hai, xét ở trong ví dụ của chúng tôi Dịch vụ Person (biên dịch từ API Spring, MicroProfile và JPA thành tệp nhị phân sử dụng hình ảnh GraalVM gốc) khởi động chỉ sau 0.055 giây và chiếm khoảng 90 MB RAM (RSS) trên điểm cuối ứng dụng RESTful. Hơn nữa, quá trình biên dịch của nó được thực hiện chỉ bằng một lệnh: mvn package -Pnative.

Chúng tôi sẽ không đi sâu vào chi tiết về MicroProfile, ngoài việc giúp các nhà phát triển Spring hiểu cách họ có thể sử dụng API Spring với API MicroProfile trong Quarkus.

Container và Kubernetes

Để giữ cho bài viết này đơn giản, chúng tôi sẽ chỉ đề cập đến các khía cạnh hỗ trợ cấp cao ở đây. Kubernetes, bởi vì điều quan trọng là phải hiểu. Quarkus được định vị là một ngăn xếp Java cho Kubernetes. Nó được thiết kế để giảm thiểu mức tiêu thụ bộ nhớ và thời gian khởi động của các ứng dụng và dịch vụ Java, do đó, tăng mật độ của chúng trên máy chủ và giảm chi phí tổng thể.

Quarkus cũng hỗ trợ tạo tự động Tài nguyên và ưu đãi Kubernetes hướng dẫn để triển khai trên nền tảng Kubernetes và Red Hat OpenShift. Ngoài ra, Quarkus tự động tạo các tệp Dockerfile.jvm (đóng gói JVM) và Dockerfile.native (đóng gói nhị phân gốc) cần thiết để tạo các thùng chứa.

Cuối cùng, bằng cách tập trung vào Kubernetes làm môi trường triển khai mục tiêu, Quarkus không sử dụng các khung Java trong trường hợp chức năng tương tự được triển khai ở cấp độ của chính nền tảng Kubernetes. Bảng 1 cung cấp bản đồ về sự tương ứng chức năng giữa Kubernetes và các khung Java điển hình được các nhà phát triển Spring sử dụng.

Bảng 1. Bản đồ tương ứng chức năng giữa các khung công tác Java và Kubernetes.

Chức năng
Boot mùa xuân truyền thống
Kubernetes

Khám phá dịch vụ
Eureka
DNS

Cấu hình
Cấu hình đám mây mùa xuân
Cấu hình Bản đồ/Bí mật

cân bằng tải
Ribbon (phía khách hàng)
Dịch vụ, Bộ điều khiển sao chép (phía máy chủ)

Biên dịch và chạy mã từ ví dụ

Trong bài viết này chúng tôi đề cập đến dự án ví dụ, trong đó các API Spring và MicroProfile và thậm chí cùng một lớp Java được sử dụng cùng nhau. Mã trong ví dụ này có thể được biên dịch và chạy từ dòng lệnh, xem tệp README.md để biết chi tiết.

API khung mùa xuân

Tiêm phụ thuộc

Quarkus hỗ trợ một loạt API ngữ cảnh và nội dung phụ thuộc (CDI) và API chèn phụ thuộc mùa xuân (Spring DI). Nếu bạn đang làm việc với MicroProfile, Java EE và Jakarta EE, thì bạn đã rất quen thuộc với CDI. Mặt khác, các nhà phát triển Spring có thể sử dụng Tiện ích mở rộng Quarkus cho API Spring DI để đạt được khả năng tương thích với Spring DI. Ví dụ về việc sử dụng API Spring DI được hỗ trợ được đưa ra trong Bảng 2.

В dự án từ ví dụ của chúng tôi Sử dụng cả CDI và Spring Dependency Insert. Để biết thêm thông tin và ví dụ về chủ đề này, hãy xem hướng dẫn Quarkus có tên Hướng dẫn DI mùa xuân.

Bảng 2. Ví dụ về cách sử dụng API Spring DI được hỗ trợ.

Các tính năng Spring DI được hỗ trợ
Ví dụ

Xây dựng tiêm

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

Tiêm hiện trường
có dây tự động
Giá trị

@Autowired
@RestClient
SalutationRestClient salutationRestClient;

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

hạt đậu
@Cấu hình

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

Thành phần

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

Dịch vụ

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

   public String getPrefix() {
      return message;
   }
}

Khung web

Người dùng MicroProfile sẽ thích việc Quarkus hỗ trợ JAX-RS, MicroProfile Rest Client, JSON-P và JSON-B làm mô hình lập trình web chính. Các nhà phát triển Spring sẽ hài lòng với sự hỗ trợ gần đây của Quarkus dành cho Spring Web API, đặc biệt là các giao diện REST. Tương tự như Spring DI, mục tiêu chính của việc hỗ trợ Spring Web API là cho phép các nhà phát triển Spring sử dụng Spring Web API kết hợp với MicroProfile API. Ví dụ về cách sử dụng các API Spring Web được hỗ trợ được cung cấp trong Bảng 3, đồng thời có thể tìm thấy thêm thông tin và ví dụ về chủ đề này trong hướng dẫn Quarkus có tên Hướng dẫn web mùa xuân.

Bảng 3. Ví dụ về cách sử dụng API Spring Web được hỗ trợ.

Các tính năng web mùa xuân được hỗ trợ
Ví dụ

@RestContoder
@RequestMapping

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

@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
@RequestParam
@RequestHeader
@MatrixVariable
@PathVariable
@CookieValue
@RequestBody
@ResponseStatus
@ExceptionHandler
@RestControllerAdvice (một phần)

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

Dữ liệu mùa xuân JPA

Người dùng MicroProfile cũng sẽ đánh giá cao việc Quarkus hỗ trợ JPA bằng ORM Hibernate. Ngoài ra còn có một tin tốt cho các nhà phát triển Spring: Quarkus hỗ trợ các loại và chú thích JPA dữ liệu Spring phổ biến. Ví dụ về việc sử dụng API Spring Data JPA được hỗ trợ được đưa ra trong Bảng 4.
В dự án từ ví dụ của chúng tôi API Spring Data JPA được sử dụng và có thêm thông tin trong hướng dẫn Quarkus có tên Hướng dẫn JPA dữ liệu mùa xuân.

Bảng 4. Ví dụ về cách sử dụng API Spring Data JPA được hỗ trợ.

Các tính năng JPA dữ liệu mùa xuân được hỗ trợ
Ví dụ

kho lưu trữ thô

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

Kho
Kho lưu trữ Jpa
Kho lưu trữ phân trang và sắp xếp

public class PersonRepository extends 

    Repository {

    Person save(Person entity);

    Optional findById(Person entity);
}

Các mảnh kho lưu trữ

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

Phương pháp truy vấn phái sinh

public interface PersonRepository extends CrudRepository {

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

    Boolean existsBookByYearOfBirthBetween(
            Integer start, Integer end);
}

Truy vấn do người dùng xác định

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 vi cấu hình

Khả năng chịu lỗi

Cấu trúc có khả năng chịu lỗi rất quan trọng để ngăn ngừa lỗi xếp tầng và tạo ra kiến ​​trúc vi dịch vụ đáng tin cậy. Các nhà phát triển lò xo đã sử dụng cầu dao để có khả năng chịu lỗi trong nhiều năm. hystrix. Tuy nhiên, Hystrix đã lâu không được cập nhật nhưng Fault Tolerance của MicroProfile hiện đang tích cực phát triển và đã có vài năm sử dụng sản xuất. Do đó, để cải thiện độ tin cậy của các dịch vụ trong Quarkus, bạn nên sử dụng API dung sai lỗi MicroProfile, các ví dụ được sử dụng trong Bảng 5. Để biết thêm thông tin về điều này, hãy xem hướng dẫn sử dụng Quarkus Hướng dẫn về dung sai lỗi.

Bảng 5. Ví dụ về cách sử dụng API dung sai lỗi MicroProfile được hỗ trợ.

Tính năng dung sai lỗi MicroProfile
Описание
Ví dụ

@Không đồng bộ

Thực thi logic trong một luồng riêng biệt

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

@Bulkhead

Giới hạn số lượng yêu cầu đồng thời

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

@Ngắt mạch

Xử lý lỗi thông minh và phục hồi sau lỗi

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

@Dự phòng

Gọi logic thay thế trong trường hợp thất bại

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

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

Thử lại

Thử lại khi yêu cầu không thành công

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

Timeout

Hết thời gian kiểm soát lỗi

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

Kiểm tra dịch vụ (Service Health)

Nền tảng Kubernetes giám sát tình trạng của container bằng các dịch vụ đặc biệt. Để cho phép nền tảng cơ bản giám sát các dịch vụ, các nhà phát triển Spring thường sử dụng HealthIndicator và Spring Boot Actuator tùy chỉnh. Trong Quarkus, điều này có thể được thực hiện bằng cách sử dụng MicroProfile Health, theo mặc định thực hiện kiểm tra mức độ hoạt động nhưng có thể được định cấu hình để kiểm tra mức độ hoạt động và mức độ sẵn sàng đồng thời. Ví dụ về cách sử dụng API MicroProfile Health được hỗ trợ được cung cấp trong Bảng 6 và thông tin bổ sung được cung cấp trong hướng dẫn sử dụng Quarkus Hướng dẫn sức khỏe.

Bảng 6: Ví dụ sử dụng các API MicroProfile Health được hỗ trợ.

Các tính năng của MicroProfile Health
Описание
Ví dụ

@Sự sống động

Nền tảng khởi động lại các ứng dụng được chứa trong container bị lỗi
Điểm cuối:
chủ nhà:8080/sức khỏe/trực tiếp

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

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

@Sẵn sàng

Nền tảng sẽ không gửi lưu lượng truy cập đến các ứng dụng được đóng gói nếu nó chưa sẵn sàng
Điểm cuối:
chủ nhà:8080/sức khỏe/sẵn sàng

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

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

Số liệu

Các ứng dụng cung cấp số liệu cho mục đích hoạt động (để giám sát SLA hiệu suất) hoặc cho mục đích phi hoạt động (SLA kinh doanh). Các nhà phát triển Spring cung cấp số liệu bằng cách sử dụng Spring Boot Actuator và Micromet. Đổi lại, Quarkus sử dụng Số liệu MicroProfile để cung cấp số liệu cơ bản (JVM và hệ điều hành), số liệu của nhà cung cấp (Quarkus) và số liệu ứng dụng. MicroProfile Metrics yêu cầu việc triển khai hỗ trợ các định dạng đầu ra JSON và OpenMetrics (Prometheus). Ví dụ về việc sử dụng API số liệu MicroProfile được đưa ra trong Bảng 7.

В dự án từ ví dụ của chúng tôi Số liệu MicroProfile được sử dụng để cung cấp số liệu ứng dụng. Để biết thêm thông tin, hãy xem hướng dẫn sử dụng Quarkus Hướng dẫn về số liệu.

Bảng 7. Ví dụ về cách sử dụng API MicroProfile Metrics.

Tính năng số liệu MicroProfile
Описание
Ví dụ

@Đã đếm

Biểu thị một bộ đếm đếm số lần một đối tượng được chú thích được gọi

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

@ConcurrentGauge

Biểu thị thước đo đếm số lượng cuộc gọi đồng thời đến một đối tượng được chú thích

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

@Gauge

Biểu thị một cảm biến đo đo giá trị của một đối tượng được chú thích

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

@Metered

Biểu thị cảm biến đồng hồ đo theo dõi tần suất cuộc gọi của đối tượng được chú thích

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

metric

Chú thích chứa thông tin về siêu dữ liệu khi nhận được yêu cầu nhập hoặc tạo số liệu

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

Đúng giờ

Cho biết bộ hẹn giờ theo dõi thời lượng của một đối tượng được chú thích

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

Điểm cuối chỉ số

Số liệu ứng dụng localhost:8080/số liệu/ứng dụng
Số liệu cơ bản localhost:8080/số liệu/cơ sở
Số liệu của nhà cung cấp localhost:8080/số liệu/nhà cung cấp
Tất cả số liệu localhost:8080/số liệu

Máy khách nghỉ ngơi MicroProfile

Các vi dịch vụ thường cung cấp các điểm cuối RESTful yêu cầu các API máy khách tương ứng để hoạt động. Để sử dụng điểm cuối RESTful, các nhà phát triển Spring thường sử dụng RestTemplate. Quarkus cung cấp API MicroProfile Rest Client để giải quyết vấn đề này, các ví dụ về cách sử dụng được đưa ra trong Bảng 8.

В dự án từ ví dụ của chúng tôi việc sử dụng điểm cuối RESTful được thực hiện bằng MicroProfile Rest Client. Bạn có thể tìm thêm thông tin và ví dụ về chủ đề này trong sổ tay Quarkus Hướng dẫn khách hàng nghỉ ngơi.

Bảng 8. Ví dụ về cách sử dụng API máy khách MicroProfile Rest.

Các tính năng của máy khách MicroProfile Rest
Описание
Ví dụ

@RegisterRestClient

Đăng ký giao diện Java đã nhập làm máy khách REST

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

@RestClient

Đánh dấu việc triển khai một phiên bản của giao diện máy khách REST đã nhập

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

sự thỉnh nguyện

Gọi điểm cuối REST

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

mp-rest/url

Chỉ định điểm cuối REST

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

Kết quả

Trong blog này, chủ yếu nhắm đến các nhà phát triển Spring, chúng tôi đã xem nhanh cách sử dụng API Spring với API MicroProfile trong Quarkus để phát triển các dịch vụ vi mô Java, sau đó biên dịch chúng thành mã nhị phân gốc giúp tiết kiệm hàng trăm megabyte RAM và khởi chạy trong chỉ tính bằng mili giây.

Như bạn đã hiểu, bạn có thể tìm thấy thêm thông tin về việc hỗ trợ API Spring và MicroProfile cũng như nhiều thông tin hữu ích khác trong Hướng dẫn sử dụng Quarkus.

Nguồn: www.habr.com

Thêm một lời nhận xét