Quarkus MicroProfile және Spring қалай біріктіреді

Барлығына сәлем, міне, Quarkus сериясының үшінші жазбасы!

Quarkus MicroProfile және Spring қалай біріктіреді

Java микросервистерін жасау кезінде жиі солай деп есептейді Eclipse MicroProfile и Көктемгі етік бөлек және тәуелсіз API болып табылады. Әдепкі бойынша, бағдарламашылар бұрыннан үйренген API интерфейстерін пайдаланады, өйткені жаңа фреймворктарды және орындалу уақыты компоненттерін үйрену көп уақытты алады. Бүгін біз кейбір танымалдардың дамуын жеңілдетуге тырысамыз Spring әзірлеушілеріне арналған 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 МБ жедел жадты (RSS) алады. Оның үстіне, оның компиляциясының өзі бір ғана пәрменмен орындалады: mvn package -Pnative.

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

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

Бұл мақаланы қарапайым ету үшін біз мұнда қолдаудың жоғары деңгейлі аспектілерін ғана қарастырамыз. Kubernetes, себебі түсіну маңызды. Quarkus Kubernetes үшін Java стегі ретінде орналастырылған, ол жадты тұтынуды және Java қолданбалары мен қызметтерін іске қосу уақытын азайтуға және нәтижесінде олардың хосттағы тығыздығын арттыруға және жалпы шығындарды азайтуға арналған.

Кваркус та автоматты жасауды қолдайды Kubernetes ресурстары мен ұсыныстары бағыттаушылар Kubernetes және Red Hat OpenShift платформаларында орналастыру үшін. Сонымен қатар, Quarkus контейнерлерді жасау үшін қажет Dockerfile.jvm (JVM бумасы) және Dockerfile.native (жергілікті екілік бума) файлдарын автоматты түрде жасайды.

Ақырында, Kubernetes-ке мақсатты орналастыру ортасы ретінде назар аудара отырып, Quarkus ұқсас функционалдылық Kubernetes платформасының өзі деңгейінде жүзеге асырылатын жағдайларда Java құрылымдарын пайдаланбайды. 1-кестеде Kubernetes және Spring әзірлеушілері пайдаланатын типтік Java құрылымдары арасындағы функционалды сәйкестік картасы берілген.

Кесте 1. Java фреймворктері мен Кубернетес арасындағы функционалды сәйкестік картасы.

Функционалдық
Дәстүрлі көктемгі аяқ киім
Kubernetes

Қызметті табу
Eureka
DNS

Конфигурация
Spring Cloud Config
Карталарды/құпияларды конфигурациялау

Жүктемелерді теңестіру
Таспа (клиент жағы)
Қызмет, репликация контроллері (сервер жағы)

Мысалдағы кодты құрастыру және іске қосу

Бұл мақалада біз сілтеме жасаймыз мысал жоба, мұнда Spring және MicroProfile API интерфейстері және тіпті бірдей Java класы бірге пайдаланылады. Бұл мысалдағы кодты пәрмен жолынан құрастыруға және іске қосуға болады, мәліметтер үшін README.md файлын қараңыз.

Spring Framework API интерфейстері

Тәуелділікке қарсы инъекция

Quarkus ауқымын қолдайды Мәтінмәндер және тәуелділікті енгізу (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 интерфейстерін пайдалану мысалдары.

Қолдау көрсетілетін Spring DI мүмкіндіктері
мысалдар

Конструктор инъекциясы

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

Далалық инъекция
Автоматты сым
құн

@Autowired
@RestClient
SalutationRestClient salutationRestClient;

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

бұршақ
@Конфигурация

@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 күту ORM көмегімен JPA қолдайтынын бағалайды. Көктем әзірлеушілері үшін де жақсы жаңалық бар: Quarkus жалпы Spring Data JPA аннотациялары мен түрлерін қолдайды. Қолдау көрсетілетін Spring Data JPA API интерфейстерін пайдалану мысалдары 4-кестеде берілген.
В біздің мысалдағы жоба Spring Data JPA API интерфейстері пайдаланылады және қосымша ақпаратты Quarkus оқулығында алуға болады Көктемгі деректер JPA нұсқаулығы.

Кесте 4. Қолдау көрсетілетін Spring Data JPA API интерфейстерін пайдалану мысалдары.

Қолдау көрсетілетін Spring Data 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 ұзақ уақыт бойы жаңартылмады, бірақ MicroProfile ақауларына төзімділік қазір белсенді түрде дамып келеді және оның артында бірнеше жыл өндірістік пайдалану бар. Сондықтан, Quarkus қызметтерінің сенімділігін арттыру үшін мысалдары 5-кестеде қолданылған MicroProfile Fault Tolerance API интерфейсін пайдалану ұсынылады. Бұл туралы қосымша ақпаратты Quarkus нұсқаулығынан қараңыз. Ақауларға төзімділік нұсқаулығы.

Кесте 5. Қолдау көрсетілетін MicroProfile ақауларға төзімділік API интерфейстерін пайдалану мысалдары.

Microprofile ақауларға төзімділік мүмкіндіктері
сипаттамасы
мысалдар

@Асинхронды

Логиканы бөлек ағында орындау

@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(); //...
}

@Кері шегіну

Сәтсіздік жағдайында балама логиканы шақыру

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

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

Retry

Сұраныс орындалмаған жағдайда қайталап көріңіз

@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 Health мүмкіндіктері
сипаттамасы
мысалдар

@Тірілік

Платформа сәтсіз контейнерлік қолданбаларды қайта жүктейді
Соңғы нүкте:
хост: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();  
}

Көрсеткіштер

Қолданбалар операциялық мақсаттарға (өнімділік SLAs бақылау үшін) немесе операциялық емес мақсаттарға (бизнес SLAs) көрсеткіштерді береді. Көктем әзірлеушілері Spring Boot Actuator және Micrometer көмегімен көрсеткіштерді қамтамасыз етеді. Өз кезегінде, Quarkus негізгі көрсеткіштерді (JVM және операциялық жүйе), жеткізуші көрсеткіштерін (Quarkus) және қолданба көрсеткіштерін қамтамасыз ету үшін MicroProfile Metrics пайдаланады. 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;
}

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

Көрсеткіштердің соңғы нүктелері

Қолданба көрсеткіштері жергілікті:8080/метрика/қолданба
Негізгі көрсеткіштер жергілікті:8080/метрика/негіз
Жеткізушінің көрсеткіштері жергілікті:8080/метрика/өндіруші
Барлық көрсеткіштер жергілікті:8080/метрика

MicroProfile Rest Client

Микросервистер жиі жұмыс істеу үшін сәйкес клиенттік API интерфейстерін қажет ететін RESTful соңғы нүктелерін қамтамасыз етеді. 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

Нәтижелері

Негізінен Spring әзірлеушілеріне бағытталған бұл блогта біз Java микросервистерін әзірлеу үшін Quarkus қаласындағы MicroProfile API интерфейстерімен Spring API интерфейстерін қалай пайдалану керектігін жылдам қарастырдық, содан кейін оларды жүздеген мегабайт жедел жадты үнемдейтін және іске қосатын жергілікті екілік кодқа құрастырдық. миллисекундтар мәселесі.

Түсінгеніңіздей, Spring және MicroProfile API интерфейстерін қолдау туралы қосымша ақпаратты, сондай-ақ басқа да көптеген пайдалы ақпаратты мына жерден табуға болады. Кваркус нұсқаулықтары.

Ақпарат көзі: www.habr.com

пікір қалдыру