Кантип Quarkus MicroProfile жана Spring айкалыштырат

Баарыңарга салам, бул жерде Quarkus сериясындагы үчүнчү билдирүү!

Кантип Quarkus MicroProfile жана Spring айкалыштырат

Java микросервистерин иштеп чыгууда, көбүнчө деп ишенишет Eclipse MicroProfile и Жазгы жүктөө өзүнчө жана көз карандысыз API болуп саналат. Демейки боюнча, программисттер көнүп калган API'лерди колдонушат, анткени жаңы алкактарды жана иштөө убактысынын компоненттерин үйрөнүү көп убакытты талап кылат. Бүгүн биз кээ бир популярдуу иштеп жөнөкөйлөтүү үчүн аракет кылат Жазгы иштеп чыгуучулар үчүн MicroProfile API жана бир эле учурда Spring API жана жаңы пайдалуу функцияларды кантип колдонууну көрсөтөт кваркус.

Бир аз майда-чүйдөсүнө чейин, биз алгач жазгы иштеп чыгуучуларга MicroProfile APIди күнүмдүк иштеринде кантип колдонууну көрсөтүү үчүн Quarkus жазгы API'лерди кантип колдой тургандыгынын масштабын жана чоо-жайын карап чыгабыз. Андан кийин биз микросервистерди түзүүдө Spring иштеп чыгуучулары үчүн пайдалуу болгон MicroProfile API'лерин карайбыз.

Эмне үчүн Quarkus? Биринчиден, бул жандуу коддоо, башкача айтканда, MicroProfile API, Spring API жана башка Java API'лериндеги бардык өзгөртүүлөрдү автоматтык түрдө кайра жүктөө, ал бир гана буйрук менен аткарылат: mvn quarkus:dev. Экинчиден, каралат биздин мисалда Person кызматы (Spring, MicroProfile жана JPA API'лерден экиликке түзүлөт, жергиликтүү GraalVM сүрөтүн колдонуу менен) 0.055 секундада башталат жана RESTful тиркемесинин акыркы чекитинде болжол менен 90 МБ оперативдүү эстутумду (RSS) ээлейт. Анын үстүнө, анын компиляциясы бир гана буйрук менен аткарылат: mvn package -Pnative.

Биз MicroProfile жөнүндө майда-чүйдөсүнө чейин кирбейбиз, жазгы иштеп чыгуучуларга Spring API'лерин Quarkusдагы MicroProfile API'лери менен кантип колдонсо болорун түшүнүүгө жардам берүүдөн башка.

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

Бул макаланы жөнөкөй сактоо үчүн, биз бул жерде колдоонун жогорку деңгээлдеги аспектилерин гана карайбыз. Kubernetes, анткени аны түшүнүү маанилүү. Quarkus Kubernetes үчүн Java стек катары жайгаштырылган, ал эстутум керектөөсүн жана Java тиркемелерин жана кызматтарын баштоо убактысын азайтуу үчүн иштелип чыккан, натыйжада алардын хосттогу тыгыздыгын жогорулатып, жалпы чыгымдарды азайтат.

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

Акыр-аягы, Kubernetes'ке максаттуу жайылтуу чөйрөсү катары көңүл буруу менен, Quarkus Java алкактарын ушундай функциялар Kubernetes платформасынын деңгээлинде ишке ашырылган учурларда колдонбойт. 1-таблица Kubernetes менен Spring иштеп чыгуучулары колдонгон типтүү Java алкактарынын ортосундагы функционалдык кат алышуунун картасын берет.

Таблица 1. Java алкактары менен Kubernetes ортосундагы функционалдык кат алышуунун картасы.

иш
Салттуу жазгы бут кийим
Kubernetes

Кызматтын ачылышы
Eureka
DNS

тарам орнотуусу
Жазгы Cloud Config
Карталарды/Сырларды конфигурациялоо

груз салмак
Тасма (кардар тарап)
Кызмат, репликация контроллери (сервер тарабы)

Мисалдан кодду түзүү жана иштетүү

Бул макалада биз кайрылабыз мисалы долбоор, бул жерде Spring жана MicroProfile API'лери жана ал тургай бир эле Java классы чогуу колдонулат. Бул мисалдагы кодду компиляциялоого жана буйрук сабынан иштетүүгө болот, чоо-жайы үчүн README.md файлын караңыз.

Spring Framework API'лери

Көз карандылыкты саюу

Quarkus бир катар колдойт Контексттер жана Көз карандылык Injection (CDI) API'лери жана Spring Dependency Injection (Spring DI) API'лери. Эгер сиз MicroProfile менен иштеп жатсаңыз, Java EE жана Жакарта EE, анда сиз CDI менен мурунтан эле таанышсыз. Башка жагынан алганда, Spring иштеп чыгуучулар Spring DI менен шайкеш келүү үчүн Spring DI API үчүн Quarkus кеңейтүүсүн колдоно алышат. Колдоого алынган Spring DI APIлерди колдонуу мисалдары 2-таблицада келтирилген.

В биздин мисалдан долбоор CDI жана жазгы көз карандылык инъекциясын колдонот. Бул тема боюнча көбүрөөк маалымат жана мисалдар үчүн 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;

буурчак
@Configuration

@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 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 API'лери

Ката толеранттуулук

