Чӣ тавр Quarkus MicroProfile ва Springро муттаҳид мекунад

Салом ба ҳама, инак мақолаи сеюм дар силсилаи Quarkus!

Чӣ тавр Quarkus MicroProfile ва Springро муттаҳид мекунад

Ҳангоми таҳияи микросервисҳои Java, аксар вақт чунин мешуморанд Eclipse MicroProfile и Мӯзаи баҳорӣ API-ҳои алоҳида ва мустақил мебошанд. Бо нобаёнӣ, барномасозон одатан API-ҳои ба онҳо одаткардаро истифода мебаранд, зеро омӯхтани чаҳорчӯбаҳои нав ва ҷузъҳои вақти корӣ вақти зиёдро мегирад. Имрӯз мо кӯшиш мекунем, ки рушди баъзе маъмулро содда кунем MicroProfile API барои таҳиягарони Spring ва ба шумо нишон диҳед, ки чӣ тавр дар як вақт истифода бурдани Spring API ва хусусиятҳои нави муфид Кваркус.

Дар тафсилоти каме, мо аввал ба миқёс ва тафсилоти он, ки Quarkus API-ҳои Spring-ро дастгирӣ мекунад, дида мебароем, то ба таҳиягарони Spring чӣ гуна истифода бурдани MicroProfile API-ро дар кори ҳаррӯзаи худ нишон диҳанд. Сипас, мо API-ҳои MicroProfile-ро фаро мегирем, ки барои таҳиягарони баҳор ҳангоми эҷоди хидматҳои хурд муфиданд.

Чаро Quarkus? Аввалан, ин рамзгузории зинда аст, яъне дубора боркунии автоматии ҳама гуна тағирот дар MicroProfile API, Spring API ва дигар API-ҳои Java, ки танҳо бо як фармон иҷро мешавад: mvn quarkus:dev. Дуюм, дар дар мисоли мо хидмати Person (ки аз API-ҳои Spring, MicroProfile ва JPA ба дуӣ бо истифода аз тасвири аслии GraalVM тартиб медиҳад) ҳамагӣ дар 0.055 сония оғоз мешавад ва тақрибан 90 МБ RAM (RSS) дар нуқтаи ниҳоии барномаи RESTful мегирад. Ғайр аз он, худи тартиб додани он танҳо бо як фармон иҷро карда мешавад: mvn package -Pnative.

Мо дар бораи MicroProfile тафсилот намедиҳем, ба ғайр аз он ки ба таҳиягарони Spring дар фаҳманд, ки чӣ гуна онҳо метавонанд API-ҳои Spring-ро бо API-ҳои MicroProfile дар Quarkus истифода баранд.

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

Барои содда нигоҳ доштани ин мақола, мо дар ин ҷо танҳо ҷанбаҳои сатҳи баланди дастгирӣро фаро мегирем. Кубернитель, зеро фаҳмидани он муҳим аст. Quarkus ҳамчун як стек Java барои Kubernetes ҷойгир шудааст, он барои кам кардани истеъмоли хотира ва вақти оғозёбии барномаҳо ва хидматҳои Java пешбинӣ шудааст ва дар натиҷа зичии онҳо дар мизбон зиёд ва хароҷоти умумӣ кам карда мешавад.

Кваркус низ тавлиди худкорро дастгирӣ мекунад Захираҳо ва пешниҳодҳои Kubernetes дастурҳо барои ҷойгиркунӣ дар платформаҳои Kubernetes ва Red Hat OpenShift. Илова бар ин, Quarkus ба таври худкор файлҳои Dockerfile.jvm (бастаи JVM) ва Dockerfile.native (бастаи дуӣ модарӣ)-ро тавлид мекунад, ки барои сохтани контейнерҳо лозиманд.

Ниҳоят, бо таваҷҷӯҳ ба Kubernetes ҳамчун муҳити ҷойгиркунии ҳадаф, Quarkus чаҳорчӯбаи Java-ро дар ҳолатҳое истифода намебарад, ки функсияҳои шабеҳ дар сатҳи худи платформаи Kubernetes амалӣ карда мешаванд. Ҷадвали 1 харитаи мукотибаи функсионалии байни Kubernetes ва чаҳорчӯбаҳои маъмулии Java, ки аз ҷониби таҳиягарони Spring истифода мешаванд, оварда шудааст.

