{"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\/sk\/blog\/administrirovanie\/kak-quarkus-obedinyaet-microprofile-i-spring","title":{"rendered":"Ako Quarkus sp\u00e1ja MicroProfile a Spring","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Ahojte, a m\u00e1te pred sebou tret\u00ed pr\u00edspevok zo s\u00e9rie o Quarkus!<\/p>\n<p><img decoding=\"async\" alt=\"Ako Quarkus sp\u00e1ja MicroProfile a Spring\" src=\"\/wp-content\/uploads\/2020\/05\/d98ff470b49f8de1fa488a6818160969.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPri v\u00fdvoji Java mikroslu\u017eieb sa \u010dasto predpoklad\u00e1, \u017ee <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/blog\/2019\/02\/28\/jumpstart-microservices-microprofile-starter-beta\/\">Eclipse MicroProfile<\/a><\/noindex> a <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/topics\/spring-boot\/\">Spring Boot<\/a><\/noindex> s\u00fa to oddelen\u00e9 a nez\u00e1visl\u00e9 API. Ako obvykle, program\u00e1tori zvy\u010dajne pou\u017e\u00edvaj\u00fa tie API, na ktor\u00e9 s\u00fa u\u017e zvyknut\u00ed, preto\u017ee u\u010denie nov\u00fdch r\u00e1mcov a runtime komponentov si vy\u017eaduje ve\u013ea \u010dasu. Dnes sa pok\u00fasime zjednodu\u0161i\u0165 osvojovanie niektor\u00fdch popul\u00e1rnych <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/blog\/2018\/11\/21\/eclipse-microprofile-for-spring-boot-developers\/\">MicroProfile API pre Spring v\u00fdvoj\u00e1rov<\/a><\/noindex> a uk\u00e1\u017eeme, ako s\u00fa\u010dasne vyu\u017e\u00edva\u0165 Spring API a nov\u00e9 u\u017eito\u010dn\u00e9 funkcie. <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/\">Quarkus<\/a><\/noindex>.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nAk sa pozrieme trochu podrobnej\u0161ie, najsk\u00f4r si pribl\u00ed\u017eime oblas\u0165 pou\u017eitia a detaily, ako Quarkus podporuje API rozhrania Spring, aby sme uk\u00e1zali Spring v\u00fdvoj\u00e1rom, ako m\u00f4\u017eu vyu\u017e\u00edva\u0165 MicroProfile API vo svojej ka\u017edodennej pr\u00e1ci. Potom si povieme o MicroProfile API, ktor\u00e9 sa bud\u00fa hodi\u0165 Spring v\u00fdvoj\u00e1rom pri vytv\u00e1ran\u00ed mikroslu\u017eieb.<\/p>\n<p>Pre\u010do pr\u00e1ve Quarkus? Po prv\u00e9, je to live coding, teda automatick\u00e9 znovu na\u010d\u00edtanie ak\u00fdchko\u013evek zmien v MicroProfile API, Spring API a \u010fal\u0161\u00edch Java API, ktor\u00e9 sa vykon\u00e1va iba jednou pr\u00edkazom: mvn quarkus:dev. Po druh\u00e9, modelovan\u00fd v <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">na\u0161om pr\u00edklade<\/a><\/noindex> servis Person (ten sa kompiluje z API rozhran\u00ed Spring, MicroProfile a JPA do bin\u00e1rn\u00e9ho s\u00faboru pomocou nat\u00edvneho obrazu GraalVM) sa sp\u00fa\u0161\u0165a za len 0.055 sekundy a zaber\u00e1 pribli\u017ene 90 MB v RAM (RSS) na konci RESTful aplik\u00e1cie. Samotn\u00e1 jeho kompil\u00e1cia prebieha iba jedn\u00fdm pr\u00edkazom: mvn package -Pnative.<\/p>\n<p>Nebudeme sa venova\u0165 podrobnostiam MicroProfile, ale pok\u00fasime sa pom\u00f4c\u0165 Spring v\u00fdvoj\u00e1rom porozumie\u0165, ako v Quarkus pou\u017e\u00edva\u0165 API rozhrania Spring spolu s API rozhraniami MicroProfile.<\/p>\n<h3>Kontajnery a Kubernetes<\/h3>\n<p>\nAby sme t\u00fato \u010dl\u00e1nok nepre\u0165a\u017eovali, budeme sa tu venova\u0165 iba vysoko\u00farov\u0148ov\u00fdm aspektom podpory <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/developer-tools\/kubernetes\">Kubernetes<\/a><\/noindex>, preto\u017ee je to d\u00f4le\u017eit\u00e9 pochopi\u0165. Quarkus sa prezentuje ako Java stack pre Kubernetes, m\u00e1 za cie\u013e minimalizova\u0165 spotrebu pam\u00e4te a \u010das spustenia Java aplik\u00e1ci\u00ed a slu\u017eieb, a t\u00fdm zv\u00fd\u0161i\u0165 hustotu ich nasadenia na hostite\u013eovi a zn\u00ed\u017ei\u0165 celkov\u00e9 n\u00e1klady.<\/p>\n<p>Quarkus tie\u017e <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/kubernetes-resources\">podporuje automatick\u00fa gener\u00e1ciu<\/a><\/noindex> zdrojov Kubernetes a pon\u00faka <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/\">pr\u00edru\u010dky<\/a><\/noindex> mo\u017enosti nasadenia na platform\u00e1ch Kubernetes a Red Hat OpenShift. Okrem toho Quarkus automaticky generuje s\u00fabory Dockerfile.jvm (JVM packaging) a Dockerfile.native (native binary packaging), ktor\u00e9 s\u00fa potrebn\u00e9 na vytvorenie kontajnerov.<\/p>\n<p>A kone\u010dne, so zameran\u00edm na Kubernetes ako na cie\u013eov\u00e9 prostredie nasadenia, Quarkus nepou\u017e\u00edva Java r\u00e1mce, ak je podobn\u00e1 funkcionalita implementovan\u00e1 na \u00farovni samotnej platformy Kubernetes. V tabu\u013eke 1 je uveden\u00e1 mapa zodpovednosti medzi Kubernetes a typick\u00fdmi Java r\u00e1mcami, ktor\u00e9 pou\u017e\u00edvaj\u00fa v\u00fdvoj\u00e1ri Spring.<\/p>\n<p><i>Tabu\u013eka 1. Mapa zodpovednosti Java r\u00e1mcov a Kubernetes.<\/i><\/p>\n<p>Funkcionalita<br \/>\nTradi\u010dn\u00fd Spring Boot<br \/>\nKubernetes<\/p>\n<p>Objavovanie slu\u017eieb<br \/>\nEureka<br \/>\nDNS<\/p>\n<p>Konfigur\u00e1cia<br \/>\nSpring Cloud Config<br \/>\nConfig Maps \/ Secrets<\/p>\n<p>Vyrovn\u00e1vanie z\u00e1\u0165a\u017ee<br \/>\nRibbon (na strane klienta)<br \/>\nSlu\u017eba, Replication Controller (na strane servera)<\/p>\n<p><\/p>\n<h3>Kompil\u00e1cia a spustenie k\u00f3du z pr\u00edkladu<\/h3>\n<p>\nV tomto \u010dl\u00e1nku odkazujeme na <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">pr\u00edklad projektu<\/a><\/noindex>, kde s\u00fa spolo\u010dne pou\u017eit\u00e9 API rozhrania Spring a MicroProfile a dokonca aj ten ist\u00fd Java trieda. K\u00f3d z tohto pr\u00edkladu mo\u017eno skompilova\u0165 a spusti\u0165 z pr\u00edkazov\u00e9ho riadku, podrobnosti n\u00e1jdete v s\u00fabore README.md.<\/p>\n<h3>API rozhrania Spring Framework<\/h3>\n<p><\/p>\n<h4>Dependency Injection<\/h4>\n<p>\nQuarkus podporuje mno\u017estvo <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/cdi-reference\">API rozhran\u00ed Contexts and Dependency Injection (CDI)<\/a><\/noindex> a API rozhran\u00ed Spring Dependency Injection (Spring DI). Ak pracujete s MicroProfile, <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 a Jakarta EE<\/a><\/noindex>, u\u017e ste dobre obozn\u00e1men\u00ed s CDI. Na druhej strane, v\u00fdvoj\u00e1ri Spring m\u00f4\u017eu vyu\u017ei\u0165 Quarkus Extension for Spring DI API na zabezpe\u010denie kompatibility so Spring DI. Pr\u00edklady pou\u017eitia podporovan\u00fdch API rozhran\u00ed Spring DI s\u00fa uveden\u00e9 v tabu\u013eke 2.<\/p>\n<p>V <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">v projekte z n\u00e1\u0161ho pr\u00edkladu<\/a><\/noindex> sa pou\u017e\u00edvaj\u00fa ako CDI, tak aj Spring Dependency Injection. \u010eal\u0161ie inform\u00e1cie a pr\u00edklady na t\u00fato t\u00e9mu n\u00e1jdete v sprievodcovi Quarkus s n\u00e1zvom <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/spring-di\">Spring DI Guide<\/a><\/noindex>.<\/p>\n<p><i>Tabu\u013eka 2. Pr\u00edklady pou\u017eit\u00ed podporovan\u00fdch API rozhran\u00ed Spring DI.<\/i><\/p>\n<p>Podporovan\u00e9 funkcie Spring DI<br \/>\nPr\u00edklady<\/p>\n<p>Vstrekovanie kon\u0161truktora<\/p>\n<pre><code class=\"plaintext\">public PersonSpringController(\n   PersonSpringRepository personRepository,  \/\/ injektovan\u00e9      \n   PersonSpringMPService personService) {    \/\/ injektovan\u00e9\n      this.personRepository = personRepository;\n      this.personService = personService;\n}\n<\/code><\/pre>\n<p>Vstrekovanie po\u013ea<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\">Hodnota<\/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\">Komponent<\/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>Webov\u00fd r\u00e1mec<\/h4>\n<p>\nPou\u017e\u00edvate\u013eom MicroProfile sa bude p\u00e1\u010di\u0165, \u017ee Quarkus podporuje JAX-RS, MicroProfile Rest Client, JSON-P a JSON-B ako hlavn\u00fa webov\u00fa programovaciu model. V\u00fdvoj\u00e1ri Spring bud\u00fa pote\u0161en\u00ed ned\u00e1vno pridanou podporou Spring Web API v Quarkus, predov\u0161etk\u00fdm pre rozhrania zodpovedaj\u00face za REST. Rovnako ako v pr\u00edpade Spring DI, hlavn\u00fdm cie\u013eom podpory Spring Web API je umo\u017eni\u0165 v\u00fdvoj\u00e1rom Spring pou\u017e\u00edva\u0165 API rozhrania Spring Web spolu s API rozhraniami MicroProfile. Pr\u00edklady vyu\u017eitia podporovan\u00fdch Spring Web API s\u00fa uveden\u00e9 v tabu\u013eke 3 a \u010fal\u0161ie inform\u00e1cie a pr\u00edklady na t\u00fato t\u00e9mu n\u00e1jdete v pr\u00edru\u010dke Quarkus s n\u00e1zvom <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/spring-web\">Spring Web Guide<\/a><\/noindex>.<\/p>\n<p><i>Tabu\u013eka 3. Pr\u00edklady vyu\u017eitia podporovan\u00fdch API rozhran\u00ed Spring Web.<\/i><\/p>\n<p>Podporovan\u00e9 funkcie Spring Web<br \/>\nPr\u00edklady<\/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 (partial)<\/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>\nPou\u017e\u00edvate\u013eom MicroProfile sa tie\u017e bude p\u00e1\u010di\u0165, \u017ee Quarkus podporuje JPA pomocou Hibernate ORM. Pre v\u00fdvoj\u00e1rov Spring je dobr\u00e1 spr\u00e1va, \u017ee Quarkus podporuje v\u0161eobecne pou\u017e\u00edvan\u00e9 anot\u00e1cie a typy Spring Data JPA. Pr\u00edklady vyu\u017eitia podporovan\u00fdch API Spring Data JPA s\u00fa uveden\u00e9 v tabu\u013eke 4.<br \/>\nV <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">v projekte z n\u00e1\u0161ho pr\u00edkladu<\/a><\/noindex> pou\u017e\u00edvaj\u00fa sa API rozhrania Spring Data JPA, a \u010fal\u0161ie inform\u00e1cie s\u00fa k dispoz\u00edcii v pr\u00edru\u010dke Quarkus s n\u00e1zvom <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/spring-data-jpa-guide\">Spring Data JPA Guide<\/a><\/noindex>.<\/p>\n<p><i>Tabu\u013eka 4. Pr\u00edklady vyu\u017eitia podporovan\u00fdch API rozhran\u00ed Spring Data JPA.<\/i><\/p>\n<p>Podporovan\u00e9 funkcie Spring Data JPA<br \/>\nPr\u00edklady<\/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>Odvozen\u00e9 dotazovacie met\u00f3dy<\/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>Dotazy definovan\u00e9 pou\u017e\u00edvate\u013eom<\/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 rozhrania MicroProfile<\/h3>\n<p><\/p>\n<h4>Odolnos\u0165 vo\u010di chyb\u00e1m (Fault tolerance)<\/h4>\n<p>\nKon\u0161trukcie odolnosti vo\u010di chyb\u00e1m s\u00fa ve\u013emi d\u00f4le\u017eit\u00e9 pre prevenciu kask\u00e1dov\u00fdch zlyhan\u00ed a vytv\u00e1ranie spo\u013eahliv\u00fdch mikroslu\u017eieb. V\u00fdvoj\u00e1ri Spring u\u017e roky pou\u017e\u00edvaj\u00fa obvody (circuit-breakers) na zabezpe\u010denie odolnosti. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Netflix\/Hystrix\">Hystrix<\/a><\/noindex>. Av\u0161ak Hystrix u\u017e dlho nebol aktualizovan\u00fd, zatia\u013e \u010do MicroProfile odolnos\u0165 vo\u010di chyb\u00e1m sa teraz akt\u00edvne vyv\u00edja a m\u00e1 za sebou nieko\u013eko rokov pou\u017e\u00edvania v produkcii. Preto sa na zv\u00fd\u0161enie spo\u013eahlivosti slu\u017eieb v Quarkus odpor\u00fa\u010da pou\u017e\u00edva\u0165 API rozhrania MicroProfile Fault Tolerance, pr\u00edklady pou\u017eitia ktor\u00fdch s\u00fa uveden\u00e9 v tabu\u013eke 5. \u010eal\u0161ie inform\u00e1cie n\u00e1jdete v pr\u00edru\u010dke Quarkus. <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/microprofile-fault-tolerance\">Pr\u00edru\u010dka odolnosti vo\u010di chyb\u00e1m<\/a><\/noindex>.<\/p>\n<p><i>Tabu\u013eka 5. Pr\u00edklady pou\u017eitia podporovan\u00fdch API rozhran\u00ed MicroProfile Fault Tolerance.<\/i><\/p>\n<p>Funkcie MicroProfile Fault Tolerance<br \/>\nPopis<br \/>\nPr\u00edklady<\/p>\n<p>@Asynchronous<\/p>\n<p>Vykonanie logiky v samostatnom vl\u00e1kne.<\/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>Obmedzenie po\u010dtu s\u00fa\u010dasn\u00fdch po\u017eiadaviek.<\/p>\n<pre><code class=\"plaintext\">@Bulkhead(5)\npublic void fiveConcurrent() {\n   makeRemoteCall(); \/\/...\n}\n<\/code><\/pre>\n<p>@CircuitBreaker<\/p>\n<p>Inteligentn\u00e9 spracovanie zlyhan\u00ed a obnovenie po zlyhaniach.<\/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>Volanie alternat\u00edvnej logiky v pr\u00edpade zlyhania.<\/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>Opakovanie pri zlyhan\u00ed po\u017eiadavky.<\/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>Kontroln\u00fd \u010das \u010dakania pri zlyhan\u00ed.<\/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>Kontrola slu\u017eieb (Service Health)<\/h4>\n<p>\nPlatformy Kubernetes sleduj\u00fa spr\u00e1vnos\u0165 kontajnerov pomocou \u0161peci\u00e1lnych slu\u017eieb. Aby mohla podkladov\u00e1 platforma monitorova\u0165 slu\u017eby, v\u00fdvoj\u00e1ri Spring zvy\u010dajne pou\u017e\u00edvaj\u00fa nastavite\u013en\u00e9 HealthIndicator a Spring Boot Actuator. V Quarkus to mo\u017eno dosiahnu\u0165 pomocou MicroProfile Health, ktor\u00e9 predvolene vykon\u00e1vaj\u00fa kontrolu \u017eivej funk\u010dnosti (liveness check), ale m\u00f4\u017eu by\u0165 nastaven\u00e9 aj na s\u00fa\u010dasn\u00fa kontrolu \u017eivej funk\u010dnosti a pripravenosti (readiness). Pr\u00edklady pou\u017eitia podporovan\u00fdch API MicroProfile Health s\u00fa uveden\u00e9 v tabu\u013eke 6, a \u010fal\u0161ie inform\u00e1cie s\u00fa predstaven\u00e9 v pr\u00edru\u010dke Quarkus. <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/microprofile-health\">Pr\u00edru\u010dka zdravia<\/a><\/noindex>.<\/p>\n<p><i>Tabu\u013eka 6. Pr\u00edklady pou\u017eitia podporovan\u00fdch API rozhran\u00ed MicroProfile Health.<\/i><\/p>\n<p>Funkcie MicroProfile Health<br \/>\nPopis<br \/>\nPr\u00edklady<\/p>\n<p>@Liveness<\/p>\n<p>Platforma vykon\u00e1va re\u0161tart nefunk\u010dn\u00fdch kontajnerizovan\u00fdch aplik\u00e1ci\u00ed.<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 nebude odosiela\u0165 traffic na kontajnerizovan\u00e9 aplik\u00e1cie v pr\u00edpade ich nepripravenosti<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>Met\u00f3dy<\/h4>\n<p>\nAplik\u00e1cie poskytuj\u00fa metriky bu\u010f na opera\u010dn\u00e9 \u00fa\u010dely (na kontrolu v\u00fdkonu SLA), alebo na neopera\u010dn\u00e9 (obchodn\u00e9 ukazovatele SLA). V\u00fdvoj\u00e1ri Spring poskytuj\u00fa metriky pomocou Spring Boot Actuator a Micrometer. Zasa Quarkus vyu\u017e\u00edva MicroProfile Metrics na poskytovanie z\u00e1kladn\u00fdch metrik (JVM a opera\u010dn\u00fd syst\u00e9m), vendor metr\u00edk (Quarkus) a metr\u00edk aplik\u00e1ci\u00ed. MicroProfile Metrics vy\u017eaduje, aby implement\u00e1cia podporovala v\u00fdstupn\u00e9 form\u00e1ty JSON a OpenMetrics (Prometheus). Pr\u00edklady pou\u017eitia MicroProfile Metrics API s\u00fa uveden\u00e9 v tabu\u013eke 7.<\/p>\n<p>V <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">v projekte z n\u00e1\u0161ho pr\u00edkladu<\/a><\/noindex> MicroProfile Metrics sa pou\u017e\u00edvaj\u00fa na poskytovanie metr\u00edk aplik\u00e1cie. \u010eal\u0161ie inform\u00e1cie n\u00e1jdete v pr\u00edru\u010dke Quarkus <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/microprofile-metrics\">Metriky Pr\u00edru\u010dka<\/a><\/noindex>.<\/p>\n<p><i>Tabu\u013eka 7. Pr\u00edklady pou\u017eitia API MicroProfile Metrics.<\/i><\/p>\n<p>Funkcie MicroProfile Metrics<br \/>\nPopis<br \/>\nPr\u00edklady<\/p>\n<p>@Counted<\/p>\n<p>Ozna\u010duje counter-s\u010d\u00edta\u010d, ktor\u00fd po\u010d\u00edta po\u010det volan\u00ed ozna\u010den\u00e9ho objektu<\/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\u010duje gauge-sn\u00edma\u010d, ktor\u00fd po\u010d\u00edta po\u010det paraleln\u00fdch volan\u00ed ozna\u010den\u00e9ho objektu<\/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>Ozvu\u010duje gauge-sn\u00edma\u010d, ktor\u00fd meria hodnotu ozna\u010den\u00e9ho objektu<\/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>Ozvu\u010duje meter-sn\u00edma\u010d, ktor\u00fd sleduje frekvenciu volania ozna\u010den\u00e9ho objektu<\/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\">Metrika<\/a><\/noindex><\/p>\n<p>Annot\u00e1cia obsahuj\u00faca inform\u00e1cie o metad\u00e1tach, pri pr\u00edjme po\u017eiadavky na vytvorenie alebo produkciu metriky<\/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\">\u010casovan\u00e9<\/a><\/noindex><\/p>\n<p>Ozvu\u010duje \u010dasova\u010d, ktor\u00fd sleduje trvanie ozna\u010den\u00e9ho objektu<\/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>Koncov\u00e9 body metriky (Metrics Endpoints)<\/b><\/p>\n<p>Metriky aplik\u00e1ci\u00ed <noindex><a rel=\"nofollow\" href=\"http:\/\/localhost\">localhost<\/a><\/noindex>:8080\/metrics\/application<br \/>\nZ\u00e1kladn\u00e9 metriky <noindex><a rel=\"nofollow\" href=\"http:\/\/localhost\">localhost<\/a><\/noindex>:8080\/metrics\/base<br \/>\nVendor metriky <noindex><a rel=\"nofollow\" href=\"http:\/\/localhost\">localhost<\/a><\/noindex>:8080\/metrics\/vendor<br \/>\nV\u0161etky metriky <noindex><a rel=\"nofollow\" href=\"http:\/\/localhost\">localhost<\/a><\/noindex>:8080\/metrics<\/p>\n<h4>Rest klient MicroProfile<\/h4>\n<p>\nMikroslu\u017eby \u010dasto poskytuj\u00fa koncov\u00e9 body RESTful, na pr\u00e1cu s ktor\u00fdmi s\u00fa potrebn\u00e9 pr\u00edslu\u0161n\u00e9 klientsk\u00e9 API. Pre pou\u017eitie koncov\u00fdch bodov RESTful, Spring v\u00fdvoj\u00e1ri zvy\u010dajne pou\u017e\u00edvaj\u00fa RestTemplate. Quarkus v\u0161ak pon\u00faka pre rie\u0161enie tejto \u00falohy API rozhrania MicroProfile Rest Client, pr\u00edklady pou\u017eitia ktor\u00fdch s\u00fa uveden\u00e9 v tabu\u013eke 8.<\/p>\n<p>V <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">v projekte z n\u00e1\u0161ho pr\u00edkladu<\/a><\/noindex> Pou\u017eitie koncov\u00fdch bodov RESTful sa realizuje pomocou MicroProfile Rest Client. \u010eal\u0161ie inform\u00e1cie a pr\u00edklady na t\u00fato t\u00e9mu n\u00e1jdete v pr\u00edru\u010dke Quarkus. <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/rest-client\">Pr\u00edru\u010dka Rest Client<\/a><\/noindex>.<\/p>\n<p><i>Tabu\u013eka 8. Pr\u00edklady pou\u017eitia API rozhrania MicroProfile Rest Client.<\/i><\/p>\n<p>Funkcie MicroProfile Rest Client<br \/>\nPopis<br \/>\nPr\u00edklady<\/p>\n<p>@RegisterRestClient<\/p>\n<p>Registruje typizovan\u00e9 Java rozhranie ako klienta REST<\/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\u010duje injektovanie in\u0161tancie typizovan\u00e9ho rozhrania REST klienta<\/p>\n<pre><code class=\"plaintext\">@Autowired \/\/ or @Inject\n@RestClient\nMyRestClient restClient;\n<\/code><\/pre>\n<p>Invocation<\/p>\n<p>Vol\u00e1 koncov\u00fd bod REST<\/p>\n<pre><code class=\"plaintext\">System.out.println(\n   restClient.getSalutation());\n<\/code><\/pre>\n<p>mp-rest\/url<\/p>\n<p>Ur\u010duje koncov\u00fd bod REST<\/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>Zhrnutie<\/h3>\n<p>\nV tomto blogu, ktor\u00fd bude predov\u0161etk\u00fdm u\u017eito\u010dn\u00fd pre v\u00fdvoj\u00e1rov Spring, sme stru\u010dne presk\u00famali, ako v Quarkus pou\u017e\u00edva\u0165 API rozhrania Spring spolu s API rozhraniami MicroProfile, aby sa vyv\u00edjali mikroslu\u017eby Java a n\u00e1sledne sa kompilovali do nat\u00edvneho bin\u00e1rneho k\u00f3du, ktor\u00fd u\u0161etr\u00ed stovky megabajtov opera\u010dnej pam\u00e4te a sp\u00fa\u0161\u0165a sa za nieko\u013eko milisek\u00fand.<\/p>\n<p>Ako ste u\u017e pochopili, \u010fal\u0161ie inform\u00e1cie o podpore API rozhran\u00ed Spring a MicroProfile, ako aj mno\u017estvo \u010fal\u0161\u00edch u\u017eito\u010dn\u00fdch inform\u00e1ci\u00ed n\u00e1jdete v <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/\">pr\u00edru\u010dk\u00e1ch Quarkus<\/a><\/noindex>.<br \/>\n<br \/>Zdroj: <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\/sk\/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=\"sk_SK\" \/>\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\/sk\/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\udd47Ako Quarkus sp\u00e1ja MicroProfile a Spring | ProHoster","description":"Ahojte, a m\u00e1te pred sebou tret\u00ed pr\u00edspevok zo s\u00e9rie o Quarkus!","canonical_url":"https:\/\/prohoster.info\/sk\/blog\/administrirovanie\/kak-quarkus-obedinyaet-microprofile-i-spring","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sk_SK","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\/sk\/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\/sk\/wp-json\/wp\/v2\/posts\/79987","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/comments?post=79987"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/posts\/79987\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/media\/79988"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/media?parent=79987"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/categories?post=79987"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/tags?post=79987"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}