Quarkus MicroProfile болон Spring-ийг хэрхэн хослуулсан

Сайн байцгаана уу, Quarkus цувралын 3 дахь бичлэгийг хүргэж байна!

Quarkus MicroProfile болон Spring-ийг хэрхэн хослуулсан

Java микро үйлчилгээг хөгжүүлэхдээ ихэвчлэн ийм зүйл итгэдэг Eclipse MicroProfile и Хавар ачаалах нь тусдаа бөгөөд бие даасан API юм. Анхдагч байдлаар, програмистууд шинэ хүрээ болон ажиллах үеийн бүрэлдэхүүн хэсгүүдийг сурахад маш их цаг зарцуулдаг тул аль хэдийн дассан API-г ашиглах хандлагатай байдаг. Өнөөдөр бид зарим алдартай хөгжлийг хялбарчлахыг хичээх болно Хаврын хөгжүүлэгчдэд зориулсан MicroProfile API Spring API болон шинэ ашигтай функцуудыг хэрхэн нэгэн зэрэг ашиглахыг танд үзүүлэх болно Кваркус.

Бага зэрэг дэлгэрэнгүй, бид эхлээд Spring хөгжүүлэгчдэд MicroProfile API-г өдөр тутмын ажилдаа хэрхэн ашиглахыг харуулахын тулд Quarkus Spring API-г хэрхэн дэмждэг талаар дэлгэрэнгүй авч үзэх болно. Дараа нь бид хаврын хөгжүүлэгчдэд бичил үйлчилгээ үүсгэхэд хэрэг болох MicroProfile API-уудыг авч үзэх болно.

Яагаад Кваркус гэж? Нэгдүгээрт, энэ бол шууд кодчилол, өөрөөр хэлбэл MicroProfile API, Spring API болон бусад Java API-д гарсан өөрчлөлтийг автоматаар дахин ачаалах бөгөөд үүнийг зөвхөн нэг тушаалаар гүйцэтгэдэг: mvn quarkus:dev. Хоёрдугаарт, авч үзсэн бидний жишээнд Person үйлчилгээ (Spring, MicroProfile, JPA API-аас уугуул GraalVM дүрсийг ашиглан хоёртын файл болгон хөрвүүлдэг) ердөө 0.055 секундын дотор эхэлж, RESTful програмын төгсгөлийн цэг дээр ойролцоогоор 90 MB RAM (RSS) эзэлнэ. Түүгээр ч барахгүй түүний эмхэтгэл нь mvn package -Pnative гэсэн ганцхан тушаалаар хийгддэг.

Бид Spring-ийн хөгжүүлэгчдэд Spring API-уудыг Quarkus дахь MicroProfile API-тай хэрхэн ашиглах талаар ойлгоход нь туслахаас өөр MicroProfile-ийн талаар дэлгэрэнгүй ярихгүй.

Контейнер ба Кубернет

Энэ нийтлэлийг энгийн байлгахын тулд бид зөвхөн дээд түвшний дэмжлэгийг энд авч үзэх болно. Kubernetes, учир нь ойлгох нь чухал. Quarkus нь Kubernetes-д зориулсан Java стек хэлбэрээр байрладаг бөгөөд энэ нь санах ойн зарцуулалт, Java програм, үйлчилгээг эхлүүлэх хугацааг багасгахад зориулагдсан бөгөөд үүний үр дүнд хост дээрх нягтралыг нэмэгдүүлж, нийт зардлыг бууруулдаг.

Кваркус бас автоматаар үүсгэхийг дэмждэг Kubernetes нөөц ба санал манлайлал Kubernetes болон Red Hat OpenShift платформ дээр байрлуулахад зориулагдсан. Нэмж дурдахад Quarkus нь контейнер үүсгэхэд шаардлагатай Dockerfile.jvm (JVM савлагаа) болон Dockerfile.native (уугуул хоёртын савлагаа) файлуудыг автоматаар үүсгэдэг.

Эцэст нь Кубернетесийг зорилтот байршуулах орчин болгон төвлөрүүлснээр Quarkus нь Kubernetes платформын түвшинд ижил төстэй функцийг хэрэгжүүлсэн тохиолдолд Java хүрээг ашигладаггүй. Хүснэгт 1-д Кубернетес болон Spring хөгжүүлэгчдийн ашигладаг ердийн Java хүрээнүүдийн хоорондох функциональ харилцааны газрын зургийг үзүүлэв.

Хүснэгт 1. Java framework болон Kubernetes хоорондын функциональ харилцааны газрын зураг.

Функциональ
Уламжлалт хаврын гутал
Kubernetes

