{"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\/sv\/blog\/administrirovanie\/kak-quarkus-obedinyaet-microprofile-i-spring","title":{"rendered":"Hur Quarkus f\u00f6renar MicroProfile och Spring","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Hej alla, och h\u00e4r \u00e4r det tredje inl\u00e4gget i serien om Quarkus!<\/p>\n<p><img decoding=\"async\" alt=\"Hur Quarkus f\u00f6renar MicroProfile och Spring\" src=\"\/wp-content\/uploads\/2020\/05\/d98ff470b49f8de1fa488a6818160969.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nN\u00e4r man utvecklar Java-mikrotj\u00e4nster anses det ofta att <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/blog\/2019\/02\/28\/jumpstart-microservices-microprofile-starter-beta\/\">Eclipse MicroProfile<\/a><\/noindex> och <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/topics\/spring-boot\/\">Spring Boot<\/a><\/noindex> \u00e4r separata och oberoende API:er. Som standard tenderar programmerare att anv\u00e4nda de API:er de redan \u00e4r bekanta med, eftersom det tar tid att l\u00e4ra sig nya ramverk och runtime-komponenter. Idag ska vi f\u00f6rs\u00f6ka f\u00f6renkla inl\u00e4rningen av n\u00e5gra popul\u00e4ra <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/blog\/2018\/11\/21\/eclipse-microprofile-for-spring-boot-developers\/\">MicroProfile API f\u00f6r Spring-utvecklare<\/a><\/noindex> och vi kommer att visa hur man kan anv\u00e4nda Spring API och nya anv\u00e4ndbara funktioner samtidigt. <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/\">Quarkus<\/a><\/noindex>.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nOm vi g\u00e5r in lite mer detaljerat, s\u00e5 f\u00f6rst ska vi titta p\u00e5 anv\u00e4ndningsomr\u00e5dena och detaljerna kring hur Quarkus st\u00f6der Spring API:er, f\u00f6r att visa Spring-utvecklare hur de kan anv\u00e4nda MicroProfile API i sitt dagliga arbete. D\u00e4refter kommer vi att g\u00e5 igenom MicroProfile API som kommer att vara till nytta f\u00f6r Spring-utvecklare vid skapandet av mikrotj\u00e4nster.<\/p>\n<p>Varf\u00f6r just Quarkus? F\u00f6r det f\u00f6rsta m\u00f6jligg\u00f6r det live coding, vilket inneb\u00e4r automatisk omstart av alla \u00e4ndringar i MicroProfile API, Spring API och andra Java API, och det g\u00f6rs med endast ett kommando: mvn quarkus:dev. F\u00f6r det andra, det vi diskuterar i <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">v\u00e5rt exempel<\/a><\/noindex> Person-tj\u00e4nsten (som kompileras fr\u00e5n API:erna Spring, MicroProfile och JPA till en bin\u00e4r fil med hj\u00e4lp av GraalVM:s inbyggda bild) startar p\u00e5 bara 0,055 sekunder och upptar cirka 90 MB i RAM (RSS) p\u00e5 den RESTful-applikations slutpunkten. Sj\u00e4lvklart s\u00e5 g\u00f6rs sj\u00e4lva kompileringen med bara ett kommando: mvn package -Pnative.<\/p>\n<p>Vi ska inte g\u00e5 in p\u00e5 detaljer kring MicroProfile, utan bara f\u00f6rs\u00f6ka hj\u00e4lpa Spring-utvecklare att f\u00f6rst\u00e5 hur API:er fr\u00e5n Spring kan anv\u00e4ndas tillsammans med MicroProfile API i Quarkus.<\/p>\n<h3>Containrar och Kubernetes<\/h3>\n<p>\nF\u00f6r att inte \u00f6verbelasta den h\u00e4r artikeln kommer vi h\u00e4r bara att g\u00e5 igenom h\u00f6g-niv\u00e5 aspekter av st\u00f6det <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/developer-tools\/kubernetes\">Kubernetes<\/a><\/noindex>, eftersom det \u00e4r viktigt att f\u00f6rst\u00e5. Quarkus marknadsf\u00f6rs som en Java-stack f\u00f6r Kubernetes, som syftar till att minimera minnesanv\u00e4ndning och starttider f\u00f6r Java-applikationer och tj\u00e4nster, och d\u00e4rmed \u00f6ka deras kapacitet i en v\u00e4rd och minska de totala kostnaderna.<\/p>\n<p>Quarkus st\u00f6der ocks\u00e5 <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/kubernetes-resources\">autogenerering<\/a><\/noindex> av Kubernetes-resurser och erbjuder <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/\">manualen<\/a><\/noindex> f\u00f6r distribution p\u00e5 Kubernetes-plattformar och Red Hat OpenShift. Dessutom genererar Quarkus automatiskt Dockerfile.jvm (JVM-packaging) och Dockerfile.native (native binary packaging) filer som kr\u00e4vs f\u00f6r att skapa containrar.<\/p>\n<p>Och slutligen, med Kubernetes som m\u00e5lmilj\u00f6 f\u00f6r distribution, anv\u00e4nder Quarkus inte Java-ramverk n\u00e4r motsvarande funktionalitet implementeras p\u00e5 Kubernetes-plattformens niv\u00e5. Tabell 1 visar en karta \u00f6ver funktionalitetens \u00f6verensst\u00e4mmelse mellan Kubernetes och typiska Java-ramverk som anv\u00e4nds av Spring-utvecklare.<\/p>\n<p><i>Tabell 1. Karta \u00f6ver funktionalitetens \u00f6verensst\u00e4mmelse mellan Java-ramverk och Kubernetes.<\/i><\/p>\n<p>Funktionalitet<br \/>\nTraditionell Spring Boot<br \/>\nKubernetes<\/p>\n<p>Tj\u00e4nstuppt\u00e4ckning<br \/>\nEureka<br \/>\nDNS<\/p>\n<p>Konfiguration<br \/>\nSpring Cloud Config<br \/>\nConfig Maps \/ Secrets<\/p>\n<p>Lastbalansering<br \/>\nRibbon (p\u00e5 klientsidan)<br \/>\nTj\u00e4nst, Replication Controller (p\u00e5 serversidan)<\/p>\n<p><\/p>\n<h3>Kompilera och k\u00f6r koden fr\u00e5n exemplet<\/h3>\n<p>\nI denna artikel h\u00e4nvisar vi till <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">exempelprojektet<\/a><\/noindex>, d\u00e4r API:erna fr\u00e5n b\u00e5de Spring och MicroProfile anv\u00e4nds tillsammans, samt den specifika Java-klassen. Koden fr\u00e5n det h\u00e4r exemplet kan kompileras och k\u00f6ras fr\u00e5n kommandoraden; se README.md-filen f\u00f6r mer information.<\/p>\n<h3>API:er fr\u00e5n Spring Framework<\/h3>\n<p><\/p>\n<h4>Beroendeinjektion<\/h4>\n<p>\nQuarkus st\u00f6der en m\u00e4ngd olika <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/cdi-reference\">API:er f\u00f6r Contexts and Dependency Injection (CDI)<\/a><\/noindex> och API:er f\u00f6r Spring Dependency Injection (Spring DI). Om du arbetar 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 och Jakarta EE<\/a><\/noindex>, \u00e4r du redan v\u00e4l bekant med CDI. \u00c5 andra sidan kan Spring-utvecklare anv\u00e4nda Quarkus Extension for Spring DI API f\u00f6r att s\u00e4kerst\u00e4lla kompatibilitet med Spring DI. Exempel p\u00e5 anv\u00e4ndning av de st\u00f6dda Spring DI API:erna ges i Tabell 2.<\/p>\n<p>I <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">projektet fr\u00e5n v\u00e5rt exempel<\/a><\/noindex> anv\u00e4nder b\u00e5de CDI och Spring Dependency Injection. Mer information och exempel om detta finns i Quarkus-guiden som kallas <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/spring-di\">Spring DI Guide<\/a><\/noindex>.<\/p>\n<p><i>Tabell 2. Exempel p\u00e5 anv\u00e4ndning av st\u00f6dda API:er f\u00f6r Spring DI.<\/i><\/p>\n<p>St\u00f6dda funktioner f\u00f6r Spring DI<br \/>\nExempel<\/p>\n<p>Konstrukt\u00f6rsinjektion<\/p>\n<pre><code class=\"plaintext\">public PersonSpringController(\n   PersonSpringRepository personRepository,  \/\/\/ injicerad      \n   PersonSpringMPService personService) {    \/\/\/ injicerad\n      this.personRepository = personRepository;\n      this.personService = personService;\n}\n<\/code><\/pre>\n<p>F\u00e4ltinjektion<br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/autowired\/\" class=\"user_link\">Autowired<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/value\/\" class=\"user_link\">V\u00e4rde<\/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\">B\u00f6n<\/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\">Tj\u00e4nst<\/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>Webb-ramverk<\/h4>\n<p>\nMicroProfile-anv\u00e4ndare kommer att uppskatta att Quarkus st\u00f6djer JAX-RS, MicroProfile Rest Client, JSON-P och JSON-B som sin prim\u00e4ra modell f\u00f6r webbprogrammering. Spring-utvecklare kommer att bli glada \u00f6ver det nyligen tillagda st\u00f6det f\u00f6r Spring Web API i Quarkus, s\u00e4rskilt f\u00f6r de gr\u00e4nssnitt som ansvarar f\u00f6r REST. P\u00e5 samma s\u00e4tt som med Spring DI \u00e4r huvudm\u00e5let med st\u00f6det f\u00f6r Spring Web API att Spring-utvecklare ska kunna anv\u00e4nda Spring Web API:er tillsammans med MicroProfile API:er. Exempel p\u00e5 hur de st\u00f6dda Spring Web API:erna anv\u00e4nds ges i tabell 3, och mer information och exempel om detta finns i Quarkus-guiden som heter <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/spring-web\">Spring Web Guide<\/a><\/noindex>.<\/p>\n<p><i>Tabell 3. Exempel p\u00e5 hur de st\u00f6dda Spring Web API:erna anv\u00e4nds.<\/i><\/p>\n<p>St\u00f6dda funktioner f\u00f6r Spring Web<br \/>\nExempel<\/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>\nMicroProfile-anv\u00e4ndare kommer ocks\u00e5 att uppskatta att Quarkus st\u00f6djer JPA genom Hibernate ORM. F\u00f6r Spring-utvecklare finns det ocks\u00e5 goda nyheter: Quarkus st\u00f6djer de vanliga annoteringarna och typerna i Spring Data JPA. Exempel p\u00e5 hur de st\u00f6dda Spring Data JPA API:erna anv\u00e4nds ges i tabell 4.<br \/>\nI <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">projektet fr\u00e5n v\u00e5rt exempel<\/a><\/noindex> anv\u00e4nds API:er fr\u00e5n Spring Data JPA, och mer information finns i Quarkus-guiden som heter <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. Exempel p\u00e5 hur de st\u00f6dda Spring Data JPA API:erna anv\u00e4nds.<\/i><\/p>\n<p>St\u00f6dda funktioner f\u00f6r Spring Data JPA<br \/>\nExempel<\/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 Fragment<\/p>\n<pre><code class=\"plaintext\">public interface PersonRepository\n         extends JpaRepository,\n                 PersonFragment {\n   ...\n}\n<\/code><\/pre>\n<p>H\u00e4rledda fr\u00e5gemetoder<\/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>Anv\u00e4ndardefinierade fr\u00e5gor<\/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 fr\u00e5n MicroProfile<\/h3>\n<p><\/p>\n<h4>Fels\u00e4kerhet (Fault tolerance)<\/h4>\n<p>\nFunktionalitet f\u00f6r felhantering \u00e4r mycket viktig f\u00f6r att f\u00f6rhindra kaskadfel och skapa p\u00e5litliga mikrotj\u00e4nstarkitekturer. Spring-utvecklare har under m\u00e5nga \u00e5r anv\u00e4nt kretsbrytare f\u00f6r felhantering. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Netflix\/Hystrix\">Hystrix<\/a><\/noindex>. Men Hystrix har inte uppdaterats p\u00e5 l\u00e4nge, medan MicroProfile:s felhantering nu aktivt utvecklas och har flera \u00e5rs produktionserfarenhet bakom sig. D\u00e4rf\u00f6r rekommenderas anv\u00e4ndning av MicroProfile Fault Tolerance API:er i Quarkus f\u00f6r att \u00f6ka tj\u00e4nsternas tillf\u00f6rlitlighet, med exempel som ges i tabell 5. Ytterligare information finns i Quarkus-handboken. <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/microprofile-fault-tolerance\">Felhanteringsguide<\/a><\/noindex>.<\/p>\n<p><i>Tabell 5. Exempel p\u00e5 anv\u00e4ndning av st\u00f6dda MicroProfile Fault Tolerance API:er.<\/i><\/p>\n<p>Funktioner f\u00f6r MicroProfile Fault Tolerance<br \/>\nBeskrivning<br \/>\nExempel<\/p>\n<p>@Asynkron<\/p>\n<p>Utf\u00f6r logik i en separat tr\u00e5d<\/p>\n<pre><code class=\"plaintext\">@Asynkron\n@Retry\npublic Future getSalutation() {\n   ...\n   return future;\n}\n<\/code><\/pre>\n<p>@Bulkhead<\/p>\n<p>Begr\u00e4nsning av antalet samtidiga f\u00f6rfr\u00e5gningar<\/p>\n<pre><code class=\"plaintext\">@Bulkhead(5)\npublic void fiveConcurrent() {\n   makeRemoteCall(); \/\/...\n}\n<\/code><\/pre>\n<p>@CircuitBreaker<\/p>\n<p>Intelligent felhantering och \u00e5terh\u00e4mtning efter fel<\/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>Anropa alternativ logik vid fel<\/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>Upprepa vid fel i f\u00f6rfr\u00e5gan<\/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 f\u00f6r v\u00e4ntan vid fel<\/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>Tj\u00e4nste\u00f6vervakning (Service Health)<\/h4>\n<p>\nKubernetes-plattformar \u00f6vervakar h\u00e4lsan hos containrar med speciella tj\u00e4nster. F\u00f6r att den underliggande plattformen ska kunna \u00f6vervaka tj\u00e4nster anv\u00e4nder Spring-utvecklare vanligtvis anpassade HealthIndicator och Spring Boot Actuator. I Quarkus kan detta g\u00f6ras med MicroProfile Health, som som standard utf\u00f6r h\u00e4lsokontroller (liveness check) men ocks\u00e5 kan st\u00e4llas in f\u00f6r att samtidigt kontrollera liveness och readiness (beredskap). Exempel p\u00e5 anv\u00e4ndning av st\u00f6dda MicroProfile Health API:er ges i tabell 6, och ytterligare information finns i Quarkus-handboken. <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/microprofile-health\">H\u00e4lsoguide<\/a><\/noindex>.<\/p>\n<p><i>Tabell 6. Exempel p\u00e5 anv\u00e4ndning av st\u00f6dda MicroProfile Health API:er.<\/i><\/p>\n<p>Funktioner f\u00f6r MicroProfile Health<br \/>\nBeskrivning<br \/>\nExempel<\/p>\n<p>@Liveness<\/p>\n<p>Plattformen utf\u00f6r omstart av trasiga containrar av applikationer<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 kommer inte att skicka trafik till containeriserade applikationer om de inte \u00e4r redo<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>M\u00e4tv\u00e4rden<\/h4>\n<p>\nApplikationer tillhandah\u00e5ller metrik antingen f\u00f6r operativa syften (f\u00f6r att \u00f6vervaka SLA-prestanda) eller f\u00f6r icke-operativa (aff\u00e4rs-SLA-m\u00e5tt). Spring-utvecklare tillhandah\u00e5ller metrik via Spring Boot Actuator och Micrometer. \u00c5 sin sida anv\u00e4nder Quarkus MicroProfile Metrics f\u00f6r att tillhandah\u00e5lla grundl\u00e4ggande metrik (JVM och operativsystem), leverant\u00f6rsmetrik (Quarkus) och applikationsmetrik. MicroProfile Metrics kr\u00e4ver att implementeringen st\u00f6djer utdataformaten JSON och OpenMetrics (Prometheus). Exempel p\u00e5 anv\u00e4ndning av MicroProfile Metrics API finns i tabell 7.<\/p>\n<p>I <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">projektet fr\u00e5n v\u00e5rt exempel<\/a><\/noindex> MicroProfile Metrics anv\u00e4nds f\u00f6r att tillhandah\u00e5lla applikationsmetrik. Mer information finns i Quarkus-handledningen <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/microprofile-metrics\">Metrikguide<\/a><\/noindex>.<\/p>\n<p><i>Tabell 7. Exempel p\u00e5 anv\u00e4ndning av MicroProfile Metrics API.<\/i><\/p>\n<p>Funktioner f\u00f6r MicroProfile Metrics<br \/>\nBeskrivning<br \/>\nExempel<\/p>\n<p>@Counted<\/p>\n<p>Anger en counter som r\u00e4knar antalet anrop p\u00e5 den annoterade 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>Anger en gauge som r\u00e4knar antalet samtidiga anrop p\u00e5 den annoterade 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>Anger en gauge som m\u00e4ter v\u00e4rdet p\u00e5 den annoterade 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>Anger en meter som sp\u00e5rar frekvensen av anropet till den annoterade 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\">Metrik<\/a><\/noindex><\/p>\n<p>Annotation som inneh\u00e5ller metadata-information n\u00e4r en beg\u00e4ran om att skapa eller producera en metrik g\u00f6rs<\/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\">Tidsinst\u00e4lld<\/a><\/noindex><\/p>\n<p>Anger en timer som sp\u00e5rar varaktigheten av den annoterade 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>Metrikslutpunkter (Metrics Endpoints)<\/b><\/p>\n<p>Applikationsmetrier <noindex><a rel=\"nofollow\" href=\"http:\/\/localhost\">localhost<\/a><\/noindex>:8080\/metrics\/application<br \/>\nGrundl\u00e4ggande metrier <noindex><a rel=\"nofollow\" href=\"http:\/\/localhost\">localhost<\/a><\/noindex>:8080\/metrics\/base<br \/>\nLeverant\u00f6rsmetrier <noindex><a rel=\"nofollow\" href=\"http:\/\/localhost\">localhost<\/a><\/noindex>:8080\/metrics\/vendor<br \/>\nAlla metrier <noindex><a rel=\"nofollow\" href=\"http:\/\/localhost\">localhost<\/a><\/noindex>:8080\/metrics<\/p>\n<h4>Restklient f\u00f6r MicroProfile<\/h4>\n<p>\nMikrotj\u00e4nster erbjuder ofta RESTful slutanrop som kr\u00e4ver motsvarande klient-API:er. F\u00f6r att anv\u00e4nda RESTful slutanrop till\u00e4mpar Spring-utvecklare vanligtvis RestTemplate. Quarkus erbjuder ist\u00e4llet MicroProfile Rest Client API:er, vars exempel finns i tabell 8.<\/p>\n<p>I <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">projektet fr\u00e5n v\u00e5rt exempel<\/a><\/noindex> anv\u00e4ndningen av RESTful slutanrop g\u00f6rs med MicroProfile Rest Client. Mer information och exempel hittar du i Quarkus-handboken <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/rest-client\">Rest Client Guide<\/a><\/noindex>.<\/p>\n<p><i>Tabell 8. Exempel p\u00e5 anv\u00e4ndning av MicroProfile Rest Client API:er.<\/i><\/p>\n<p>Funktioner i MicroProfile Rest Client<br \/>\nBeskrivning<br \/>\nExempel<\/p>\n<p>@RegisterRestClient<\/p>\n<p>Registrerar ett typat Java-gr\u00e4nssnitt 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>Markerar en instans av det typade REST-klientgr\u00e4nssnittet f\u00f6r injektion<\/p>\n<pre><code class=\"plaintext\">@Autowired \/\/ or @Inject\n@RestClient\nMyRestClient restClient;\n<\/code><\/pre>\n<p>Anrop<\/p>\n<p>Anropar REST-slutpunkten<\/p>\n<pre><code class=\"plaintext\">System.out.println(\n   restClient.getSalutation());\n<\/code><\/pre>\n<p>mp-rest\/url<\/p>\n<p>Anger REST-slutpunkten<\/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>Sammanfattning<\/h3>\n<p>\nI den h\u00e4r bloggen, som fr\u00e4mst \u00e4r till nytta f\u00f6r Spring-utvecklare, har vi kortfattat g\u00e5tt igenom hur Quarkus anv\u00e4nder API:erna fr\u00e5n Spring tillsammans med MicroProfiles API:er f\u00f6r att utveckla Java-mikrotj\u00e4nster och sedan kompilera dem till nativa bin\u00e4rkod som sparar hundratals megabyte RAM och startar p\u00e5 n\u00e5gra millisekunder.<\/p>\n<p>Som du redan har f\u00f6rst\u00e5tt, finns det mer information om st\u00f6det f\u00f6r Spring- och MicroProfile-API:er samt mycket annan nyttig information i <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/\">Quarkus-handb\u00f6cker<\/a><\/noindex>.<br \/>\n<br \/>K\u00e4lla: <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\/sv\/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=\"sv_SE\" \/>\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\/sv\/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\udd47Hur Quarkus f\u00f6renar MicroProfile och Spring | ProHoster","description":"Hej alla, och h\u00e4r \u00e4r det tredje inl\u00e4gget i serien om Quarkus!","canonical_url":"https:\/\/prohoster.info\/sv\/blog\/administrirovanie\/kak-quarkus-obedinyaet-microprofile-i-spring","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sv_SE","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\/sv\/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\/sv\/wp-json\/wp\/v2\/posts\/79987","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/comments?post=79987"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/79987\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media\/79988"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media?parent=79987"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/categories?post=79987"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/tags?post=79987"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}