{"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\/sl\/blog\/administrirovanie\/kak-quarkus-obedinyaet-microprofile-i-spring","title":{"rendered":"Kako Quarkus povezuje MicroProfile in Spring","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Pozdravljeni vsi, to je tretji prispevek v seriji o Quarkusu!<\/p>\n<p><img decoding=\"async\" alt=\"Kako Quarkus povezuje MicroProfile in Spring\" src=\"\/wp-content\/uploads\/2020\/05\/d98ff470b49f8de1fa488a6818160969.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPri razvijanju Java mikroservisov se pogosto smatra, da <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/blog\/2019\/02\/28\/jumpstart-microservices-microprofile-starter-beta\/\">Eclipse MicroProfile<\/a><\/noindex> in <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/topics\/spring-boot\/\">Spring Boot<\/a><\/noindex> \u2013 to so lo\u010deni in neodvisni API-ji. Obi\u010dajno programerji uporabljajo tiste API-je, ki so jim znani, saj u\u010denje novih ogrodij in komponent za izvajanje zahteva veliko \u010dasa. Danes bomo poskusili poenostaviti usvajanje nekaterih priljubljenih <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/blog\/2018\/11\/21\/eclipse-microprofile-for-spring-boot-developers\/\">MicroProfile API-jev za Spring razvijalce<\/a><\/noindex> in pokazali, kako hkrati uporabiti Spring API in nove uporabne mo\u017enosti. <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/\">Quarkus<\/a><\/noindex>.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\n\u010ce nekoliko podrobneje, bomo najprej obravnavali podro\u010dje uporabe in podrobnosti o tem, kako Quarkus podpira Spring API-je, da bomo pokazali Spring razvijalcem, kako lahko uporabljajo MicroProfile API v svojem vsakdanjem delu. Potem bomo predstavili MicroProfile API-je, ki bodo koristni Spring razvijalcem pri ustvarjanju mikroservisov.<\/p>\n<p>Zakaj prav Quarkus? Prvi\u010d, to je live coding, torej samodejno ponovno nalaganje vseh sprememb v MicroProfile API-jih, Spring API-jih in drugih Java API-jih, kar se izvede z eno samo ukazom: mvn quarkus:dev. Drugi\u010d, obravnavamo <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">na\u0161 primer<\/a><\/noindex> storitev Person (ta se sestavi iz Spring, MicroProfile in JPA API-jev v binarno datoteko z uporabo nativne slike GraalVM) se za\u017eene v samo 0,055 sekunde in zasede pribli\u017eno 90 MB pomnilnika (RSS) na kon\u010dni to\u010dki RESTful aplikacije. Njena kompilacija pa se izvede z eno samo ukazom: mvn package -Pnative.<\/p>\n<p>Ne bomo se poglabljali v podrobnosti MicroProfile, ampak se bomo trudili, da pomagamo Spring razvijalcem razumeti, kako uporabiti Spring API-je skupaj z MicroProfile API-ji v Quarkusu.<\/p>\n<h3>Kontejnerji in Kubernetes<\/h3>\n<p>\nDa ne bi preobremenili tega \u010dlanka, bomo tukaj obravnavali le vi\u0161je ravni vidike podpore <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/developer-tools\/kubernetes\">Kubernetes<\/a><\/noindex>, saj je to pomembno razumeti. Quarkus se pozicionira kot Java kup za Kubernetes, ki minimizira porabo pomnilnika in \u010das zagona Java aplikacij in storitev, hkrati pa pove\u010duje gostoto njihovega name\u0161\u010danja na gostitelju in zmanj\u0161uje skupne stro\u0161ke.<\/p>\n<p>Quarkus prav tako <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/kubernetes-resources\">podpira samodejno generiranje<\/a><\/noindex> Kubernetes virov in ponuja <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/\">navodila<\/a><\/noindex> za uvajanje na platformah Kubernetes in Red Hat OpenShift. Poleg tega Quarkus samodejno generira datoteke Dockerfile.jvm (JVM pakiranje) in Dockerfile.native (pakiranje nativne binarne slike), potrebne za ustvarjanje kontejnerjev.<\/p>\n<p>In conclusion, focusing on Kubernetes as the target deployment environment, Quarkus does not use Java frameworks in cases where similar functionality is implemented at the Kubernetes platform level itself. Table 1 presents a functional mapping of Kubernetes and typical Java frameworks used by Spring developers.<\/p>\n<p><i>Table 1. Functional mapping of Java frameworks and Kubernetes.<\/i><\/p>\n<p>Functionality<br \/>\nTraditional 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>Porazdelitev obremenitve<br \/>\nRibbon (client-side)<br \/>\nService, Replication Controller (server-side)<\/p>\n<p><\/p>\n<h3>Compiling and running the example code<\/h3>\n<p>\nIn this article, we refer to <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">the example project<\/a><\/noindex>, where the Spring and MicroProfile APIs are used together and even that very Java class. The code from this example can be compiled and run from the command line; see the README.md file for more details.<\/p>\n<h3>Spring Framework APIs<\/h3>\n<p><\/p>\n<h4>Dependency Injection<\/h4>\n<p>\nQuarkus supports a wide range of <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/cdi-reference\">Contexts and Dependency Injection (CDI) APIs<\/a><\/noindex> and Spring Dependency Injection (Spring DI) APIs. If you are working with 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 and Jakarta EE<\/a><\/noindex>, you are already well acquainted with CDI. On the other hand, Spring developers can use the Quarkus Extension for Spring DI API to ensure compatibility with Spring DI. Examples of using supported Spring DI APIs are provided in Table 2.<\/p>\n<p>V <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">the project from our example<\/a><\/noindex> uses both CDI and Spring Dependency Injection. More information and examples on this topic can be found in the Quarkus guide called <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/spring-di\">Spring DI Guide<\/a><\/noindex>.<\/p>\n<p><i>Table 2. Examples of using supported Spring DI APIs.<\/i><\/p>\n<p>Supported features of Spring DI<br \/>\nPrimeri<\/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\">Vrednost<\/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\">Storitev<\/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 framework<\/h4>\n<p>\nUporabnikom MicroProfile bo v\u0161e\u010d, da Quarkus podpira JAX-RS, MicroProfile Rest Client, JSON-P in JSON-B kot osnovni model za spletno programiranje. Razvijalce v Springu bo razveselila nedavno dodana podpora Quarkusa za Spring Web API, zlasti za vmesnike, ki skrbijo za REST. Po analogiji s Spring DI je glavni cilj podpore Spring Web API omogo\u010diti razvijalcem Springa, da uporabljajo API vmesnike Spring Web skupaj z API vmesniki MicroProfile. Primeri uporabe podprtih Spring Web API so navedeni v tabeli 3, dodatne informacije in primeri pa so na voljo v vodniku Quarkus, ki nosi naziv <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/spring-web\">Spring Web Guide<\/a><\/noindex>.<\/p>\n<p><i>Tabela 3. Primeri uporabe podprtih API vmesnikov Spring Web.<\/i><\/p>\n<p>Podprte funkcionalnosti Spring Web<br \/>\nPrimeri<\/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 (delno)<\/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>\nUporabnikom MicroProfile bo prav tako ustrezala podpora Quarkusa za JPA z uporabo Hibernate ORM. Za razvijalce Springa je dobra novica, da Quarkus podpira splo\u0161no sprejete anotacije in tipe Spring Data JPA. Primeri uporabe podprtih API vmesnikov Spring Data JPA so navedeni v tabeli 4.<br \/>\nV <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">the project from our example<\/a><\/noindex> uporabljajo se API vmesniki Spring Data JPA, dodatne informacije pa so na voljo v vodniku Quarkus z naslovom <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/spring-data-jpa-guide\">Spring Data JPA Guide<\/a><\/noindex>.<\/p>\n<p><i>Tabela 4. Primeri uporabe podprtih API vmesnikov Spring Data JPA.<\/i><\/p>\n<p>Podprte funkcionalnosti Spring Data JPA<br \/>\nPrimeri<\/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 vmesniki MicroProfile<\/h3>\n<p><\/p>\n<h4>Odporna na napake (Fault tolerance)<\/h4>\n<p>\nKonstrukcije odpornosti na gre\u0161ke so zelo pomembne za prepre\u010devanje kaskadnih napak in za ustvarjanje zanesljivih mikroservisnih arhitektur. Razvijalci Spring \u017ee leta uporabljajo circuit-breakerje za odpornost na napake. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Netflix\/Hystrix\">Hystrix<\/a><\/noindex>. Hystrix pa \u017ee dolgo ni bil posodobljen, medtem ko se microProfile-ov Fault Tolerance trenutno aktivno razvija in ima \u017ee ve\u010d let izku\u0161enj z uporabami v produkciji. Zato se za pove\u010danje zanesljivosti storitev v Quarkusu priporo\u010da uporaba API vmesnikov MicroProfile Fault Tolerance, katerih primere uporabe najdete v tabeli 5. Dodatne informacije so na voljo v vodniku Quarkus. <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/microprofile-fault-tolerance\">Vodnik za odpornost na napake<\/a><\/noindex>.<\/p>\n<p><i>Tabela 5. Primeri uporabe podprtih API vmesnikov MicroProfile Fault Tolerance.<\/i><\/p>\n<p>Funkcije MicroProfile Fault Tolerance<br \/>\nOpis<br \/>\nPrimeri<\/p>\n<p>@Asynchronous<\/p>\n<p>Izvajanje logike v lo\u010denem 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>Omejevanje \u0161tevila hkratnih zahtevkov<\/p>\n<pre><code class=\"plaintext\">@Bulkhead(5)\npublic void fiveConcurrent() {\n   makeRemoteCall(); \/\/...\n}\n<\/code><\/pre>\n<p>@CircuitBreaker<\/p>\n<p>Pametno obvladovanje napak in obnova po napakah<\/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>Klic alternativne logike v primeru napake<\/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>Ponovni poskus pri napaki zahtevka<\/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>Nadzor \u010dasa \u010dakanja pri napaki<\/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>Preverjanje storitev (Health Service)<\/h4>\n<p>\nPlatforme Kubernetes spremljajo delovanje kontejnerjev z uporabo posebnih storitev. Da bi spodnja platforma lahko spremljala storitve, razvijalci Spring obi\u010dajno uporabljajo prilagodljive HealthIndicator in Spring Boot Actuator. V Quarkusu to lahko storite z MicroProfile Health, ki privzeto izvaja nadzor \u017eivljenjske sposobnosti (liveness check), vendar jih lahko nastavite tudi na hkratno preverjanje poslu\u0161nosti in pripravljenosti (readiness). Primeri uporabe podprtih API MicroProfile Health so navedeni v tabeli 6, dodatne informacije pa so predstavljene v vodniku Quarkus. <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/microprofile-health\">Vodnik za zdravje<\/a><\/noindex>.<\/p>\n<p><i>Tabela 6. Primeri uporabe podprtih API vmesnikov MicroProfile Health.<\/i><\/p>\n<p>Funkcije MicroProfile Health<br \/>\nOpis<br \/>\nPrimeri<\/p>\n<p>@Liveness<\/p>\n<p>Platforma izvede ponovno nalaganje okvarjenih kontejneriziranih aplikacij.<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>Plattform ne bo usmerjala prometa na kontejnerizirane aplikacije, \u010de niso pripravljene<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>Metrike<\/h4>\n<p>\nAplikacije zagotavljajo metrike bodisi v operativne namene (za spremljanje KPI-jev zmogljivosti SLA) bodisi v neoperativne (poslovne KPI-jev SLA). Razvijalci v Springu zagotavljajo metrike prek Spring Boot Actuator in Micrometer. Quarkus uporablja MicroProfile Metrics za zagotavljanje osnovnih metrik (JVM in operacijski sistem), metrik dobavitelja (Quarkus) in metrik aplikacij. MicroProfile Metrics zahteva, da implementacija podpira izhodne formate JSON in OpenMetrics (Prometheus). Primeri uporabe MicroProfile Metrics API so prikazani v Tabeli 7.<\/p>\n<p>V <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">the project from our example<\/a><\/noindex> MicroProfile Metrics se uporablja za zagotavljanje metrik aplikacij. Dodatne informacije lahko najdete v priro\u010dniku Quarkus <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/microprofile-metrics\">Vodnik po metrikah<\/a><\/noindex>.<\/p>\n<p><i>Tabela 7. Primeri uporabe API-jev MicroProfile Metrics.<\/i><\/p>\n<p>Funkcije MicroProfile Metrics<br \/>\nOpis<br \/>\nPrimeri<\/p>\n<p>@Counted<\/p>\n<p>Ozna\u010duje \u0161tevilo, ki \u0161teje \u0161tevilo klicev annotiranega 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\u010duje gauge-senzor, ki \u0161teje \u0161tevilo hkratnih klicev annotiranega 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\u010duje gauge-senzor, ki meri vrednost annotiranega 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\u010duje meter-senzor, ki spremlja frekvenco klicev annotiranega 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\">Metrika<\/a><\/noindex><\/p>\n<p>Annotacija, ki vsebuje informacije o metapodatkih ob prejemu zahteve za dodajanje ali dokon\u010danje 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\">Merjeno<\/a><\/noindex><\/p>\n<p>Ozna\u010duje \u010dasomer, ki spremlja trajanje annotiranega 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>Merilne to\u010dke (Metrics Endpoints)<\/b><\/p>\n<p>Merila aplikacij <noindex><a rel=\"nofollow\" href=\"http:\/\/localhost\">localhost<\/a><\/noindex>:8080\/metrics\/application<br \/>\nOsnovna merila <noindex><a rel=\"nofollow\" href=\"http:\/\/localhost\">localhost<\/a><\/noindex>:8080\/metrics\/base<br \/>\nMerila dobavitelja <noindex><a rel=\"nofollow\" href=\"http:\/\/localhost\">localhost<\/a><\/noindex>:8080\/metrics\/vendor<br \/>\nVsa merila <noindex><a rel=\"nofollow\" href=\"http:\/\/localhost\">localhost<\/a><\/noindex>:8080\/metrics<\/p>\n<h4>Rest-strank MicroProfile<\/h4>\n<p>\nMikroservisi pogosto nudijo RESTful kon\u010dne to\u010dke, za katere so potrebni ustrezni API-ji strank. Za delo s RESTful kon\u010dnimi to\u010dkami Spring razvijalci obi\u010dajno uporabljajo RestTemplate. Quarkus pa ponuja za ta namen API-\u010dke MicroProfile Rest Client, katerih primere uporabe najdete v tabeli 8.<\/p>\n<p>V <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">the project from our example<\/a><\/noindex> Uporaba RESTful kon\u010dnih to\u010dk se izvaja s pomo\u010djo MicroProfile Rest Client. Dodatne informacije in primeri so na voljo v Quarkus priro\u010dniku. <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/rest-client\">Priro\u010dnik o Rest Client<\/a><\/noindex>.<\/p>\n<p><i>Tabela 8. Primeri uporabe API-jev MicroProfile Rest Client.<\/i><\/p>\n<p>Funkcije MicroProfile Rest Client<br \/>\nOpis<br \/>\nPrimeri<\/p>\n<p>@RegisterRestClient<\/p>\n<p>Registrira tipizirani Java vmesnik kot REST klienta.<\/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>Ozmarka vstavitve primerka tipiziranega vmesnika REST klienta.<\/p>\n<pre><code class=\"plaintext\">@Autowired \/\/ or @Inject\n@RestClient\nMyRestClient restClient;\n<\/code><\/pre>\n<p>Klic<\/p>\n<p>Kli\u010de REST kon\u010dno to\u010dko.<\/p>\n<pre><code class=\"plaintext\">System.out.println(\n   restClient.getSalutation());\n<\/code><\/pre>\n<p>mp-rest\/url<\/p>\n<p>Dolo\u010da REST kon\u010dno to\u010dko.<\/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\u010dki<\/h3>\n<p>\nV tem blogu, ki bo v prvi vrsti koristen za Spring razvijalce, bomo na kratko obravnavali, kako v Quarkusu uporabiti Spring API-je skupaj z MicroProfile API-ji za razvoj Java mikroservisov in njihovo kompilacijo v nativno binarno kodo, kar prihrani stotine megabajtov pomnilnika in se za\u017eene v nekaj milisekundah.<\/p>\n<p>Kot ste \u017ee razumeli, dodatne informacije o podpori Spring in MicroProfile API-jem ter \u0161tevilne druge koristne informacije najdete v <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/\">Quarkus priro\u010dnikih<\/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\/sl\/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=\"sl_SI\" \/>\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\/sl\/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 zdru\u017euje MicroProfile in Spring | ProHoster","description":"Pozdravljeni vsi, to je tretji prispevek v seriji o Quarkusu!","canonical_url":"https:\/\/prohoster.info\/sl\/blog\/administrirovanie\/kak-quarkus-obedinyaet-microprofile-i-spring","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sl_SI","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\/sl\/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\/sl\/wp-json\/wp\/v2\/posts\/79987","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/comments?post=79987"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/posts\/79987\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/media\/79988"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/media?parent=79987"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/categories?post=79987"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sl\/wp-json\/wp\/v2\/tags?post=79987"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}