Үйлчилгээний нээлт
Эврика
DNS

Тохиргоо
Хаврын үүл тохиргоо
Газрын зураг/Нууцыг тохируулах

Ачааллыг тэнцвэржүүлэх
Тууз (үйлчлүүлэгч тал)
Үйлчилгээ, хуулбарлах хянагч (серверийн тал)

Жишээн дээрх кодыг эмхэтгэж ажиллуулж байна

Энэ нийтлэлд бид дурддаг жишээ төсөл, Spring болон MicroProfile API-ууд, тэр ч байтугай ижил Java анги хамт хэрэглэгддэг. Энэ жишээн дээрх кодыг эмхэтгэж, командын мөрөөс ажиллуулж болно, дэлгэрэнгүйг README.md файлаас үзнэ үү.

Spring Framework APIs

Хамааралтай тарилга

Quarkus нь хэд хэдэн төрлийг дэмждэг Нөхцөл байдал ба хамаарал үүсгэх (CDI) API болон хаврын хамаарлын тарилга (Spring DI) APIs. Хэрэв та MicroProfile-тэй ажиллаж байгаа бол, Java EE ба Жакарта EE, тэгвэл та CDI-г аль хэдийн сайн мэддэг болсон. Нөгөө талаас, Spring хөгжүүлэгчид Spring DI-тай нийцтэй байхын тулд Spring DI API-д зориулсан Quarkus өргөтгөлийг ашиглаж болно. Дэмжигдсэн Spring DI API-г ашиглах жишээг 2-р хүснэгтэд үзүүлэв.

В бидний жишээнээс төсөл CDI болон Spring Dependency Injection хоёуланг нь ашигладаг. Энэ сэдвээр нэмэлт мэдээлэл, жишээ авахыг хүсвэл Quarkus гарын авлагыг үзнэ үү Хаврын DI гарын авлага.

Хүснэгт 2. Дэмжигдсэн Spring DI API-г ашиглах жишээ.

Дэмжигдсэн хаврын DI функцууд
жишээ

Бүтээгч тарилга

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

Талбайн тарилга
Автоматаар холбогдсон
үнэ цэнэ

@Autowired
@RestClient
SalutationRestClient salutationRestClient;

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

Bean
@ Тохиргоо

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

Вэб хүрээ

MicroProfile хэрэглэгчид Quarkus нь JAX-RS, MicroProfile Rest Client, JSON-P, JSON-B-ийг вэб програмчлалын үндсэн загвар болгон дэмждэгт дуртай байх болно. Хаврын хөгжүүлэгчид Quarkus-ийн Spring Web API, ялангуяа REST интерфейсийг дэмжсэнд сэтгэл хангалуун байх болно. Spring DI-тай адил Spring Web API-ийн дэмжлэгийн гол зорилго нь Spring Web API-г MicroProfile API-тай хамт ашиглах боломжийг Spring хөгжүүлэгчдэд олгох явдал юм. Дэмжигдсэн Spring Web API-г хэрхэн ашиглах жишээг Хүснэгт 3-т өгсөн байгаа бөгөөд энэ сэдвийн талаарх дэлгэрэнгүй мэдээлэл, жишээг Quarkus хичээлээс олж болно. Хаврын вэб хөтөч.

Хүснэгт 3. Дэмжигдсэн Spring Web API-г ашиглах жишээ.

Дэмжигдсэн хаврын вэб функцууд
жишээ

@RestController
@RequestMapping

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

@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
@RequestParam
@RequestHeader
@MatrixVariable
@PathVariable
@CookieValue
@RequestBody
@ResponseStatus
@ExceptionHandler
@RestControllerAdvice (хэсэгчилсэн)

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

Хаврын мэдээлэл JPA

MicroProfile хэрэглэгчид Quarkus нь Hibernate ORM ашиглан JPA-г дэмждэгт талархах болно. Хаврын хөгжүүлэгчдэд бас сайн мэдээ байна: Quarkus нь нийтлэг Spring Data JPA тэмдэглэгээ болон төрлийг дэмждэг. Дэмжигдсэн Spring Data JPA API-г ашиглах жишээг 4-р хүснэгтэд үзүүлэв.
В бидний жишээнээс төсөл Spring Data JPA API-г ашигладаг бөгөөд илүү дэлгэрэнгүй мэдээллийг Quarkus хичээлээс авах боломжтой Хаврын мэдээллийн JPA гарын авлага.

Хүснэгт 4. Дэмжигдсэн Spring Data JPA API ашиглах жишээ.

Хаврын өгөгдлийн JPA функцуудыг дэмждэг
жишээ