Ҷадвали 1. Харитаи мукотибаи функсионалӣ байни чаҳорчӯбаҳои Java ва Kubernetes.

Функсияҳо
Пойгоҳи анъанавии баҳорӣ
Кубернитель

Кашфи хидмат
Eureka
DNS

Танзимот
Конфигуратсияи абрии баҳор
Танзимоти харитаҳо/сирҳо

Мувозинати бори
Лента (тарафи мизоҷ)
Хидмат, Назоратчии такрорӣ (тарафи сервер)

Тартиб додан ва иҷро кардани код аз мисол

Дар ин мақола мо ба он муроҷиат мекунем лоиҳаи намунавӣ, ки дар он API-ҳои Spring ва MicroProfile ва ҳатто ҳамон синфи Java якҷоя истифода мешаванд. Рамзи ин мисолро метавон аз сатри фармон тартиб дод ва иҷро кард, барои тафсилот ба файли README.md нигаред.

API-ҳои Spring Framework

Тазриқи вобастагӣ

Quarkus як қатор дастгирӣ мекунад API-ҳои контекстҳо ва тазриқи вобастагӣ (CDI). ва APIs баҳор вобастагии тазриќї (Spring DI). Агар шумо бо MicroProfile кор карда истода бошед, Java EE ва Ҷакарта EE, пас шумо аллакай бо CDI хеле шинос ҳастед. Аз тарафи дигар, таҳиягарони Spring метавонанд Extension Quarkus-ро барои Spring DI API истифода баранд, то мутобиқат бо Spring DI. Намунаҳои истифодаи API-ҳои Spring DI-и дастгирӣшаванда дар ҷадвали 2 оварда шудаанд.

В лоиҳа аз мисоли мо Ҳам CDI ва ҳам тазриқи вобастагии баҳорро истифода мебарад. Барои маълумоти бештар ва мисолҳо дар ин мавзӯъ, ба дастури Quarkus нигаред Дастури баҳори DI.

Ҷадвали 2. Намунаҳои истифодаи API-ҳои Spring DI дастгирӣшаванда.

Хусусиятҳои дастгирии 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

@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 истифода баранд. Намунаҳои тарзи истифодаи API-ҳои Spring Web API дар ҷадвали 3 оварда шудаанд ва маълумоти бештар ва мисолҳоро дар ин мавзӯъ дар дарси Quarkus пайдо кардан мумкин аст. Дастури веб баҳор.

Љадвали 3. Намунањои истифодаи API-њои Spring Web-и дастгиришаванда.

Хусусиятҳои веби баҳори дастгирӣшаванда
намунаи

@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 JPA-ро бо истифода аз Hibernate ORM дастгирӣ мекунад. Инчунин барои таҳиягарони баҳор хабари хуш ҳаст: Quarkus шарҳҳо ва намудҳои маъмулии Spring Data JPA -ро дастгирӣ мекунад. Намунаҳои истифодаи API-ҳои Spring Data JPA дастгирӣшаванда дар ҷадвали 4 оварда шудаанд.
В лоиҳа аз мисоли мо API-ҳои Spring Data JPA истифода мешаванд ва маълумоти бештар дар дастури Quarkus дастрас аст Дастури баҳор маълумот JPA.

Ҷадвали 4. Намунаҳои истифодаи API-ҳои Spring Data JPA дастгирӣшаванда.

Хусусиятҳои дастгирии Spring Data JPA
намунаи

CrudRepository

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

Почтаи электронӣ
JpaRepository
Репозиторий PagingAndSorting

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

API-ҳои MicroProfile

Таҳаммулпазирии хатогиҳо

Сохторҳои таҳаммулпазирии хатогиҳо барои пешгирии нокомиҳои каскадӣ ва эҷоди меъмории боэътимоди хидматрасонии хурд хеле муҳиманд. Таҳиягарони баҳор солҳои тӯлонӣ барои таҳаммулпазирӣ ба хатогиҳо аз дастгоҳҳои барқӣ истифода мебаранд. Hystrix. Бо вуҷуди ин, Hystrix муддати тӯлонӣ нав карда нашудааст, аммо таҳаммулпазирии хатогиҳои MicroProfile ҳоло фаъолона рушд мекунад ва дар паси он якчанд сол истифодаи истеҳсолӣ дорад. Аз ин рӯ, барои баланд бардоштани эътимоднокии хидматҳо дар Кваркус тавсия дода мешавад, ки API-ҳои MicroProfile Fault Tolerance API-ро истифода баред, ки намунаҳои онҳо дар ҷадвали 5 истифода шудаанд. Барои маълумоти бештар дар бораи ин, ба дастури Quarkus нигаред. Роҳнамои таҳаммулпазирии хатогиҳо.

