Xin chào mọi người, đây là bài thứ ba trong loạt bài Quarkus!
Khi phát triển các microservices Java, người ta thường tin rằng
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 ở
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.
Quarkus cũng
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
API khung mùa xuân
Tiêm phụ thuộc
Quarkus hỗ trợ một loạt
В
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
@Autowired
@RestClient
SalutationRestClient salutationRestClient;
@Value("${fallbackSalutation}")
String fallbackSalutation;
@Cấu hình
@Configuration
public class AppConfiguration {
@Bean(name = "capitalizeFunction")
public StringFunction capitalizer() {
return String::toUpperCase;
}
}
@Component("noopFunction")
public class NoOpSingleStringFunction implements StringFunction {
@Override
public String apply(String s) {
return s;
}
}
@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
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.
В
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.
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 khi yêu cầu không thành công
@Retry(maxRetries=3)
public String getSalutation() {
makeRemoteCall(); //...
}
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
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.
В
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;
}
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;
}
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
Số liệu cơ bản
Số liệu của nhà cung cấp
Tất cả 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.
В
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
Nguồn: www.habr.com