CrudRepository

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

Репозитор
JpaRepository
PagingAndSortingRepository

public class PersonRepository extends 

    Repository {

    Person save(Person entity);

    Optional findById(Person entity);
}

Хадгалах сангийн фрагментууд

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

Гаргасан асуулгын аргууд

public interface PersonRepository extends CrudRepository {

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

    Boolean existsBookByYearOfBirthBetween(
            Integer start, Integer end);
}

Хэрэглэгчийн тодорхойлсон асуулга

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

MicroProfile APIs

Алдааг тэсвэрлэх чадвар

Гэмтлийг тэсвэрлэх бүтэц нь шаталсан бүтэлгүйтлээс урьдчилан сэргийлэх, найдвартай микро үйлчилгээний архитектурыг бий болгоход маш чухал юм. Хаврын хөгжүүлэгчид олон жилийн турш алдааг тэсвэрлэхийн тулд таслуур ашиглаж ирсэн. Hystrix. Гэсэн хэдий ч Hystrix шинэчлэгдээгүй удаж байгаа ч MicroProfile-ийн алдааг тэсвэрлэх чадвар нь одоо идэвхтэй хөгжиж байгаа бөгөөд үүний цаана хэдэн жилийн үйлдвэрлэлийн хэрэглээ бий. Тиймээс Кваркус дахь үйлчилгээний найдвартай байдлыг сайжруулахын тулд MicroProfile Fault Tolerance API-г ашиглахыг зөвлөж байна, тэдгээрийн жишээг Хүснэгт 5-д ашигласан болно. Энэ талаар дэлгэрэнгүй мэдээллийг Quarkus гарын авлагаас үзнэ үү. Алдааг тэсвэрлэх гарын авлага.

Хүснэгт 5. Дэмжигдсэн MicroProfile Fault Tolerance API ашиглах жишээ.

MicroProfile-ийн алдааг тэсвэрлэх шинж чанарууд
Тайлбар
жишээ

@Асинхрон

Тусдаа хэлхээнд логикийг гүйцэтгэж байна

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

@Balkhead

Нэг зэрэг хүсэлт гаргах тоог хязгаарлах

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

@CircuitBreaker

Ухаалаг алдаатай харьцах, алдааг сэргээх

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

@Эргэж буцах

Амжилтгүй болсон тохиолдолд өөр логикийг дуудах

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

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

Дахин оролдоно уу

Хүсэлт амжилтгүй болсны дараа дахин оролдоно уу

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

Завсарлага

Алдааг хянах хугацаа хэтэрсэн

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

Үйлчилгээг шалгаж байна (Үйлчилгээний эрүүл мэнд)

Kubernetes платформууд нь тусгай үйлчилгээг ашиглан савны эрүүл мэндийг хянадаг. Суурь платформд үйлчилгээг хянах боломжийг олгохын тулд Spring хөгжүүлэгчид ихэвчлэн өөрчлөн тохируулсан HealthIndicator болон Spring Boot Actuator ашигладаг. Quarkus-д үүнийг MicroProfile Health ашиглан хийж болох бөгөөд энэ нь анхдагчаар амьд байдлын шалгалт хийдэг боловч амьд байдал болон бэлэн байдлыг нэгэн зэрэг шалгахаар тохируулж болно. Дэмжигдсэн MicroProfile Health API-г хэрхэн ашиглах жишээг Хүснэгт 6-д өгсөн бөгөөд нэмэлт мэдээллийг Quarkus гарын авлагад өгсөн болно. Эрүүл мэндийн гарын авлага.

Хүснэгт 6: Дэмжигдсэн MicroProfile Health API-ийн хэрэглээний жишээ.

MicroProfile эрүүл мэндийн онцлог
Тайлбар
жишээ

@Амьдрал

Платформ нь бүтэлгүйтсэн контейнержүүлсэн програмуудыг дахин ачаалдаг
Төгсгөлийн цэг:
хост:8080/эрүүл мэнд/амьд

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

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

@Бэлэн байдал

Платформ нь бэлэн биш бол контейнержүүлсэн програмууд руу траффик илгээхгүй
Төгсгөлийн цэг:
хост:8080/эрүүл мэнд/бэлэн

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

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

Хэмжигдэхүүн

