{"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\/no\/blog\/administrirovanie\/kak-quarkus-obedinyaet-microprofile-i-spring","title":{"rendered":"Hvordan Quarkus kombinerer MicroProfile og Spring","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Hei alle sammen, og velkommen til det tredje innlegget i serien om Quarkus!<\/p>\n<p><img decoding=\"async\" alt=\"Hvordan Quarkus kombinerer MicroProfile og Spring\" src=\"\/wp-content\/uploads\/2020\/05\/d98ff470b49f8de1fa488a6818160969.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nN\u00e5r man utvikler Java-mikrotjenester, er det ofte en antakelse at <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/blog\/2019\/02\/28\/jumpstart-microservices-microprofile-starter-beta\/\">Eclipse MicroProfile<\/a><\/noindex> og <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/topics\/spring-boot\/\">Spring Boot<\/a><\/noindex> er separate og uavhengige API-er. Som standard bruker programmerere gjerne de API-ene de allerede er kjent med, da det tar tid \u00e5 l\u00e6re seg nye rammeverk og runtime-komponenter. I dag skal vi pr\u00f8ve \u00e5 forenkle l\u00e6ringen av noen popul\u00e6re <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/blog\/2018\/11\/21\/eclipse-microprofile-for-spring-boot-developers\/\">MicroProfile API-er for Spring-utviklere<\/a><\/noindex> og vise hvordan man kan bruke b\u00e5de Spring API og nye, nyttige funksjoner samtidig. <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/\">Quarkus<\/a><\/noindex>.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nFor \u00e5 bli litt mer detaljert, vil vi f\u00f8rst se p\u00e5 bruksomr\u00e5dene og detaljene rundt hvordan Quarkus st\u00f8tter Spring API-er, for \u00e5 vise Spring-utviklere hvordan de kan bruke MicroProfile API-er i sitt daglige arbeid. Deretter vil vi snakke om MicroProfile API-er som vil v\u00e6re nyttige for Spring-utviklere n\u00e5r de lager mikrotjenester.<\/p>\n<p>Hvorfor Quarkus? For det f\u00f8rste, det er live coding, som betyr at eventuelle endringer i MicroProfile API-er, Spring API og andre Java API-er automatisk lastes inn med bare \u00e9n kommando: mvn quarkus:dev. For det andre, i v\u00e5rt eksempel <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">kj\u00f8rer tjenesten Person (som er kompilert fra Spring, MicroProfile og JPA API-er til en bin\u00e6r fil ved hjelp av en native GraalVM-image) p\u00e5 bare 0,055 sekunder og bruker omtrent 90 MB i minne (RSS) p\u00e5 RESTful-applikasjonens endepunkt. Og selve kompileringen gj\u00f8res med bare \u00e9n kommando: mvn package -Pnative.<\/a><\/noindex> Vi vil ikke g\u00e5 i dybden om MicroProfile, men bare pr\u00f8ve \u00e5 hjelpe Spring-utviklere til \u00e5 forst\u00e5 hvordan man kan bruke Spring API-er sammen med MicroProfile API-er i Quarkus.<\/p>\n<p>Containere og Kubernetes<\/p>\n<h3>For ikke \u00e5 overbelaste denne artikkelen, vil vi her se p\u00e5 h\u00f8y-niv\u00e5 aspekter av st\u00f8tte<\/h3>\n<p>\nda dette er viktig \u00e5 forst\u00e5. Quarkus posisjonerer seg som Java-stek for Kubernetes, og har som m\u00e5l \u00e5 minimere minnebruken og oppstartstiden for Java-applikasjoner og tjenester, hvilket igjen \u00f8ker tettheten av deres distribusjon p\u00e5 verten og reduserer de totale kostnadene. <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/developer-tools\/kubernetes\">Kubernetes<\/a><\/noindex>Quarkus st\u00f8tter ogs\u00e5<\/p>\n<p>autogenerering <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/kubernetes-resources\">av Kubernetes-ressurser og tilbyr<\/a><\/noindex> veiledninger <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/\">for distribusjon p\u00e5 Kubernetes- og Red Hat OpenShift-plattformer. Dessuten genererer Quarkus automatisk Dockerfile.jvm (JVM-pakking) og Dockerfile.native (native bin\u00e6r pakking) filer som er n\u00f8dvendige for \u00e5 lage containere.<\/a><\/noindex> for distribusjon p\u00e5 Kubernetes-plattformer og Red Hat OpenShift. I tillegg genererer Quarkus automatisk Dockerfile.jvm (JVM-pakking) og Dockerfile.native (native bin\u00e6rpakking)-filer som er n\u00f8dvendige for \u00e5 lage containere.<\/p>\n<p>Og til slutt, med Kubernetes som m\u00e5lplattform, bruker Quarkus ikke Java-rammeverk n\u00e5r en tilsvarende funksjonalitet er implementert p\u00e5 Kubernetes-plattformen selv. Tabell 1 viser en funksjonskartlegging mellom Kubernetes og typiske Java-rammeverk som brukes av Spring-utviklere.<\/p>\n<p><i>Tabell 1. Funksjonskartlegging mellom Java-rammeverk og Kubernetes.<\/i><\/p>\n<p>Funksjonalitet<br \/>\nTradisjonell Spring Boot<br \/>\nKubernetes<\/p>\n<p>Service discovery<br \/>\nEureka<br \/>\nDNS<\/p>\n<p>Konfigurasjon<br \/>\nSpring Cloud Config<br \/>\nConfig Maps \/ Secrets<\/p>\n<p>Lastbalansering<br \/>\nRibbon (p\u00e5 klientsiden)<br \/>\nTjeneste, Replikasjonskontroller (p\u00e5 serversiden)<\/p>\n<p><\/p>\n<h3>Kompilering og kj\u00f8ring av koden fra eksempelet<\/h3>\n<p>\nI denne artikkelen refererer vi til <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">prosjektpr\u00f8ven<\/a><\/noindex>, der API-er fra Spring og MicroProfile brukes sammen, samt den samme Java-klassen. Koden fra dette eksempelet kan kompileres og kj\u00f8res fra kommandolinjen, se n\u00e6rmere i filen README.md.<\/p>\n<h3>API-er fra Spring Framework<\/h3>\n<p><\/p>\n<h4>Dependency Injection<\/h4>\n<p>\nQuarkus st\u00f8tter en rekke <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/cdi-reference\">API-er for Contexts and Dependency Injection (CDI)<\/a><\/noindex> og API-er for Spring Dependency Injection (Spring DI). Hvis du jobber med 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 og Jakarta EE<\/a><\/noindex>, s\u00e5 er du allerede godt kjent med CDI. P\u00e5 den annen side kan Spring-utviklere bruke Quarkus Extension for Spring DI API for \u00e5 sikre kompatibilitet med Spring DI. Eksempler p\u00e5 bruk av st\u00f8ttede Spring DI API-er er gitt i tabell 2.<\/p>\n<p>I <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">prosjektet fra v\u00e5rt eksempel<\/a><\/noindex> bruker b\u00e5de CDI og Spring Dependency Injection. Ytterligere informasjon og eksempler om dette kan finnes i Quarkus-h\u00e5ndboken, som kalles <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/spring-di\">Spring DI Guide<\/a><\/noindex>.<\/p>\n<p><i>Tabell 2. Eksempler p\u00e5 bruk av st\u00f8ttede API-er for Spring DI.<\/i><\/p>\n<p>St\u00f8ttede funksjoner for Spring DI<br \/>\nEksempler<\/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\">Verdi<\/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>Web-rammeverk<\/h4>\n<p>\nBrukere av MicroProfile vil sette pris p\u00e5 at Quarkus st\u00f8tter JAX-RS, MicroProfile Rest Client, JSON-P og JSON-B som hovedmodell for webprogrammering. Spring-utviklere vil bli glade for den nylig introduserte st\u00f8tten for Spring Web API i Quarkus, spesielt grensesnittene som ansvarer for REST. P\u00e5 samme m\u00e5te som med Spring DI, er hovedm\u00e5let med st\u00f8tten for Spring Web API \u00e5 gj\u00f8re det mulig for Spring-utviklere \u00e5 bruke Spring Web-grensesnitt sammen med MicroProfile API-grensesnitt. Eksempler p\u00e5 bruk av st\u00f8ttede Spring Web API er gitt i tabell 3, og mer informasjon og eksempler om dette kan finnes i Quarkus-guiden kalt <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/spring-web\">Spring Web Guide<\/a><\/noindex>.<\/p>\n<p><i>Tabell 3. Eksempler p\u00e5 bruk av st\u00f8ttede Spring Web API-grensesnitt.<\/i><\/p>\n<p>St\u00f8ttede funksjoner for Spring Web<br \/>\nEksempler<\/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 (delvis)<\/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>\nBrukere av MicroProfile vil ogs\u00e5 sette pris p\u00e5 at Quarkus st\u00f8tter JPA med Hibernate ORM. Det er ogs\u00e5 gode nyheter for Spring-utviklere: Quarkus st\u00f8tter de kjente annotasjonene og typene for Spring Data JPA. Eksempler p\u00e5 bruk av st\u00f8ttede API-er for Spring Data JPA er gitt i tabell 4.<br \/>\nI <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">prosjektet fra v\u00e5rt eksempel<\/a><\/noindex> brukes av API-er for Spring Data JPA, og mer informasjon er tilgjengelig i Quarkus-guiden kalt <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/spring-data-jpa-guide\">Spring Data JPA Guide<\/a><\/noindex>.<\/p>\n<p><i>Tabell 4. Eksempler p\u00e5 bruk av st\u00f8ttede API-grensesnitt for Spring Data JPA.<\/i><\/p>\n<p>St\u00f8ttede funksjoner for Spring Data JPA<br \/>\nEksempler<\/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>Avledede sp\u00f8rringsmetoder<\/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>Brukerdefinerte sp\u00f8rringer<\/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-er for MicroProfile<\/h3>\n<p><\/p>\n<h4>Feiltoleranse<\/h4>\n<p>\nFeil toleranse-konstruksjoner er essensielle for \u00e5 forhindre kaskadefeil og skape p\u00e5litelige mikrotjenestearkitekturer. Spring-utviklere har i mange \u00e5r brukt kretsbrytere for feil toleranse. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Netflix\/Hystrix\">Hystrix<\/a><\/noindex>. Men Hystrix har ikke blitt oppdatert p\u00e5 lenge, mens MicroProfile sin Feil Toleranse n\u00e5 er aktivt utviklet og har flere \u00e5rs produksjonsbruk bak seg. Derfor anbefales det \u00e5 bruke MicroProfile Feil Toleranse API-er for \u00e5 \u00f8ke p\u00e5liteligheten til tjenestene i Quarkus, med eksempler p\u00e5 bruk som finnes i tabell 5. Ytterligere informasjon om dette kan finnes i Quarkus-h\u00e5ndboken. <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/microprofile-fault-tolerance\">Feil Toleranse Guide<\/a><\/noindex>.<\/p>\n<p><i>Tabell 5. Eksempler p\u00e5 bruk av st\u00f8ttede MicroProfile Feil Toleranse API-er.<\/i><\/p>\n<p>Funksjoner i MicroProfile Feil Toleranse<br \/>\nDescription<br \/>\nEksempler<\/p>\n<p>@Asynchronous<\/p>\n<p>Utf\u00f8re logikk i en separat tr\u00e5d<\/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>Begrense antall samtidige foresp\u00f8rseler<\/p>\n<pre><code class=\"plaintext\">@Bulkhead(5)\npublic void fiveConcurrent() {\n   makeRemoteCall(); \/\/...\n}\n<\/code><\/pre>\n<p>@CircuitBreaker<\/p>\n<p>Intelligent feilbehandling og gjenoppretting etter feil<\/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>Kalle alternativ logikk ved feil<\/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>Gjenta ved foresp\u00f8rselfeil<\/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>Kontrolltid ved feil<\/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>Sjekk av tjenester (Service Health)<\/h4>\n<p>\nKubernetes-plattformer overv\u00e5ker tilstanden til containere ved hjelp av spesielle tjenester. For at den underliggende plattformen skal kunne overv\u00e5ke tjenester, bruker Spring-utviklere vanligvis tilpassede HealthIndicator og Spring Boot Actuator. I Quarkus kan dette gj\u00f8res med MicroProfile Health, som som standard utf\u00f8rer liveness check, men kan konfigureres til \u00e5 sjekke b\u00e5de liveness og readiness samtidig. Eksempler p\u00e5 bruk av st\u00f8ttede MicroProfile Health API-er finnes i tabell 6, og ytterligere informasjon er tilgjengelig i Quarkus-h\u00e5ndboken. <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/microprofile-health\">Helseguide<\/a><\/noindex>.<\/p>\n<p><i>Tabell 6. Eksempler p\u00e5 bruk av st\u00f8ttede MicroProfile Health API-er.<\/i><\/p>\n<p>Funksjoner i MicroProfile Health<br \/>\nDescription<br \/>\nEksempler<\/p>\n<p>@Liveness<\/p>\n<p>Plattformen utf\u00f8rer omstart av defekte containeriserte applikasjoner<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>Plattformen vil ikke sende trafikk til den containeriserte applikasjonen hvis den ikke er klar<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>Metrikker<\/h4>\n<p>\nApplikasjoner leverer m\u00e5linger enten for operasjonelle form\u00e5l (for \u00e5 overv\u00e5ke SLA-yteindikatorer) eller for ikke-operasjonelle (forretnings-SLA). Spring-utviklere leverer m\u00e5linger med Spring Boot Actuator og Micrometer. P\u00e5 sin side bruker Quarkus MicroProfile Metrics for \u00e5 levere grunnleggende m\u00e5linger (JVM og operativsystem), leverand\u00f8rm\u00e5linger (Quarkus) og applikasjonsm\u00e5linger. MicroProfile Metrics krever at implementeringen st\u00f8tter utdataformater som JSON og OpenMetrics (Prometheus). Eksempler p\u00e5 bruk av MicroProfile Metrics API er gitt i tabell 7.<\/p>\n<p>I <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">prosjektet fra v\u00e5rt eksempel<\/a><\/noindex> MicroProfile Metrics brukes til \u00e5 levere applikasjonsm\u00e5linger. Ytterligere informasjon finnes i Quarkus-h\u00e5ndboken. <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/microprofile-metrics\">M\u00e5leguide<\/a><\/noindex>.<\/p>\n<p><i>Tabell 7. Eksempler p\u00e5 bruk av MicroProfile Metrics API.<\/i><\/p>\n<p>Funksjoner i MicroProfile Metrics<br \/>\nDescription<br \/>\nEksempler<\/p>\n<p>@Counted<\/p>\n<p>Indikerer en counter teller, som teller antall kall til det annoterte objektet.<\/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>Indikerer en gauge sensor som teller antall parallelle kall til det annoterte objektet.<\/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>Indikerer en gauge sensor som m\u00e5ler verdien av det annoterte objektet.<\/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>Indikerer en meter sensor som overv\u00e5ker frekvensen av kall til det annoterte objektet.<\/p>\n<pre><code class=\"plaintext\">@Metered(name = \"MeteredFallback\",\n   displayName=\"Metered Fallback\",\n   description=\"Fallback frequency\")\npublic String salutationFallback() {\n   return fallbackSalutation;\n}\n<\/code><\/pre>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/metric\/\" class=\"user_link\">M\u00e5ling<\/a><\/noindex><\/p>\n<p>Annotering som inneholder metadata-informasjon som mottas n\u00e5r en foresp\u00f8rsel om opprettelse eller produksjon av en m\u00e5ling sendes.<\/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\">Tidsm\u00e5lt<\/a><\/noindex><\/p>\n<p>Indikerer en timer som overv\u00e5ker varigheten av det annoterte objektet.<\/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>Metrikkendepunkt (Metrics Endpoints)<\/b><\/p>\n<p>Applikasjonsmetrikker <noindex><a rel=\"nofollow\" href=\"http:\/\/localhost\">localhost<\/a><\/noindex>:8080\/metrics\/application<br \/>\nGrunnleggende metrikker <noindex><a rel=\"nofollow\" href=\"http:\/\/localhost\">localhost<\/a><\/noindex>:8080\/metrics\/base<br \/>\nLeverand\u00f8rmetrikker <noindex><a rel=\"nofollow\" href=\"http:\/\/localhost\">localhost<\/a><\/noindex>:8080\/metrics\/vendor<br \/>\nAlle metrikker <noindex><a rel=\"nofollow\" href=\"http:\/\/localhost\">localhost<\/a><\/noindex>:8080\/metrics<\/p>\n<h4>Rest-klient MicroProfile<\/h4>\n<p>\nMikrotjenester tilbyr ofte RESTful-endepunkter, som krever tilsvarende klient-API-er for \u00e5 fungere. For \u00e5 bruke RESTful-endepunkter, bruker Spring-utviklere vanligvis RestTemplate. Quarkus tilbyr imidlertid MicroProfile Rest Client API-er for dette form\u00e5let, med eksempler p\u00e5 bruk vist i tabell 8.<\/p>\n<p>I <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">prosjektet fra v\u00e5rt eksempel<\/a><\/noindex> Bruken av RESTful-endepunkter skjer ved hjelp av MicroProfile Rest Client. Mer informasjon og eksempler finner du i Quarkus-guiden. <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/rest-client\">Rest Client Guide<\/a><\/noindex>.<\/p>\n<p><i>Tabell 8. Eksempler p\u00e5 bruk av MicroProfile Rest Client API-er.<\/i><\/p>\n<p>Funksjoner i MicroProfile Rest Client<br \/>\nDescription<br \/>\nEksempler<\/p>\n<p>@RegisterRestClient<\/p>\n<p>Registrerer et typet Java-grensesnitt som en REST-klient<\/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>Markerer injeksjon av et instans av det typede REST-klientgrensesnittet<\/p>\n<pre><code class=\"plaintext\">@Autowired \/\/ or @Inject\n@RestClient\nMyRestClient restClient;\n<\/code><\/pre>\n<p>Invokasjon<\/p>\n<p>Kaller REST-endepunktet<\/p>\n<pre><code class=\"plaintext\">System.out.println(\n   restClient.getSalutation());\n<\/code><\/pre>\n<p>mp-rest\/url<\/p>\n<p>Angir REST-endepunktet<\/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>Resultater<\/h3>\n<p>\nI denne bloggen, som f\u00f8rst og fremst er nyttig for Spring-utviklere, vil vi kort g\u00e5 gjennom hvordan Quarkus bruker Spring API-er sammen med MicroProfile API-er for \u00e5 utvikle Java-mikrotjenester og deretter kompilere dem til et innf\u00f8dt bin\u00e6rt format som sparer hundrevis av megabyte med RAM og starter p\u00e5 et \u00f8yeblikk.<\/p>\n<p>Som du allerede har forst\u00e5tt, kan du finne mer informasjon om st\u00f8tten til Spring og MicroProfile API-er, samt mye annen nyttig informasjon i <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/\">Quarkus-guidene<\/a><\/noindex>.<br \/>\n<br \/>Kilde: <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.5 - 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\/no\/blog\/administrirovanie\/kak-quarkus-obedinyaet-microprofile-i-spring\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.5\" \/>\n\t\t<meta property=\"og:locale\" content=\"nn_NO\" \/>\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\/no\/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\udd47Hvordan Quarkus forener MicroProfile og Spring | ProHoster","description":"Hei alle sammen, og velkommen til det tredje innlegget i serien om Quarkus!","canonical_url":"https:\/\/prohoster.info\/no\/blog\/administrirovanie\/kak-quarkus-obedinyaet-microprofile-i-spring","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"nn_NO","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\/no\/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\/no\/wp-json\/wp\/v2\/posts\/79987","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/comments?post=79987"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/posts\/79987\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/media\/79988"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/media?parent=79987"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/categories?post=79987"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/no\/wp-json\/wp\/v2\/tags?post=79987"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}