Каталарга чыдамдуулук конструкциялары каскаддык каталарды алдын алуу жана ишенимдүү микросервис архитектураларын түзүү үчүн абдан маанилүү. Жазгы иштеп чыгуучулар көп жылдар бою каталарга чыдамдуулук үчүн автоматтык өчүргүчтөрдү колдонуп келишет. Hystrix. Бирок, Hystrix көптөн бери жаңыртылган эмес, бирок MicroProfile'тин катачылыкка чыдамкайлыгы азыр жигердүү өнүгүп жатат жана анын артында бир нече жылдык өндүрүш бар. Ошондуктан, Quarkus кызматтарынын ишенимдүүлүгүн жогорулатуу үчүн MicroProfile Fault Tolerance API'лерин колдонуу сунушталат, алардын мисалдары 5-таблицада колдонулган. Бул боюнча көбүрөөк маалымат алуу үчүн Quarkus колдонмосун караңыз. Мүчүлүштүккө чыдамдуулук колдонмосу.

Таблица 5. Колдоого алынган MicroProfile Hata Tolerance API'лерин колдонуу мисалдары.

MicroProfile катачылыктарга чыдамдуулук өзгөчөлүктөрү
баяндоо
мисалдар

@Asynchronous

Логиканы өзүнчө жипте аткаруу

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

@Bulkhead

Бир убактагы сурамдардын санын чектөө

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

@CircuitBreaker

Акылдуу каталарды башкаруу жана каталардан калыбына келтирүү

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

@Fallback

Ийгиликсиз болгон учурда альтернативалуу логиканы чакыруу

@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 платформалары атайын кызматтардын жардамы менен контейнерлердин ден соолугун көзөмөлдөйт. Негизги платформага кызматтарды көзөмөлдөөгө уруксат берүү үчүн, Жазды иштеп чыгуучулар адатта ыңгайлаштырылган HealthIndicator жана Spring Boot Actuator колдонушат. Кваркуста муну MicroProfile Health аркылуу жасоого болот, ал демейки боюнча жандуулукту текшерет, бирок бир эле учурда жандуулукту жана даярдуулукту текшерүү үчүн конфигурацияланса болот. Колдоого алынган MicroProfile Health API'лерин кантип колдонуунун мисалдары 6-таблицада берилген жана кошумча маалымат Quarkus колдонмосунда берилген. Ден соолук боюнча колдонмо.

Таблица 6: Колдоого алынган MicroProfile Health API'лерин колдонуу мисалдары.

MicroProfile Health өзгөчөлүктөрү
баяндоо
мисалдар

@Liveness

Платформа ишке ашпай калган контейнердик колдонмолорду кайра жүктөйт
Акыркы чекит:
хост: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ларды көзөмөлдөө үчүн) же операциялык эмес максаттарда (бизнес SLAs) көрсөткүчтөрдү берет. Жазгы иштеп чыгуучулар Spring Boot Actuator жана Micrometer аркылуу көрсөткүчтөрдү беришет. Өз кезегинде, Quarkus базалык көрсөткүчтөрдү (JVM жана операциялык тутум), сатуучу көрсөткүчтөрүн (Quarkus) жана колдонмо көрсөткүчтөрүн камсыз кылуу үчүн MicroProfile Metrics колдонот. MicroProfile Metrics ишке ашыруу JSON жана OpenMetrics (Prometheus) чыгаруу форматтарын колдоону талап кылат. MicroProfile Metrics API колдонуу мисалдары 7-таблицада келтирилген.

В биздин мисалдан долбоор MicroProfile Metrics колдонмо көрсөткүчтөрүн камсыз кылуу үчүн колдонулат. Көбүрөөк маалымат алуу үчүн, Quarkus колдонмосун караңыз Metrics Guide.

Таблица 7. MicroProfile Metrics API'лерин колдонуу мисалдары.

MicroProfile Metrics өзгөчөлүктөрү
баяндоо
мисалдар

@counted

Аннотацияланган объект канча жолу чакырылганын эсептеген эсептегичти билдирет

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

@Gauge

Аннотацияланган объекттин маанисин өлчөөчү ченегич сенсорду билдирет

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

@Metered

Аннотацияланган объекттин чалуу жыштыгын көзөмөлдөгөн эсептегич сенсорду билдирет

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

Metrics Endpoints

Колдонмо көрсөткүчтөрү көрүү .xrf:8080/metrics/application
Негизги көрсөткүчтөр көрүү .xrf:8080/метрика/база
Сатуучунун көрсөткүчтөрү көрүү .xrf:8080/metrics/vendor
Бардык көрсөткүчтөр көрүү .xrf:8080/metrics

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;

Invocation

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'лери менен кантип колдонууну карап чыктык, андан кийин аларды жүздөгөн мегабайт оперативдик эстутумду үнөмдөөчү жана ишке киргизген жергиликтүү экилик кодго компиляцияладык. миллисекунд маселеси.

Сиз буга чейин эле түшүнгөндөй, Spring жана MicroProfile API'лерди колдоо жөнүндө көбүрөөк маалыматты, ошондой эле башка көптөгөн пайдалуу маалыматты төмөнкү жерден тапса болот. Quarkus колдонмолору.

Source: www.habr.com

Комментарий кошуу