Аппликейшн нь үйл ажиллагааны зорилгоор (гүйцэтгэлийн SLA-г хянах) эсвэл үйл ажиллагааны бус зорилгоор (бизнесийн SLA) хэмжүүрээр хангадаг. Хаврын хөгжүүлэгчид Spring Boot Actuator болон Micrometer ашиглан хэмжүүрүүдийг өгдөг. Хариуд нь Quarkus нь MicroProfile хэмжигдэхүүнийг ашиглан суурь үзүүлэлтүүд (JVM ба үйлдлийн систем), борлуулагчийн хэмжүүрүүд (Quarkus) болон хэрэглээний хэмжүүрүүдийг хангадаг. MicroProfile Metrics нь хэрэгжилт нь JSON болон OpenMetrics (Prometheus) гаралтын форматыг дэмждэг байхыг шаарддаг. MicroProfile Metrics API ашиглах жишээг Хүснэгт 7-д үзүүлэв.

В бидний жишээнээс төсөл MicroProfile хэмжигдэхүүнийг програмын хэмжүүрээр хангахад ашигладаг. Дэлгэрэнгүй мэдээллийг Quarkus гарын авлагаас үзнэ үү Метрикийн гарын авлага.

Хүснэгт 7. MicroProfile Metrics API ашиглах жишээ.

Microprofile хэмжигдэхүүнүүдийн онцлогууд
Тайлбар
жишээ

@Тоолсон

Тайлбартай объектыг хэдэн удаа дуудсаныг тоолох тоолуурыг заана

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

@ConcurrentGauge

Тэмдэглэгээтэй объект руу залгасан дуудлагын тоог тоолох хэмжигчийг заана

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

@ хэмжигч

Тайлбартай объектын утгыг хэмждэг хэмжигч мэдрэгчийг заана

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

@Хэмжээтэй

Тайлбартай объектын дуудлагын давтамжийг хянадаг тоолуурын мэдрэгчийг заана

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

СИ

Метрик оруулах эсвэл гаргах хүсэлтийг хүлээн авах үед мета өгөгдлийн талаарх мэдээллийг агуулсан тэмдэглэгээ

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

Хугацаа нь дууссан

Тайлбартай объектын үргэлжлэх хугацааг хянадаг таймерыг заана

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

Метрикийн төгсгөлийн цэгүүд

Хэрэглээний хэмжүүр тестлээрэй:8080/метрик/програм
Үндсэн хэмжүүрүүд тестлээрэй:8080/метрик/суурь
Борлуулагчийн хэмжүүр тестлээрэй:8080/метрик/борлуулагч
Бүх хэмжүүрүүд тестлээрэй:8080/метр

MicroProfile Rest Client

Бичил үйлчилгээнүүд нь ихэвчлэн RESTful төгсгөлийн цэгүүдээр хангадаг бөгөөд тэдгээртэй ажиллахад холбогдох клиент API-г шаарддаг. RESTful төгсгөлийн цэгүүдийг ашиглахын тулд Spring хөгжүүлэгчид ихэвчлэн RestTemplate ашигладаг. Quarkus энэ асуудлыг шийдэхийн тулд MicroProfile Rest Client API-г санал болгодог бөгөөд тэдгээрийн хэрэглээний жишээг 8-р хүснэгтэд үзүүлэв.

В бидний жишээнээс төсөл RESTful төгсгөлийн цэгүүдийг ашиглах нь MicroProfile Rest Client ашиглан хийгддэг. Энэ сэдвээр дэлгэрэнгүй мэдээлэл, жишээг Quarkus гарын авлагаас олж болно Амрах үйлчлүүлэгчийн гарын авлага.

Хүснэгт 8. MicroProfile Rest Client API ашиглах жишээ.

MicroProfile Rest Client-ийн онцлогууд
Тайлбар
жишээ

@RegisterRestClient

Бичсэн Java интерфейсийг REST клиент болгон бүртгэнэ

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

@RestClient

Бичсэн REST клиент интерфэйсийн жишээний хэрэгжилтийг тэмдэглэнэ

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

Уучлалт

REST төгсгөлийн цэгийг дууддаг

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

mp-rest/url

REST төгсгөлийн цэгийг зааж өгнө

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

Үр дүн

Хаврын хөгжүүлэгчдэд зориулсан энэ блогт бид Java микро үйлчилгээг хөгжүүлэхийн тулд Spring API-уудыг Кваркус дахь MicroProfile API-тай хэрхэн ашиглах, дараа нь тэдгээрийг олон зуун мегабайт RAM хэмнэж, үндсэн хоёртын код болгон хөрвүүлэх талаар хурдан харлаа. миллисекундын асуудал.

Та аль хэдийн ойлгосноор Spring болон MicroProfile API-ийн дэмжлэгийн талаарх дэлгэрэнгүй мэдээлэл болон бусад олон хэрэгтэй мэдээллийг эндээс авах боломжтой. Quarkus гарын авлага.

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх