{"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\/hr\/blog\/administrirovanie\/kak-quarkus-obedinyaet-microprofile-i-spring","title":{"rendered":"Kako Quarkus spaja MicroProfile i Spring","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Pozdrav svima, i dobrodo\u0161li u tre\u0107i post iz serije o Quarkusu!<\/p>\n<p><img decoding=\"async\" alt=\"Kako Quarkus spaja MicroProfile i Spring\" src=\"\/wp-content\/uploads\/2020\/05\/d98ff470b49f8de1fa488a6818160969.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPrilikom razvoja Java mikroslu\u017ebi, \u010desto se smatra da <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/blog\/2019\/02\/28\/jumpstart-microservices-microprofile-starter-beta\/\">Eclipse MicroProfile<\/a><\/noindex> i <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/topics\/spring-boot\/\">Spring Boot<\/a><\/noindex> \u2013 to su odvojeni i nezavisni API koji se me\u0111usobno ne oslanjaju. Po defaultu, programeri obi\u010dno koriste one API-je koje ve\u0107 poznaju, budu\u0107i da u\u010denje novih frameworka i runtime komponenti zahteva puno vremena. Danas \u0107emo poku\u0161ati olak\u0161ati u\u010denje nekih popularnih <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/blog\/2018\/11\/21\/eclipse-microprofile-for-spring-boot-developers\/\">MicroProfile API-ja za Spring programere<\/a><\/noindex> i pokazati kako simultano koristiti Spring API i nove korisne mogu\u0107nosti. <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/\">Quarkus<\/a><\/noindex>.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nAko malo detaljnije, prvo \u0107emo razmotriti podru\u010dje primene i detalje o tome kako Quarkus podr\u017eava Spring API, kako bismo pokazali Spring programerima kako mogu primeniti MicroProfile API u svakodnevnom radu. Zatim \u0107emo govoriti o MicroProfile API-jima koji \u0107e imati koristi Spring programerima prilikom izrade mikroslu\u017ebi.<\/p>\n<p>Za\u0161to ba\u0161 Quarkus? Prvo, to je live coding, \u0161to zna\u010di automatsko ponovno u\u010ditavanje svih promena u MicroProfile API, Spring API i drugim Java API-ima, \u0161to se izvr\u0161ava jednom komandom: mvn quarkus:dev. Drugo, u na\u0161em uklju\u010denju <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">usluge Person (kompajlira se iz Spring, MicroProfile i JPA API-ja u binarni fajl koriste\u0107i nativnu sliku GraalVM) pokre\u0107e se za samo 0.055 sekundi i zahteva oko 90 MB RAM-a (RSS) na krajnjoj ta\u010dki RESTful aplikacije. Njegova sama kompilacija se izvr\u0161ava jednom komandom: mvn package -Pnative.<\/a><\/noindex> Ne\u0107emo se zadr\u017eavati na detaljima MicroProfile-a, ve\u0107 \u0107emo poku\u0161ati pomo\u0107i Spring programerima da razumeju kako se u Quarkusu mogu koristiti Spring API zajedno sa MicroProfile API-jima.<\/p>\n<p>Kontejneri i Kubernetes<\/p>\n<h3>Da ne preoptere\u0107ujemo ovaj \u010dlanak, ovde \u0107emo se fokusirati samo na visoke aspekte podr\u0161ke<\/h3>\n<p>\n, \u0161to je va\u017eno razumeti. Quarkus se pozicionira kao Java stack za Kubernetes, ima za cilj minimizirati potro\u0161nju memorije i vreme pokretanja Java aplikacija i usluga, i kao posledicu, pove\u0107ati gustinu njihovog rasporeda na hostu i smanjiti ukupne tro\u0161kove. <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/developer-tools\/kubernetes\">Kubernetes<\/a><\/noindex>Quarkus tako\u0111e<\/p>\n<p>podr\u017eava automatsku generaciju <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/kubernetes-resources\">Kubernetes resursa i nudi<\/a><\/noindex> za implementaciju na Kubernetes i Red Hat OpenShift platformama. Osim toga, Quarkus automatski generi\u0161e Dockerfile.jvm (JVM pakovanje) i Dockerfile.native (nativno binarno pakovanje) datoteke potrebne za izradu kontejnera. <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/\">priru\u010dnika<\/a><\/noindex> za implementaciju na platformama Kubernetes i Red Hat OpenShift. Osim toga, Quarkus automatski generira datoteke Dockerfile.jvm (pakiranje JVM-a) i Dockerfile.native (pakiranje izvorne binarne verzije) potrebne za izradu kontejnera.<\/p>\n<p>I na kraju, oslanjaju\u0107i se na Kubernetes kao na ciljano okru\u017eenje za implementaciju, Quarkus ne koristi Java okvire u slu\u010dajevima kada je sli\u010dna funkcionalnost realizirana na razini same platforme Kubernetes. U tablici 1 prikazana je karta funkcionalnog uskla\u0111ivanja izme\u0111u Kubernetesa i tipi\u010dnih Java okvira koji se koriste od strane Spring programera.<\/p>\n<p><i>Tablica 1. Karta funkcionalnog uskla\u0111ivanja Java okvira i Kubernetesa.<\/i><\/p>\n<p>Funkcionalnost<br \/>\nTradicionalni Spring Boot<br \/>\nKubernetes<\/p>\n<p>Service discovery<br \/>\nEureka<br \/>\nDNS<\/p>\n<p>Konfiguracija<br \/>\nSpring Cloud Config<br \/>\nConfig Maps \/ Secrets<\/p>\n<p>Balansiranje optere\u0107enja<br \/>\nRibbon (na strani klijenta)<br \/>\nServis, Replication Controller (na strani poslu\u017eitelja)<\/p>\n<p><\/p>\n<h3>Kompilacija i pokretanje koda iz primjera<\/h3>\n<p>\nU ovom \u010dlanku referiramo se na <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">primjer projekta<\/a><\/noindex>, gdje se zajedno koriste API su\u010delja Spring i MicroProfile, pa \u010dak i onaj Java razred. Kod iz ovog primjera mo\u017ee se kompajlirati i pokrenuti iz komandne linije, vi\u0161e informacija potra\u017eite u datoteci README.md.<\/p>\n<h3>API su\u010delja Spring Framework<\/h3>\n<p><\/p>\n<h4>Dependency Injection<\/h4>\n<p>\nQuarkus podr\u017eava cijeli niz <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/cdi-reference\">API su\u010delja Contexts and Dependency Injection (CDI)<\/a><\/noindex> i API su\u010delja Spring Dependency Injection (Spring DI). Ako radite s MicroProfileom, <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 i Jakarta EE<\/a><\/noindex>, ve\u0107 ste dobro upoznati s CDI. S druge strane, Spring programeri mogu koristiti Quarkus Extension for Spring DI API za osiguranje kompatibilnosti s Spring DI. Primjeri kori\u0161tenja podr\u017eavanih Spring DI API-ja prikazani su u tablici 2.<\/p>\n<p>U <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">u projektu iz na\u0161eg primjera<\/a><\/noindex> koriste se kako CDI, tako i Spring Dependency Injection. Dodatne informacije i primjere na ovu temu mo\u017eete prona\u0107i u priru\u010dniku Quarkus pod nazivom <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/spring-di\">Spring DI Guide<\/a><\/noindex>.<\/p>\n<p><i>Tablica 2. Primjeri kori\u0161tenja podr\u017eavanih API su\u010delja Spring DI.<\/i><\/p>\n<p>Podr\u017eane funkcije Spring DI<br \/>\nPrimjeri<\/p>\n<p>Constructor Injection<\/p>\n<pre><code class=\"plaintext\">public PersonSpringController(\n   PersonSpringRepository personRepository,  \/\/ injected      \n   PersonSpringMPService personService) {    \/\/ injected\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\">Vrijednost<\/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\">Service<\/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>Web okvir<\/h4>\n<p>\nKorisnicima MicroProfile bit \u0107e drago \u0161to Quarkus podr\u017eava JAX-RS, MicroProfile Rest Client, JSON-P i JSON-B kao osnovni model za web programiranje. Razvojni programeri koji koriste Spring \u0107e se obradovati nedavnom podr\u0161kom Spring Web API-a u Quarkusu, posebice za su\u010delja koja se odnose na REST. Na sli\u010dan na\u010din kao i kod Spring DI, glavni cilj podr\u0161ke Spring Web API-u je omogu\u0107iti Spring programerima kori\u0161tenje Spring Web API su\u010delja zajedno s MicroProfile API su\u010deljima. Primjeri kori\u0161tenja podr\u017eanih Spring Web API-a prikazani su u Tablici 3, a dodatne informacije i primjere o ovoj temi mo\u017eete prona\u0107i u Quarkus vodi\u010du pod nazivom <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/spring-web\">Spring Web Guide<\/a><\/noindex>.<\/p>\n<p><i>Tablica 3. Primjeri kori\u0161tenja podr\u017eanih Spring Web API su\u010delja.<\/i><\/p>\n<p>Podr\u017eane funkcije Spring Web<br \/>\nPrimjeri<\/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 (djelomi\u010dno)<\/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>\nKorisnicima MicroProfile tako\u0111er \u0107e se svidjeti \u0161to Quarkus podr\u017eava JPA kori\u0161tenjem Hibernate ORM-a. Postoji dobra vijest i za Spring programere: Quarkus podr\u017eava uobi\u010dajene anotacije i tipove Spring Data JPA. Primjeri kori\u0161tenja podr\u017eanih Spring Data JPA API-ja prikazani su u Tablici 4.<br \/>\nU <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">u projektu iz na\u0161eg primjera<\/a><\/noindex> koriste se Spring Data JPA API su\u010delja, a dodatne informacije dostupne su u Quarkus vodi\u010du pod nazivom <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/spring-data-jpa-guide\">Spring Data JPA Guide<\/a><\/noindex>.<\/p>\n<p><i>Tablica 4. Primjeri kori\u0161tenja podr\u017eanih Spring Data JPA API su\u010delja.<\/i><\/p>\n<p>Podr\u017eane funkcije Spring Data JPA<br \/>\nPrimjeri<\/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>User-defined queries<\/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>API su\u010delja MicroProfile<\/h3>\n<p><\/p>\n<h4>Otpornost na gre\u0161ke (Fault tolerance)<\/h4>\n<p>\nKonstrukcije otpornosti na gre\u0161ke su vrlo va\u017ene za spre\u010davanje kaskadnih kvarova i stvaranje pouzdanih mikroservisnih arhitektura. Spring programeri ve\u0107 dugi niz godina koriste circuit-breaker-e za otpornost na gre\u0161ke. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Netflix\/Hystrix\">Hystrix<\/a><\/noindex>. Me\u0111utim, Hystrix se ve\u0107 dugo nije a\u017eurirao, dok se MicroProfile-ova otpornost na gre\u0161ke aktivno razvija i ima nekoliko godina produkcijskog kori\u0161\u0107enja iza sebe. Stoga se za pove\u0107anje pouzdanosti servisa u Quarkusu preporu\u010duje primena MicroProfile Fault Tolerance API interfejsa, \u010diji se primeri kori\u0161\u0107enja nalaze u tabeli 5. Dodatne informacije o tome mogu se na\u0107i u Quarkus priru\u010dniku. <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/microprofile-fault-tolerance\">Vodi\u010d za otpornost na gre\u0161ke<\/a><\/noindex>.<\/p>\n<p><i>Tabela 5. Primeri kori\u0161\u0107enja podr\u017eanih MicroProfile Fault Tolerance API interfejsa.<\/i><\/p>\n<p>Funkcije MicroProfile Fault Tolerance<br \/>\nOpis<br \/>\nPrimjeri<\/p>\n<p>@Asynchronous<\/p>\n<p>Izvr\u0161avanje logike u posebnoj niti<\/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>Ograni\u010denje broja simultanih zahteva<\/p>\n<pre><code class=\"plaintext\">@Bulkhead(5)\npublic void fiveConcurrent() {\n   makeRemoteCall(); \/\/...\n}\n<\/code><\/pre>\n<p>@CircuitBreaker<\/p>\n<p>Pametno upravljanje gre\u0161kama i oporavak od gre\u0161aka<\/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>Pozivanje alternativne logike u slu\u010daju gre\u0161ke<\/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>Ponovo poku\u0161ajte u slu\u010daju gre\u0161ke zahteva<\/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>Vreme \u010dekanja prilikom gre\u0161ke<\/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>Proveravanje servisa (Service Health)<\/h4>\n<p>\nKubernetes platforme prate ispravnost kontejnera pomo\u0107u specijalizovanih servisa. Da bi ni\u017ea platforma mogla da nadgleda servise, Spring programeri obi\u010dno koriste prilagodljive HealthIndicator i Spring Boot Actuator. U Quarkusu to se mo\u017ee u\u010diniti putem MicroProfile Health, koje po defaultu vr\u0161e proveru rada (liveness check), ali se mogu konfigurisati da istovremeno proveravaju liveness i readiness (spremnost). Primeri kori\u0161\u0107enja podr\u017eanih MicroProfile Health API interfejsa nalaze se u tabeli 6, a dodatne informacije su predstavljene u Quarkus priru\u010dniku. <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/microprofile-health\">Vodi\u010d za zdravlje<\/a><\/noindex>.<\/p>\n<p><i>Tabela 6. Primeri kori\u0161\u0107enja podr\u017eanih MicroProfile Health API interfejsa.<\/i><\/p>\n<p>Funkcije MicroProfile Health<br \/>\nOpis<br \/>\nPrimjeri<\/p>\n<p>@Liveness<\/p>\n<p>Platforma vr\u0161i ponovno pokretanje neispravnih kontejnerizovanih aplikacija<br \/>\nEndpoint:<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>Platforma ne\u0107e slati promet na kontejnerizirane aplikacije u slu\u010daju njihove nespremnosti<br \/>\nEndpoint:<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>Metrije<\/h4>\n<p>\nAplikacije pru\u017eaju metrike ili u operativne svrhe (za pra\u0107enje SLA performansi), ili u neoperativne (poslovne KPI). Spring programeri pru\u017eaju metrike putem Spring Boot Actuator i Micrometer. S druge strane, Quarkus koristi MicroProfile Metrics za pru\u017eanje osnovnih metrika (JVM i operativni sustav), vendorskih metrika (Quarkus) i metrika aplikacija. MicroProfile Metrics zahtijeva da implementacija podr\u017eava izlazne formate JSON i OpenMetrics (Prometheus). Primjeri kori\u0161tenja MicroProfile Metrics API prikazani su u tablici 7.<\/p>\n<p>U <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">u projektu iz na\u0161eg primjera<\/a><\/noindex> MicroProfile Metrics koriste se za pru\u017eanje metrika aplikacija. Dodatne informacije mo\u017eete prona\u0107i u vodi\u010du Quarkus <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/microprofile-metrics\">Vodi\u010d za metrike<\/a><\/noindex>.<\/p>\n<p><i>Tablica 7. Primjeri kori\u0161tenja MicroProfile Metrics API.<\/i><\/p>\n<p>Funkcije MicroProfile Metrics<br \/>\nOpis<br \/>\nPrimjeri<\/p>\n<p>@Counted<\/p>\n<p>Ozna\u010dava counter koji broji broj poziva obele\u017eenog objekta<\/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>Ozna\u010dava mernu ta\u010dku koja broji broj paralelnih poziva obele\u017eenog objekta<\/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>Ozna\u010dava mernu ta\u010dku koja meri vrednost obele\u017eenog objekta<\/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>Ozna\u010dava mernu ta\u010dku koja prati u\u010destalost poziva obele\u017eenog objekta<\/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\">Metod<\/a><\/noindex><\/p>\n<p>Annotation koja sadr\u017ei informacije o metapodacima kada stigne zahtev za kreiranje ili proizvodnju metrike<\/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\">Mereno vreme<\/a><\/noindex><\/p>\n<p>Ozna\u010dava tajmer koji prati trajanje obele\u017eenog objekta<\/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>Krajnje to\u010dke metrika (Metrics Endpoints)<\/b><\/p>\n<p>Metrike aplikacija <noindex><a rel=\"nofollow\" href=\"http:\/\/localhost\">localhost<\/a><\/noindex>:8080\/metrics\/application<br \/>\nOsnovne metrike <noindex><a rel=\"nofollow\" href=\"http:\/\/localhost\">localhost<\/a><\/noindex>:8080\/metrics\/base<br \/>\nMetrike dobavlja\u010da <noindex><a rel=\"nofollow\" href=\"http:\/\/localhost\">localhost<\/a><\/noindex>:8080\/metrics\/vendor<br \/>\nSve metrike <noindex><a rel=\"nofollow\" href=\"http:\/\/localhost\">localhost<\/a><\/noindex>:8080\/metrics<\/p>\n<h4>Rest-klijent MicroProfile<\/h4>\n<p>\nMikroservisi \u010desto pru\u017eaju RESTful krajnje to\u010dke, za rad s kojima su potrebni odgovaraju\u0107i klijentski API-ji. Da bi koristili RESTful krajnje to\u010dke, Spring developeri obi\u010dno koriste RestTemplate. Quarkus nudi MicroProfile Rest Client API-je za tu svrhu, a primjeri kori\u0161tenja su navedeni u Tablici 8.<\/p>\n<p>U <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">u projektu iz na\u0161eg primjera<\/a><\/noindex> Kori\u0161tenje RESTful krajnjih to\u010daka ostvaruje se pomo\u0107u MicroProfile Rest Client-a. Dodatne informacije i primjere na ovu temu mo\u017eete prona\u0107i u vodi\u010du za Quarkus. <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/rest-client\">Vodi\u010d za Rest Client<\/a><\/noindex>.<\/p>\n<p><i>Tablica 8. Primjeri kori\u0161tenja MicroProfile Rest Client API-ja.<\/i><\/p>\n<p>Funkcije MicroProfile Rest Client<br \/>\nOpis<br \/>\nPrimjeri<\/p>\n<p>@RegisterRestClient<\/p>\n<p>Registrira tipizirani Java interfejs kao REST klijent.<\/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>Ozna\u010dava uvo\u0111enje instance tipiziranog REST klijent interfejsa.<\/p>\n<pre><code class=\"plaintext\">@Autowired \/\/ or @Inject\n@RestClient\nMyRestClient restClient;\n<\/code><\/pre>\n<p>Invokacija<\/p>\n<p>Poziva REST krajnju to\u010dku.<\/p>\n<pre><code class=\"plaintext\">System.out.println(\n   restClient.getSalutation());\n<\/code><\/pre>\n<p>mp-rest\/url<\/p>\n<p>Postavlja REST krajnju to\u010dku.<\/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>Zaklju\u010dci<\/h3>\n<p>\nU ovom blogu, koji \u0107e prvenstveno biti koristan Spring developerima, ukratko \u0107emo razmotriti kako koristiti Spring API-je zajedno s MicroProfile API-jima u Quarkusu za razvoj Java mikroservisa i njihovu kompilaciju u nativni binarni kod, \u0161to \u0161tedi stotine megabajta RAM-a i omogu\u0107uje pokretanje u milisekundama.<\/p>\n<p>Kao \u0161to ste ve\u0107 shvatili, dodatne informacije o podr\u0161ci za Spring i MicroProfile API-je, kao i mnogo drugih korisnih informacija mo\u017eete prona\u0107i u <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/\">vodi\u010dima za Quarkus<\/a><\/noindex>.<br \/>\n<br \/>Izvor: <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.4 - 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\/hr\/blog\/administrirovanie\/kak-quarkus-obedinyaet-microprofile-i-spring\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"hr_HR\" \/>\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\/hr\/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\udd47Kako Quarkus spaja MicroProfile i Spring | ProHoster","description":"Pozdrav svima, i dobrodo\u0161li u tre\u0107i post iz serije o Quarkusu!","canonical_url":"https:\/\/prohoster.info\/hr\/blog\/administrirovanie\/kak-quarkus-obedinyaet-microprofile-i-spring","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"hr_HR","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\/hr\/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\/hr\/wp-json\/wp\/v2\/posts\/79987","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/comments?post=79987"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/posts\/79987\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/media\/79988"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/media?parent=79987"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/categories?post=79987"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/tags?post=79987"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}