Ҷадвали 5. Намунаҳои истифодаи API-ҳои таҳаммулпазирии хатогиҳои MicroProfile дастгирӣшаванда.

Хусусиятҳои таҳаммулпазирии хатогиҳои 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(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 анҷом додан мумкин аст, ки он ба таври нобаёнӣ санҷиши зиндаро анҷом медиҳад, аммо метавонад барои ҳамзамон санҷиши зиндашавӣ ва омодагӣ танзим карда шавад. Намунаҳои тарзи истифодаи API-ҳои дастгирӣшавандаи MicroProfile Health дар ҷадвали 6 оварда шудаанд ва маълумоти иловагӣ дар дастури Quarkus оварда шудаанд. Дастури саломатӣ.

Ҷадвали 6: Намунаҳои истифодаи API-ҳои MicroProfile Health дастгирӣшаванда.

Хусусиятҳои Health 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 Metrics MicroProfile-ро барои таъмин намудани ченакҳои асосӣ (JVM ва системаи амалиётӣ), ченакҳои фурӯшанда (Quarkus) ва ченакҳои барнома истифода мебарад. MicroProfile Metrics талаб мекунад, ки татбиқ форматҳои баромади JSON ва OpenMetrics (Prometheus) -ро дастгирӣ кунад. Намунаҳои истифодаи MicroProfile Metrics API дар ҷадвали 7 оварда шудаанд.

В лоиҳа аз мисоли мо Метрикҳои MicroProfile барои таъмини ченакҳои барнома истифода мешаванд. Барои маълумоти иловагӣ, ба дастури Quarkus нигаред Дастури метрика.

Ҷадвали 7. Намунаҳои истифодаи API-ҳои MicroProfile Metrics.

Хусусиятҳои метрикаи 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;
}

Нуқтаҳои ниҳоӣ

Метрикҳои татбиқ localhost:8080/метрика/барнома
Метрикҳои асосӣ localhost:8080/метрика/база
Нишондиҳандаҳои фурӯшанда localhost:8080/метрика/фурӯшанда
Ҳама нишондиҳандаҳо localhost: 8080/метрика

Мизоҷи MicroProfile Rest

Микросервисҳо аксар вақт нуқтаҳои ниҳоии RESTful пешниҳод мекунанд, ки барои кор бо API-ҳои мувофиқи муштарӣ талаб мекунанд. Барои истифодаи нуқтаи ниҳоӣ RESTful, таҳиягарони Spring маъмулан RestTemplate -ро истифода мебаранд. Quarkus барои ҳалли ин мушкилот API-ҳои MicroProfile Rest Client-ро пешниҳод мекунад, ки намунаҳои истифодаи онҳо дар ҷадвали 8 оварда шудаанд.

В лоиҳа аз мисоли мо истифодаи нуқтаҳои ниҳоӣ RESTful бо истифода аз MicroProfile Rest Client анҷом дода мешавад. Маълумоти бештар ва мисолҳоро дар ин мавзӯъ дар дастури Quarkus пайдо кардан мумкин аст Дастури муштариёни истироҳат.

Ҷадвали 8. Намунаҳои истифодаи API-ҳои MicroProfile Rest Client.

Хусусиятҳои Client Rest MicroProfile
Шарҳи
намунаи

@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

Натиҷаҳо

Дар ин блог, ки асосан ба таҳиягарони баҳор нигаронида шудааст, мо зуд дида баромадем, ки чӣ тавр истифода бурдани API-ҳои Spring бо API-ҳои MicroProfile дар Кваркус барои таҳияи микросервисҳои Java ва сипас онҳоро ба коди дуии модарӣ, ки садҳо мегабайт RAM-ро сарфа мекунад ва дар он оғоз мекунад, тартиб дод. як масъалаи миллисония.

Тавре ки шумо аллакай фаҳмидед, маълумоти бештарро дар бораи дастгирии API-ҳои Spring ва MicroProfile ва инчунин бисёр дигар маълумоти муфидро дар ин саҳифа пайдо кардан мумкин аст. Дастурҳои Quarkus.

Манбаъ: will.com

Илова Эзоҳ