{"id":79987,"date":"2020-05-02T01:42:42","date_gmt":"2020-05-01T23:42:42","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/kak-quarkus-obedinyaet-microprofile-i-spring"},"modified":"2020-05-02T01:42:42","modified_gmt":"2020-05-01T23:42:42","slug":"kak-quarkus-obedinyaet-microprofile-i-spring","status":"publish","type":"post","link":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/kak-quarkus-obedinyaet-microprofile-i-spring","title":{"rendered":"Kuidas Quarkus \u00fchendab MicroProfile'i ja Springi","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Tere k\u00f5igile, ja see on kolmas postitus Quarkuse seeriast!<\/p>\n<p><img decoding=\"async\" alt=\"Kuidas Quarkus \u00fchendab MicroProfile&#039;i ja Springi\" src=\"\/wp-content\/uploads\/2020\/05\/d98ff470b49f8de1fa488a6818160969.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nJava-mikroteenuste arendamisel arvatakse sageli, et <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/blog\/2019\/02\/28\/jumpstart-microservices-microprofile-starter-beta\/\">Eclipse MicroProfile<\/a><\/noindex> ja <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/topics\/spring-boot\/\">Spring Boot<\/a><\/noindex> on eraldi ja omavahel s\u00f5ltumatud API-d. \u00dcldiselt kasutavad arendajad neid API-sid, millega nad juba harjunud on, kuna uute raamistike ja runtime-komponentide \u00f5ppimine n\u00f5uab palju aega. T\u00e4na p\u00fc\u00fcame lihtsustada m\u00f5nede populaarsete <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/blog\/2018\/11\/21\/eclipse-microprofile-for-spring-boot-developers\/\">MicroProfile API-de omandamist Spring-arendajatele<\/a><\/noindex> ja n\u00e4itame, kuidas samal ajal kasutada Springi API-d ja uusi kasulikke v\u00f5imalusi. <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/\">Quarkus<\/a><\/noindex>.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nNatukene t\u00e4psemalt \u00f6eldes vaatame k\u00f5igepealt \u00fcle, kuidas Quarkus toetab Springi API-liideseid, et n\u00e4idata Springi arendajatele, kuidas saavad MicroProfile API-sid oma igap\u00e4evases t\u00f6\u00f6s rakendada. Siis r\u00e4\u00e4gime MicroProfile API-dest, mis on kasulikud Springi arendajatele mikroteenuste loomisel.<\/p>\n<p>Miks just Quarkus? Esiteks on see live coding, see t\u00e4hendab, et MicroProfile API, Spring API ja teiste Java API muutuste automaatne uuesti laadimine toimub \u00fche k\u00e4suga: mvn quarkus:dev. Teiseks, antud <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">n\u00e4ites<\/a><\/noindex> on Person teenus (mis kompileeritakse Springi, MicroProfile ja JPA API-dest binaarfailiks kasutades GraalVM-i natiivset pilti) k\u00e4ivitatav vaid 0.055 sekundi jooksul ja vajab umbes 90 MB m\u00e4lu (RSS) RESTful rakenduse l\u00f5pp-punktis. Samuti saab selle kompileerimise teha \u00fche k\u00e4suga: mvn package -Pnative.<\/p>\n<p>Me ei hakka MicroProfile'i \u00fcksikasjadesse s\u00fcvenema, vaid p\u00fc\u00fcame aidata Springi arendajatel m\u00f5ista, kuidas Quarkuses saab kasutada Springi API-sid koos MicroProfile API-dega.<\/p>\n<h3>Konteinerid ja Kubernetes<\/h3>\n<p>\nKuna ei tahaks seda artiklit \u00fcle koormata, vaatleme siin ainult k\u00f5rgtaseme aspekte. <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/developer-tools\/kubernetes\">Kubernetes<\/a><\/noindex>Kuna see on oluline m\u00f5ista. Quarkust positsioneeritakse Java-st\u00e4kina Kubernetesile, mille eesm\u00e4rk on minimeerida m\u00e4lukulu ja Java rakenduste ja teenuste k\u00e4ivitusaega, mis omakorda suurendab nende koha tihedust ja v\u00e4hendab \u00fcldkulusid.<\/p>\n<p>Quarkus toetab ka <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/kubernetes-resources\">automaatselt genereeritud<\/a><\/noindex> Kubernetes ressursse ja pakub <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/\">juhiseid<\/a><\/noindex> Kubernetes ja Red Hat OpenShift platvormidele juurutamiseks. Lisaks genereerib Quarkus automaatselt Dockerfile.jvm (JVM pakendamine) ja Dockerfile.native (natiivne binaarpakendamine) failid, mis on vajalikud konteinerite loomiseks.<\/p>\n<p>Ja l\u00f5puks, keskendudes Kubernetesile kui sihtkeskkonnale, ei kasuta Quarkus Java raamistikke olukordades, kus sarnane funktsionaalsus on rakendatud Kubernetes'i tasemel. Tabelis 1 on esitatud Kubernetes'i ja tavaliste Java raamistike, mida Spring arendajad kasutavad, funktsionaalne vastavuskaart.<\/p>\n<p><i>Tabel 1. Java raamistike ja Kubernetes'i funktsionaalse vastavuse kaart.<\/i><\/p>\n<p>Funktsionaalsus<br \/>\nTraditsiooniline Spring Boot<br \/>\nKubernetes<\/p>\n<p>Teenuse avastamine<br \/>\nEureka<br \/>\nDNS<\/p>\n<p>Seadistus<br \/>\nSpring Cloud Config<br \/>\nConfig Maps \/ Secrets<\/p>\n<p>Koormuse tasakaalustamine<br \/>\nRibbon (kliendi poolel)<br \/>\nTeenuse, replikatsioonikontroller (serveri poolel)<\/p>\n<p><\/p>\n<h3>Koodi kompileerimine ja k\u00e4ivitamine n\u00e4itest<\/h3>\n<p>\nSelles artiklis viitame <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">projektin\u00e4itele<\/a><\/noindex>, kus kasutatakse koos Springi ja MicroProfile'i API-sid ning isegi seda sama Java klassi. Selle n\u00e4ite koodi saab kompileerida ja k\u00e4ivitada k\u00e4surealt, lisainfot vt README.md failist.<\/p>\n<h3>Spring Framework'i API-d<\/h3>\n<p><\/p>\n<h4>S\u00f5ltuvuse s\u00fcstimine<\/h4>\n<p>\nQuarkus toetab mitmeid <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/cdi-reference\">Context and Dependency Injection (CDI) API-sid<\/a><\/noindex> ja Spring Dependency Injection (Spring DI) API-sid. Kui t\u00f6\u00f6tate MicroProfile'i, <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/blog\/2019\/09\/12\/jakarta-ee-8-the-new-era-of-java-ee-explained\/\">Java EE ja Jakarta EE<\/a><\/noindex>, siis olete juba CDI-ga h\u00e4sti tuttav. Teisest k\u00fcljest saavad Springi arendajad kasutada Quarkus Extension for Spring DI API, et tagada \u00fchilduvus Spring DI-ga. Toetatud Spring DI API-de kasutamise n\u00e4ited on esitatud tabelis 2.<\/p>\n<p>Uues <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">meie n\u00e4idisprojekti<\/a><\/noindex> kasutatakse nii CDI-d kui ka Spring Dependency Injection'i. Lisainfot ja n\u00e4iteid selle kohta leiate Quarkus'i juhendist, mille nimetus on <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/spring-di\">Spring DI Guide<\/a><\/noindex>.<\/p>\n<p><i>Tabel 2. N\u00e4ited toetatud Spring DI API-de kasutamisest.<\/i><\/p>\n<p>Toetatud Spring DI funktsioonid<br \/>\nN\u00e4ited<\/p>\n<p>Constructor Injection<\/p>\n<pre><code class=\"plaintext\">public PersonSpringController(\n   PersonSpringRepository personRepository,  \/\/ sisse injectitud\n   PersonSpringMPService personService) {    \/\/ sisse injectitud\n      this.personRepository = personRepository;\n      this.personService = personService;\n}\n<\/code><\/pre>\n<p>Field Injection<br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/autowired\/\" class=\"user_link\">Autowired<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/value\/\" class=\"user_link\">V\u00e4\u00e4rtus<\/a><\/noindex><\/p>\n<pre><code class=\"plaintext\">@Autowired\n@RestClient\nSalutationRestClient salutationRestClient;\n\n@Value(\"${fallbackSalutation}\")\nString fallbackSalutation;\n<\/code><\/pre>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/bean\/\" class=\"user_link\">Bean<\/a><\/noindex><br \/>\n@Configuration<\/p>\n<pre><code class=\"plaintext\">@Configuration\npublic class AppConfiguration {\n   @Bean(name = \"capitalizeFunction\")\n   public StringFunction capitalizer() {\n      return String::toUpperCase;\n   }\n}\n<\/code><\/pre>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/component\/\" class=\"user_link\">Component<\/a><\/noindex><\/p>\n<pre><code class=\"plaintext\">@Component(\"noopFunction\")\npublic class NoOpSingleStringFunction implements StringFunction {\n   @Override\n   public String apply(String s) {\n      return s;\n   }\n}\n<\/code><\/pre>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/service\/\" class=\"user_link\">Teenused<\/a><\/noindex><\/p>\n<pre><code class=\"plaintext\">@Service\npublic class MessageProducer {\n   @Value(\"${greeting.message}\")\n   String message;\n\n   public String getPrefix() {\n      return message;\n   }\n}\n<\/code><\/pre>\n<p><\/p>\n<h4>Veebiraamistik<\/h4>\n<p>\nMicroProfile'i kasutajatele meeldib, et Quarkus toetab JAX-RS-i, MicroProfile Rest Client-i, JSON-P-d ja JSON-B-d peamise veebiprogrammeerimise mudelina. Spring-i arendajatele tuleb r\u00f5\u00f5muna Quarkuse uus tugi Spring Web API-le, eriti REST-iga seotud liideste osas. Nagu Spring DI puhul, on Spring Web API toe peamine eesm\u00e4rk, et Spring-i arendajad saaksid kasutada Spring Web API-sid koos MicroProfile API-dega. Toetatud Spring Web API-de kasutamise n\u00e4ited on esitatud tabelis 3, samas kui lisainfot ja n\u00e4iteid selle teema kohta leiate Quarkuse juhendist, mille pealkiri on <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/spring-web\">Spring Web Guide<\/a><\/noindex>.<\/p>\n<p><i>Tabel 3. Toetatud Spring Web API-de kasutamise n\u00e4ited.<\/i><\/p>\n<p>Toetatud Spring Web omadused<br \/>\nN\u00e4ited<\/p>\n<p>@RestController<br \/>\n@RequestMapping<\/p>\n<pre><code class=\"plaintext\">@RestController\n@RequestMapping(\"\/person\")\npublic class PersonSpringController {\n   ...\n   ...\n   ...\n}\n<\/code><\/pre>\n<p>@GetMapping<br \/>\n@PostMapping<br \/>\n@PutMapping<br \/>\n@DeleteMapping<br \/>\n@PatchMapping<br \/>\n@RequestParam<br \/>\n@RequestHeader<br \/>\n@MatrixVariable<br \/>\n@PathVariable<br \/>\n@CookieValue<br \/>\n@RequestBody<br \/>\n@ResponseStatus<br \/>\n@ExceptionHandler<br \/>\n@RestControllerAdvice (osaline)<\/p>\n<pre><code class=\"plaintext\">@GetMapping(path = \"\/greet\/{id}\",\n   produces = \"text\/plain\")\n   public String greetPerson(\n   @PathVariable(name = \"id\") long id) {\n   ...\n   ...\n   ...\n}\n<\/code><\/pre>\n<p><\/p>\n<h4>Spring Data JPA<\/h4>\n<p>\nMicroProfile'i kasutajatele meeldib ka, et Quarkus toetab JPA-d, kasutades Hibernate ORM-i. Ka Spring-i arendajatele on h\u00e4id uudiseid: Quarkus toetab \u00fcldtunnustatud Spring Data JPA annotatsioone ja t\u00fc\u00fcpe. Toetatud Spring Data JPA API-de kasutamise n\u00e4ited on toodud tabelis 4.<br \/>\nUues <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">meie n\u00e4idisprojekti<\/a><\/noindex> kasutatakse Spring Data JPA API-sid, samas kui lisainformation on saadaval Quarkuse juhendis pealkirjaga <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/spring-data-jpa-guide\">Spring Data JPA Guide<\/a><\/noindex>.<\/p>\n<p><i>Tabel 4. Toetatud Spring Data JPA API-de kasutamise n\u00e4ited.<\/i><\/p>\n<p>Toetatud Spring Data JPA omadused<br \/>\nN\u00e4ited<\/p>\n<p>CrudRepository<\/p>\n<pre><code class=\"plaintext\">public interface PersonRepository\n         extends JpaRepository,\n                 PersonFragment {\n   ...\n}\n<\/code><\/pre>\n<p>Repository<br \/>\nJpaRepository<br \/>\nPagingAndSortingRepository<\/p>\n<pre><code class=\"plaintext\">public class PersonRepository extends \n\n    Repository {\n\n    Person save(Person entity);\n\n    Optional findById(Person entity);\n}\n<\/code><\/pre>\n<p>Repository Fragments<\/p>\n<pre><code class=\"plaintext\">public interface PersonRepository\n         extends JpaRepository,\n                 PersonFragment {\n   ...\n}\n<\/code><\/pre>\n<p>Derived query methods<\/p>\n<pre><code class=\"plaintext\">public interface PersonRepository extends CrudRepository {\n\n    List findByName(String name);\n    \n    Person findByNameBySsn(String ssn);\n    \n    Optional \n       findByNameBySsnIgnoreCase(String ssn);\n\n    Boolean existsBookByYearOfBirthBetween(\n            Integer start, Integer end);\n}\n<\/code><\/pre>\n<p>Kasutaja m\u00e4\u00e4ratud p\u00e4ringud<\/p>\n<pre><code class=\"plaintext\">public interface MovieRepository\n         extends CrudRepository {\n\n    Movie findFirstByOrderByDurationDesc();\n\n    @Query(\"select m from Movie m where m.rating = ?1\")\n    Iterator findByRating(String rating);\n\n    @Query(\"from Movie where title = ?1\")\n    Movie findByTitle(String title);\n}\n<\/code><\/pre>\n<p><\/p>\n<h3>MicroProfile API-d<\/h3>\n<p><\/p>\n<h4>Rikketolerantsus (Fault tolerance)<\/h4>\n<p>\nVeakuskonstruktsioonid on kriitilise t\u00e4htsusega, et v\u00e4ltida kaskaadv\u00f5rke ja luua usaldusv\u00e4\u00e4rseid mikroteenuste arhitektuure. Spring-arendajad on juba aastaid kasutanud veakindlustamiseks circuit-breakereid. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Netflix\/Hystrix\">Hystrix<\/a><\/noindex>. Kuid Hystrix ei ole pikka aega uuendatud, samas kui MicroProfile'i vigaaktseptsioon on aktiivselt arenenud ja sellel on juba mitu aastat tootmises kasutamist. Seet\u00f5ttu soovitatakse Quarkuses teenuste usaldusv\u00e4\u00e4rsuse suurendamiseks kasutada MicroProfile Fault Tolerance API-sid, mille kasutusn\u00e4iteid on esitatud tabelis 5. Lisainfot selle kohta leiate Quarkus'i juhendist. <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/microprofile-fault-tolerance\">Fault Tolerance Guide<\/a><\/noindex>.<\/p>\n<p><i>Tabel 5. N\u00e4ited MicroProfile Fault Tolerance toetatavate API-de kasutamisest.<\/i><\/p>\n<p>MicroProfile Fault Tolerance funktsioonid<br \/>\nKirjeldus<br \/>\nN\u00e4ited<\/p>\n<p>@Asynchronous<\/p>\n<p>Loogika t\u00e4itmine eraldi niidis<\/p>\n<pre><code class=\"plaintext\">@Asynchronous\n@Retry\npublic Future getSalutation() {\n   ...\n   return future;\n}\n<\/code><\/pre>\n<p>@Bulkhead<\/p>\n<p>Samaaegsete p\u00e4ringute arvu piiramine<\/p>\n<pre><code class=\"plaintext\">@Bulkhead(5)\npublic void fiveConcurrent() {\n   makeRemoteCall(); \/\/...\n}\n<\/code><\/pre>\n<p>@CircuitBreaker<\/p>\n<p>Nutikas t\u00f5rgete t\u00f6\u00f6tlemine ja taastumine<\/p>\n<pre><code class=\"plaintext\">@CircuitBreaker(delay=500   \/\/ milliseconds\n   failureRatio = .75,\n   requestVolumeThreshold = 20,\n   successThreshold = 5)\n@Fallback(fallbackMethod = \"fallback\")\npublic String getSalutation() {\n   makeRemoteCall(); \/\/...\n}\n<\/code><\/pre>\n<p>@Fallback<\/p>\n<p>Alternatiivse loogika kutsumine t\u00f5rke korral<\/p>\n<pre><code class=\"plaintext\">@Timeout(500) \/\/ milliseconds\n@Fallback(fallbackMethod = \"fallback\")\npublic String getSalutation() {\n   makeRemoteCall(); \/\/...\n}\n\npublic String fallback() {\n   return \"hello\";\n}\n<\/code><\/pre>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/retry\/\" class=\"user_link\">Retry<\/a><\/noindex><\/p>\n<p>P\u00e4ringu eba\u00f5nnestumisel edasine proovimine<\/p>\n<pre><code class=\"plaintext\">@Retry(maxRetries=3)\npublic String getSalutation() {\n   makeRemoteCall(); \/\/...\n}\n<\/code><\/pre>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/timeout\/\" class=\"user_link\">Timeout<\/a><\/noindex><\/p>\n<p>Ooteaja kontrollimine eba\u00f5nnestumise korral<\/p>\n<pre><code class=\"plaintext\">@Timeout(value = 500 )   \/\/ milliseconds\n@Fallback(fallbackMethod = \"fallback\")\npublic String getSalutation() {\n   makeRemoteCall(); \/\/...\n}\n<\/code><\/pre>\n<p><\/p>\n<h4>Teenuste kontrollimine (Service Health)<\/h4>\n<p>\nKubernetes platvormid j\u00e4lgivad konteinerite t\u00f5husust spetsiaalsete teenuste abil. Et alampiirkond saaks teenuseid j\u00e4lgida, kasutavad Spring-arendajad tavaliselt kohandatavaid HealthIndicator ja Spring Boot Actuator. Quarkuses saab seda teha MicroProfile Health abil, mis vaikimisi teostab t\u00f6\u00f6v\u00f5imekuse kontrollimist (liveness check), kuid saab seadistada ka samaaegseks liveness ja readiness (valmiduse) kontrollimiseks. N\u00e4ited toetatud MicroProfile Health API kasutamisest on esitatud tabelis 6 ning lisainformatsioon on esitatud Quarkus'i juhendis. <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/microprofile-health\">Health Guide<\/a><\/noindex>.<\/p>\n<p><i>Tabel 6. N\u00e4ited MicroProfile Health toetatavate API-de kasutamisest.<\/i><\/p>\n<p>MicroProfile Health funktsioonid<br \/>\nKirjeldus<br \/>\nN\u00e4ited<\/p>\n<p>@Liveness<\/p>\n<p>Platvorm taask\u00e4ivitab riknenud konteineriseeritud rakendused<br \/>\nL\u00f5pp-punkt:<br \/>\nhost:8080\/health\/live<\/p>\n<pre><code class=\"plaintext\">@Liveness\npublic class MyHC implements HealthCheck {\n  public HealthCheckResponse call() {\n\n   ...\n   return HealthCheckResponse\n     .named(\"myHCProbe\")\n     .status(ready ? true:false)\n     .withData(\"mydata\", data)\n     .build();  \n}\n<\/code><\/pre>\n<p>@Readiness<\/p>\n<p>Platvorm ei suuna liiklust konteinerisse, kui see ei ole valmis<br \/>\nL\u00f5pp-punkt:<br \/>\nhost:8080\/health\/ready<\/p>\n<pre><code class=\"plaintext\">@Readiness\npublic class MyHC implements HealthCheck {\n  public HealthCheckResponse call() {\n\n   ...\n   return HealthCheckResponse\n     .named(\"myHCProbe\")\n     .status(live ? true:false)\n     .withData(\"mydata\", data)\n     .build();  \n}\n<\/code><\/pre>\n<p><\/p>\n<h4>M\u00f5\u00f5tmised<\/h4>\n<p>\nRakendused pakuvad m\u00f5\u00f5dikuid kas operatiivsetel eesm\u00e4rkidel (SLA-taseme j\u00f5udluse j\u00e4lgimine) v\u00f5i mitteoperatiivsetel eesm\u00e4rkidel (\u00e4ri-SLA m\u00f5\u00f5dikud). Spring-arendajad pakuvad m\u00f5\u00f5dikuid Spring Boot Actuator'i ja Micrometeri kaudu. Quarkus kasutab omakorda MicroProfile Metrics'i, et anda esmaseid m\u00f5\u00f5dikuid (JVM ja ops\u00fcsteem), teenusepakkuja m\u00f5\u00f5dikud (Quarkus) ja rakenduse m\u00f5\u00f5dikud. MicroProfile Metrics n\u00f5uab, et rakendus toetaks v\u00e4ljundvorminguid JSON ja OpenMetrics (Prometheus). N\u00e4iteid MicroProfile Metrics API kasutamisest on esitatud tabelis 7.<\/p>\n<p>Uues <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">meie n\u00e4idisprojekti<\/a><\/noindex> MicroProfile Metrics kasutatakse rakenduse m\u00f5\u00f5dikute esitamiseks. T\u00e4iendavaid andmeid leiate Quarkuse juhendist <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/microprofile-metrics\">M\u00f5\u00f5dikute juhend<\/a><\/noindex>.<\/p>\n<p><i>Tabel 7. N\u00e4ited MicroProfile Metrics API kasutamisest.<\/i><\/p>\n<p>MicroProfile Metrics'i funktsioonid<br \/>\nKirjeldus<br \/>\nN\u00e4ited<\/p>\n<p>@Counted<\/p>\n<p>M\u00e4\u00e4rab teadaande counter, mis loendab antud objekti k\u00f5nesid<\/p>\n<pre><code class=\"plaintext\">@Counted(name = \"fallbackCounter\", \n  displayName = \"Fallback Counter\", \n  description = \"Fallback Counter\")\npublic String salutationFallback() {\n   return fallbackSalutation;\n}\n<\/code><\/pre>\n<p>@ConcurrentGauge<\/p>\n<p>M\u00e4\u00e4rab teadaande gauge, mis loendab antud objekti paralleelseid k\u00f5nesid<\/p>\n<pre><code class=\"plaintext\">@ConcurrentGuage(\n  name = \"fallbackConcurrentGauge\", \n  displayName=\"Fallback Concurrent\", \n  description=\"Fallback Concurrent\")\npublic String salutationFallback() {\n   return fallbackSalutation;\n}\n<\/code><\/pre>\n<p>@Gauge<\/p>\n<p>M\u00e4\u00e4rab teadaande gauge, mis m\u00f5\u00f5dab antud objekti v\u00e4\u00e4rtust<\/p>\n<pre><code class=\"plaintext\">@Metered(name = \"FallbackGauge\",\n   displayName=\"Fallback Gauge\",\n   description=\"Fallback frequency\")\npublic String salutationFallback() {\n   return fallbackSalutation;\n}\n<\/code><\/pre>\n<p>@Metered<\/p>\n<p>M\u00e4\u00e4rab teadaande meter, mis j\u00e4lgib antud objekti k\u00f5ne sagedust<\/p>\n<pre><code class=\"plaintext\">@Metered(name = \"MeteredFallback\",\n   displayName=\"Metered Fallback\",\n   description=\"Fallback frequency\")\npublic String salutationFallback() {\n   return fallbackSalutation;\n}\n<\/code><\/pre>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/metric\/\" class=\"user_link\">M\u00f5\u00f5dik<\/a><\/noindex><\/p>\n<p>Annotatsioon, mis sisaldab teavet metaandmete kohta, mil rakendatakse m\u00f5\u00f5diku loomise v\u00f5i saatmise p\u00e4ring<\/p>\n<pre><code class=\"plaintext\">@Metric\n@Metered(name = \"MeteredFallback\",\n   displayName=\"Metered Fallback\",\n   description=\"Fallback frequency\")\npublic String salutationFallback() {\n   return fallbackSalutation;\n}\n<\/code><\/pre>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/timed\/\" class=\"user_link\">Ajastatud<\/a><\/noindex><\/p>\n<p>M\u00e4\u00e4rab ajasturi, mis j\u00e4lgib antud objekti kestust<\/p>\n<pre><code class=\"plaintext\">@Timed(name = \"TimedFallback\",\n   displayName=\"Timed Fallback\",\n   description=\"Fallback delay\")\npublic String salutationFallback() {\n   return fallbackSalutation;\n}\n<\/code><\/pre>\n<p>\n<b>Metrika l\u00f5pp-punktid (Metrics Endpoints)<\/b><\/p>\n<p>Rakenduste metrikad <noindex><a rel=\"nofollow\" href=\"http:\/\/localhost\">localhost<\/a><\/noindex>:8080\/metrics\/application<br \/>\nP\u00f5himetriika <noindex><a rel=\"nofollow\" href=\"http:\/\/localhost\">localhost<\/a><\/noindex>:8080\/metrics\/base<br \/>\nTeenusepakkuja metrikad <noindex><a rel=\"nofollow\" href=\"http:\/\/localhost\">localhost<\/a><\/noindex>:8080\/metrics\/vendor<br \/>\nK\u00f5ik metrikad <noindex><a rel=\"nofollow\" href=\"http:\/\/localhost\">localhost<\/a><\/noindex>:8080\/metrics<\/p>\n<h4>MicroProfile REST klient<\/h4>\n<p>\nMikroteenused pakuvad sageli RESTful l\u00f5pp-punkte, mille jaoks on vajalikud vastavad kliendiliidese API-d. RESTful l\u00f5pp-punktide kasutamiseks kasutavad Springi arendajad tavaliselt RestTemplate'i. Quarkus pakub selle \u00fclesande lahendamiseks MicroProfile REST Client'i API-liideseid, mille kasutamise n\u00e4ited on toodud tabelis 8.<\/p>\n<p>Uues <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">meie n\u00e4idisprojekti<\/a><\/noindex> RESTful l\u00f5pp-punktide kasutamine toimub MicroProfile REST Client'i abil. Lisateavet ja n\u00e4iteid selle teema kohta leiate Quarkus'i juhendist <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/rest-client\">REST Klientide Juhend<\/a><\/noindex>.<\/p>\n<p><i>Tabel 8. N\u00e4ited MicroProfile REST Client'i API-liideste kasutamisest.<\/i><\/p>\n<p>MicroProfile REST Client'i funktsioonid<br \/>\nKirjeldus<br \/>\nN\u00e4ited<\/p>\n<p>@RegisterRestClient<\/p>\n<p>Registreerib t\u00fc\u00fcbitud Java liidese REST kliendina<\/p>\n<pre><code class=\"plaintext\">@RegisterRestClient\n@Path(\"\/\")\npublic interface MyRestClient {\n    @GET\n    @Produces(MediaType.TEXT_PLAIN)\n    public String getSalutation();\n}\n<\/code><\/pre>\n<p>@RestClient<\/p>\n<p>M\u00e4rgistab t\u00fc\u00fcbitud REST klientliidese eksemplari sisestamise<\/p>\n<pre><code class=\"plaintext\">@Autowired \/\/ or @Inject\n@RestClient\nMyRestClient restClient;\n<\/code><\/pre>\n<p>Kutsumine<\/p>\n<p>Kutsuda REST l\u00f5pp-punkt<\/p>\n<pre><code class=\"plaintext\">System.out.println(\n   restClient.getSalutation());\n<\/code><\/pre>\n<p>mp-rest\/url<\/p>\n<p>M\u00e4\u00e4ratleb REST l\u00f5pp-punkti<\/p>\n<pre><code class=\"plaintext\">application.properties:\norg.example.MyRestClient\/mp-rest\/url=\n   http:\/\/localhost:8081\/myendpoint\n<\/code><\/pre>\n<p><\/p>\n<h3>Summary<\/h3>\n<p>\nSelles blogis, mis on ennek\u00f5ike kasulik Spring arendajatele, vaatame l\u00fchidalt, kuidas Quarkus kasutada Springi API-liideseid koos MicroProfile API-liideseid, et arendada Java mikroteenuseid ja seej\u00e4rel kompileerida need kohandatud binaarkoodiks, mis s\u00e4\u00e4stab sadu megabaite m\u00e4lu ja k\u00e4ivitub m\u00f5ne millisekundi jooksul.<\/p>\n<p>Nagu te juba aru saite, leidub t\u00e4iendavat teavet Springi ja MicroProfile API-liidese toetuse kohta, samuti palju muud kasulikku teavet <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/\">Quarkus'i juhendites<\/a><\/noindex>.<br \/>\n<br \/>Allikas: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/redhatrussia\/blog\/497504\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442, \u0438 \u0441 \u0432\u0430\u043c\u0438 \u0442\u0440\u0435\u0442\u0438\u0439 \u043f\u043e\u0441\u0442 \u0438\u0437 \u0441\u0435\u0440\u0438\u0438 \u043f\u0440\u043e Quarkus! \u041f\u0440\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 Java-\u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0447\u0430\u0441\u0442\u043e \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e Eclipse MicroProfile \u0438 Spring Boot \u2013 \u044d\u0442\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0438 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0435 \u0434\u0440\u0443\u0433 \u043e\u0442 \u0434\u0440\u0443\u0433\u0430 API. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u044b, \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0442\u0435 API, \u043a \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043e\u043d\u0438 \u0443\u0436\u0435 \u043f\u0440\u0438\u0432\u044b\u043a\u043b\u0438, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u0435 \u043d\u043e\u0432\u044b\u0445 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u043e\u0432 \u0438 runtime-\u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u043c\u044b [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":79988,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-79987","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442, \u0438 \u0441 \u0432\u0430\u043c\u0438 \u0442\u0440\u0435\u0442\u0438\u0439 \u043f\u043e\u0441\u0442 \u0438\u0437 \u0441\u0435\u0440\u0438\u0438 \u043f\u0440\u043e Quarkus!\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/kak-quarkus-obedinyaet-microprofile-i-spring\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"et_EE\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041a\u0430\u043a Quarkus \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0435\u0442 MicroProfile \u0438 Spring | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442, \u0438 \u0441 \u0432\u0430\u043c\u0438 \u0442\u0440\u0435\u0442\u0438\u0439 \u043f\u043e\u0441\u0442 \u0438\u0437 \u0441\u0435\u0440\u0438\u0438 \u043f\u0440\u043e Quarkus!\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/kak-quarkus-obedinyaet-microprofile-i-spring\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-05-01T23:42:42+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-05-01T23:42:42+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Kuidas Quarkus \u00fchendab MicroProfile ja Spring | ProHoster","description":"Tere k\u00f5igile, ja see on kolmas postitus Quarkuse seeriast!","canonical_url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/kak-quarkus-obedinyaet-microprofile-i-spring","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"et_EE","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041a\u0430\u043a Quarkus \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0435\u0442 MicroProfile \u0438 Spring | ProHoster","og:description":"\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442, \u0438 \u0441 \u0432\u0430\u043c\u0438 \u0442\u0440\u0435\u0442\u0438\u0439 \u043f\u043e\u0441\u0442 \u0438\u0437 \u0441\u0435\u0440\u0438\u0438 \u043f\u0440\u043e Quarkus!","og:url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/kak-quarkus-obedinyaet-microprofile-i-spring","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-05-01T23:42:42+00:00","article:modified_time":"2020-05-01T23:42:42+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"79987","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 16:27:13","updated":"2022-09-30 14:08:43","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/79987","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/comments?post=79987"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/79987\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media\/79988"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media?parent=79987"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/categories?post=79987"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/tags?post=79987"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}