{"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\/hu\/blog\/administrirovanie\/kak-quarkus-obedinyaet-microprofile-i-spring","title":{"rendered":"Hogyan egyes\u00edti a Quarkus a MicroProfile-t \u00e9s a Springet","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>\u00dcdv\u00f6zlet mindenkinek, itt van a harmadik poszt a Quarkusr\u00f3l sz\u00f3l\u00f3 sorozatunkb\u00f3l!<\/p>\n<p><img decoding=\"async\" alt=\"Hogyan egyes\u00edti a Quarkus a MicroProfile-t \u00e9s a Springet\" src=\"\/wp-content\/uploads\/2020\/05\/d98ff470b49f8de1fa488a6818160969.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nJava-mikroszolg\u00e1ltat\u00e1sok fejleszt\u00e9sekor gyakran felt\u00e9telezik, hogy <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/blog\/2019\/02\/28\/jumpstart-microservices-microprofile-starter-beta\/\">Eclipse MicroProfile<\/a><\/noindex> \u00e9s <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/topics\/spring-boot\/\">Spring Boot<\/a><\/noindex> \u2013 ezek k\u00fcl\u00f6n\u00e1ll\u00f3 \u00e9s egym\u00e1st\u00f3l f\u00fcggetlen API-k. Alap\u00e9rtelmez\u00e9s szerint a programoz\u00f3k rendszerint azokat az API-kat haszn\u00e1lj\u00e1k, amelyekhez m\u00e1r hozz\u00e1szoktak, mivel \u00faj keretrendszerek \u00e9s fut\u00e1si k\u00f6rnyezetek tanulm\u00e1nyoz\u00e1sa sok id\u0151t ig\u00e9nyel. Ma megpr\u00f3b\u00e1ljuk megk\u00f6nny\u00edteni n\u00e9h\u00e1ny n\u00e9pszer\u0171 <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/blog\/2018\/11\/21\/eclipse-microprofile-for-spring-boot-developers\/\">MicroProfile API haszn\u00e1lat\u00e1t Spring-fejleszt\u0151knek<\/a><\/noindex> \u00e9s bemutatjuk, hogyan lehet egyszerre haszn\u00e1lni a Spring API-t \u00e9s az \u00faj hasznos funkci\u00f3kat <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/\">Quarkus<\/a><\/noindex>.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nHa egy kicsit b\u0151vebben kifejtj\u00fck, el\u0151sz\u00f6r megvizsg\u00e1ljuk a haszn\u00e1lati ter\u00fcleteket \u00e9s a r\u00e9szleteket arr\u00f3l, hogyan t\u00e1mogatja a Quarkus a Spring API-kat, hogy megmutassuk a Spring-fejleszt\u0151knek, hogyan alkalmazhatj\u00e1k a MicroProfile API-t a mindennapi munk\u00e1juk sor\u00e1n. Ezut\u00e1n besz\u00e9lni fogunk a MicroProfile API-kr\u00f3l, amelyek hasznosak lehetnek a Spring-fejleszt\u0151k sz\u00e1m\u00e1ra mikroszolg\u00e1ltat\u00e1sok l\u00e9trehoz\u00e1sakor.<\/p>\n<p>Mi\u00e9rt \u00e9ppen a Quarkus? El\u0151sz\u00f6r is, ez \u00e9l\u0151 k\u00f3dol\u00e1s (live coding), teh\u00e1t az \u00f6sszes v\u00e1ltoztat\u00e1s automatikus \u00fajrat\u00f6lt\u00e9se a MicroProfile API-ban, a Spring API-ban \u00e9s m\u00e1s Java API-kban mind\u00f6ssze egy paranccsal v\u00e9grehajthat\u00f3: mvn quarkus:dev. M\u00e1sodszor, amit a <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">p\u00e9ld\u00e1nkban vizsg\u00e1lunk<\/a><\/noindex> szolg\u00e1ltat\u00e1s Person (ez Spring, MicroProfile \u00e9s JPA API-kb\u00f3l ford\u00edt egy bin\u00e1ris f\u00e1jlt a GraalVM nat\u00edv k\u00e9p\u00e9nek haszn\u00e1lat\u00e1val) mind\u00f6ssze 0.055 m\u00e1sodperc alatt elindul, \u00e9s k\u00f6r\u00fclbel\u00fcl 90 MB-ot foglal el a mem\u00f3ri\u00e1ban (RSS) a RESTful alkalmaz\u00e1s v\u00e9gpontj\u00e1n. Maga a ford\u00edt\u00e1s mind\u00f6ssze egy paranccsal hajthat\u00f3 v\u00e9gre: mvn package -Pnative.<\/p>\n<p>Nem fogunk belemenni a MicroProfile r\u00e9szleteibe, csak annyit szeretn\u00e9nk seg\u00edteni a Spring-fejleszt\u0151knek, hogy meg\u00e9rts\u00e9k, hogyan haszn\u00e1lhat\u00f3k a Spring API-k a Quarkus-ban a MicroProfile API-kkal egy\u00fctt.<\/p>\n<h3>Kont\u00e9nerek \u00e9s Kubernetes<\/h3>\n<p>\nAnnak \u00e9rdek\u00e9ben, hogy ne terhelj\u00fck t\u00fal ezt a cikket, itt csak a Kubernetes t\u00e1mogat\u00e1s\u00e1nak magas szint\u0171 aspektusait fogjuk megvizsg\u00e1lni, <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/developer-tools\/kubernetes\">Kubernetes<\/a><\/noindex>mivel fontos ezt \u00e9rteni. A Quarkus \u00fagy pozicion\u00e1lja mag\u00e1t, mint a Kubernetes Java-stackje, amely minimaliz\u00e1lja a mem\u00f3riafogyaszt\u00e1st \u00e9s a Java-alkalmaz\u00e1sok \u00e9s szolg\u00e1ltat\u00e1sok ind\u00edt\u00e1si idej\u00e9t, \u00e9s ezzel n\u00f6veli a hoszton val\u00f3 elhelyez\u00e9s s\u0171r\u0171s\u00e9g\u00e9t, valamint cs\u00f6kkenti az \u00e1ltal\u00e1nos k\u00f6lts\u00e9geket.<\/p>\n<p>A Quarkus szint\u00e9n <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/kubernetes-resources\">t\u00e1mogatja az automatikus gener\u00e1l\u00e1st<\/a><\/noindex> Kubernetes er\u0151forr\u00e1sokhoz, \u00e9s <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/\">A kulcs felt\u00f6r\u00e9s\u00e9hez sz\u00fcks\u00e9ges inicializ\u00e1l\u00f3 vektorok sz\u00e1ma nem korl\u00e1tozott. Ez az\u00e9rt van, mert egyes vektorok gyeng\u00e9bbek \u00e9s t\u00f6bb inform\u00e1ci\u00f3t vesz\u00edtenek a kulcsr\u00f3l, mint m\u00e1sok. \u00c1ltal\u00e1ban az inicializ\u00e1l\u00f3 vektorok keverednek er\u0151sebbekkel. Teh\u00e1t, ha luck van, a kulcsot m\u00e1r 20 000 inicializ\u00e1l\u00f3 vektorral felt\u00f6rheti. Azonban gyakran ez sem elegend\u0151,<\/a><\/noindex> aj\u00e1nlja a Kubernetes \u00e9s a Red Hat OpenShift platformokon val\u00f3 telep\u00edt\u00e9st. Tov\u00e1bb\u00e1 a Quarkus automatikusan gener\u00e1lja a Dockerfile.jvm (JVM csomagol\u00e1s) \u00e9s a Dockerfile.native (nat\u00edv bin\u00e1ris csomagol\u00e1s) f\u00e1jlokat, amelyek a kont\u00e9nerek l\u00e9trehoz\u00e1s\u00e1hoz sz\u00fcks\u00e9gesek.<\/p>\n<p>V\u00e9g\u00fcl, orient\u00e1lva a Kubernetes-t mint c\u00e9lk\u00f6rnyezet, a Quarkus nem haszn\u00e1l Java keretrendszereket olyan esetekben, amikor hasonl\u00f3 funkci\u00f3kat a Kubernetes platform szintj\u00e9n val\u00f3s\u00edtottak meg. Az 1. t\u00e1bl\u00e1zat tartalmazza a Kubernetes \u00e9s a tipikus Java keretrendszerek funkcion\u00e1lis illeszked\u00e9s\u00e9nek t\u00e9rk\u00e9p\u00e9t, amelyet a Spring fejleszt\u0151k haszn\u00e1lnak.<\/p>\n<p><i>1. t\u00e1bl\u00e1zat. A Java keretrendszerek \u00e9s a Kubernetes funkcion\u00e1lis illeszked\u00e9s\u00e9nek t\u00e9rk\u00e9pe.<\/i><\/p>\n<p>Funkci\u00f3<br \/>\nHagyom\u00e1nyos Spring Boot<br \/>\nKubernetes<\/p>\n<p>Szolg\u00e1ltat\u00e1s felfedez\u00e9s<br \/>\nEureka<br \/>\nDNS<\/p>\n<p>Konfigur\u00e1ci\u00f3<br \/>\nSpring Cloud Config<br \/>\nConfig Maps \/ Secrets<\/p>\n<p>Terhel\u00e9seloszt\u00e1s<br \/>\nRibbon (\u00fcgyf\u00e9l oldalon)<br \/>\nSzolg\u00e1ltat\u00e1s, Replik\u00e1ci\u00f3s vez\u00e9rl\u0151 (szerver oldalon)<\/p>\n<p><\/p>\n<h3>A p\u00e9lda k\u00f3dj\u00e1nak leford\u00edt\u00e1sa \u00e9s futtat\u00e1sa<\/h3>\n<p>\nEbben a cikkben hivatkozunk a <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">projekt p\u00e9lda<\/a><\/noindex>, amelyben a Spring \u00e9s a MicroProfile API-k k\u00f6z\u00f6sen haszn\u00e1latosak, \u00e9s m\u00e9g a fenti Java oszt\u00e1ly is. A p\u00e9lda k\u00f3dj\u00e1t a parancssorb\u00f3l le lehet ford\u00edtani \u00e9s futtatni, tov\u00e1bbi r\u00e9szletek\u00e9rt l\u00e1sd a README.md f\u00e1jlt.<\/p>\n<h3>Spring Framework API-k<\/h3>\n<p><\/p>\n<h4>Dependency Injection<\/h4>\n<p>\nA Quarkus sz\u00e1mos <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/cdi-reference\">Contexts and Dependency Injection (CDI) API-t<\/a><\/noindex> \u00e9s Spring Dependency Injection (Spring DI) API-t t\u00e1mogat. Ha a MicroProfile-lal dolgozik, <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 \u00e9s Jakarta EE<\/a><\/noindex>, akkor m\u00e1r j\u00f3l ismeri a CDI-t. M\u00e1sr\u00e9szr\u0151l, a Spring fejleszt\u0151k a Quarkus Extension for Spring DI API-t haszn\u00e1lhatj\u00e1k a Spring DI kompatibilit\u00e1s\u00e1nak biztos\u00edt\u00e1s\u00e1hoz. A t\u00e1mogatott Spring DI API-k haszn\u00e1lat\u00e1nak p\u00e9ld\u00e1i a 2. t\u00e1bl\u00e1zatban tal\u00e1lhat\u00f3k.<\/p>\n<p>A <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">a p\u00e9lda projektben<\/a><\/noindex> mind a CDI, mind a Spring Dependency Injection haszn\u00e1latban van. Tov\u00e1bbi inform\u00e1ci\u00f3kat \u00e9s p\u00e9ld\u00e1kat e t\u00e9m\u00e1ban a Quarkus \u00fatmutat\u00f3j\u00e1ban tal\u00e1l, amelynek neve <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/spring-di\">Spring DI Guide<\/a><\/noindex>.<\/p>\n<p><i>2. t\u00e1bl\u00e1zat. A t\u00e1mogatott Spring DI API-k haszn\u00e1lat\u00e1nak p\u00e9ld\u00e1i.<\/i><\/p>\n<p>A t\u00e1mogatott Spring DI funkci\u00f3k<br \/>\nP\u00e9ld\u00e1k<\/p>\n<p>Konstruktor injekci\u00f3<\/p>\n<pre><code class=\"plaintext\">public PersonSpringController(\n   PersonSpringRepository personRepository,  \/\/ injekt\u00e1lt\n   PersonSpringMPService personService) {    \/\/ injekt\u00e1lt\n      this.personRepository = personRepository;\n      this.personService = personService;\n}\n<\/code><\/pre>\n<p>Mez\u0151 injekci\u00f3<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\">\u00c9rt\u00e9k<\/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\">Komponens<\/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 keretrendszer<\/h4>\n<p>\nA MicroProfile felhaszn\u00e1l\u00f3i \u00f6r\u00f6mmel tapasztalj\u00e1k, hogy a Quarkus t\u00e1mogatja a JAX-RS, a MicroProfile Rest Client, a JSON-P \u00e9s a JSON-B megold\u00e1sait mint alap webfejleszt\u00e9si modellt. A Spring fejleszt\u0151k sz\u00e1m\u00e1ra kedvez\u0151 h\u00edr, hogy a Quarkus nemr\u00e9giben t\u00e1mogatni kezdte a Spring Web API-t, k\u00fcl\u00f6n\u00f6s figyelmet ford\u00edtva a REST interf\u00e9szekre. A Spring DI-hez hasonl\u00f3an a Spring Web API t\u00e1mogat\u00e1s\u00e1nak f\u0151 c\u00e9lja, hogy a Spring fejleszt\u0151k a Spring Web API-kat a MicroProfile API-kkal egy\u00fctt haszn\u00e1lhass\u00e1k. A t\u00e1mogatott Spring Web API-k haszn\u00e1lat\u00e1nak p\u00e9ld\u00e1it a 3. t\u00e1bl\u00e1zat tartalmazza, a cikk visszautal a Quarkus \u00fatmutat\u00f3j\u00e1ra, amelynek c\u00edme <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/spring-web\">Spring Web Guide<\/a><\/noindex>.<\/p>\n<p><i>3. t\u00e1bl\u00e1zat. A t\u00e1mogatott Spring Web API interf\u00e9szek haszn\u00e1lat\u00e1nak p\u00e9ld\u00e1i.<\/i><\/p>\n<p>T\u00e1mogatott Spring Web funkci\u00f3k<br \/>\nP\u00e9ld\u00e1k<\/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 (r\u00e9szleges)<\/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>\nA MicroProfile felhaszn\u00e1l\u00f3i sz\u00e1m\u00e1ra kellemes h\u00edr, hogy a Quarkus t\u00e1mogatja a JPA-t a Hibernate ORM seg\u00edts\u00e9g\u00e9vel. A Spring fejleszt\u0151k sz\u00e1m\u00e1ra is j\u00f3 h\u00edr, hogy a Quarkus t\u00e1mogatja a k\u00f6zismert Spring Data JPA annot\u00e1ci\u00f3kat \u00e9s t\u00edpusokat. A t\u00e1mogatott Spring Data JPA API-k haszn\u00e1lati p\u00e9ld\u00e1it a 4. t\u00e1bl\u00e1zat tartalmazza.<br \/>\nA <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">a p\u00e9lda projektben<\/a><\/noindex> a Spring Data JPA API-k haszn\u00e1lat\u00e1t, m\u00edg tov\u00e1bbi inform\u00e1ci\u00f3k \u00e9rhet\u0151k el a Quarkus \u00fatmutat\u00f3j\u00e1ban, amelynek c\u00edme <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/spring-data-jpa-guide\">Spring Data JPA Guide<\/a><\/noindex>.<\/p>\n<p><i>4. t\u00e1bl\u00e1zat. A t\u00e1mogatott Spring Data JPA API interf\u00e9szek haszn\u00e1lat\u00e1nak p\u00e9ld\u00e1i.<\/i><\/p>\n<p>T\u00e1mogatott Spring Data JPA funkci\u00f3k<br \/>\nP\u00e9ld\u00e1k<\/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>Az Eloquent seg\u00edts\u00e9g\u00e9vel t\u00f6rt\u00e9n\u0151 megval\u00f3s\u00edt\u00e1sa meglehet\u0151sen egyszer\u0171:<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>Deriv\u00e1lt lek\u00e9rdez\u00e9si m\u00f3dszerek<\/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>Felhaszn\u00e1l\u00f3 \u00e1ltal defini\u00e1lt lek\u00e9rdez\u00e9sek<\/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>MicroProfile API interf\u00e9szek<\/h3>\n<p><\/p>\n<h4>Hibat\u0171r\u00e9s (Fault tolerance)<\/h4>\n<p>\nA hibamentes architekt\u00far\u00e1k rendk\u00edv\u00fcl fontosak a kaszk\u00e1dos hib\u00e1k megakad\u00e1lyoz\u00e1s\u00e1hoz \u00e9s megb\u00edzhat\u00f3 mikroszolg\u00e1ltat\u00e1s-architekt\u00far\u00e1k l\u00e9trehoz\u00e1s\u00e1hoz. A Spring-fejleszt\u0151k m\u00e1r \u00e9vek \u00f3ta haszn\u00e1lj\u00e1k a hibamentess\u00e9g \u00e9rdek\u00e9ben a circuit-breaker-eket. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Netflix\/Hystrix\">Hystrix<\/a><\/noindex>. A Hystrix azonban r\u00e9g\u00f3ta nem friss\u00fclt, m\u00edg a MicroProfile hibamentes megold\u00e1sai akt\u00edvan fejl\u0151dnek \u00e9s m\u00e1r t\u00f6bb \u00e9ves termel\u00e9si tapasztalattal rendelkeznek. Ez\u00e9rt a Quarkusban aj\u00e1nlott a MicroProfile Fault Tolerance API-k alkalmaz\u00e1sa a szolg\u00e1ltat\u00e1sok megb\u00edzhat\u00f3s\u00e1g\u00e1nak n\u00f6vel\u00e9se \u00e9rdek\u00e9ben, amelyek haszn\u00e1lat\u00e1val kapcsolatos p\u00e9ld\u00e1k a 5. t\u00e1bl\u00e1zatban tal\u00e1lhat\u00f3k. Tov\u00e1bbi inform\u00e1ci\u00f3kat err\u0151l a Quarkus \u00fatmutat\u00f3j\u00e1ban tal\u00e1lhat. <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/microprofile-fault-tolerance\">Hibamentess\u00e9gi \u00fatmutat\u00f3<\/a><\/noindex>.<\/p>\n<p><i>5. t\u00e1bl\u00e1zat. A t\u00e1mogatott MicroProfile Fault Tolerance API-k haszn\u00e1lat\u00e1nak p\u00e9ld\u00e1i.<\/i><\/p>\n<p>MicroProfile Fault Tolerance funkci\u00f3k<br \/>\nLe\u00edr\u00e1s<br \/>\nP\u00e9ld\u00e1k<\/p>\n<p>@Asynchronous<\/p>\n<p>Logika v\u00e9grehajt\u00e1sa k\u00fcl\u00f6n sz\u00e1lon<\/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>A p\u00e1rhuzamos k\u00e9r\u00e9sek sz\u00e1m\u00e1nak korl\u00e1toz\u00e1sa<\/p>\n<pre><code class=\"plaintext\">@Bulkhead(5)\npublic void fiveConcurrent() {\n   makeRemoteCall(); \/\/...\n}\n<\/code><\/pre>\n<p>@CircuitBreaker<\/p>\n<p>Intelligens hiba kezel\u00e9s \u00e9s hiba ut\u00e1ni helyre\u00e1ll\u00edt\u00e1s<\/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>Alternat\u00edv logika h\u00edv\u00e1sa hiba eset\u00e9n<\/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>\u00dajrapr\u00f3b\u00e1lkoz\u00e1s hiba eset\u00e9n<\/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>Id\u0151korl\u00e1t el\u00e9r\u00e9si hiba eset\u00e9n<\/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>Szolg\u00e1ltat\u00e1sok ellen\u0151rz\u00e9se (Service Health)<\/h4>\n<p>\nA Kubernetes platformok speci\u00e1lis szolg\u00e1ltat\u00e1sokkal figyelik a kont\u00e9nerek \u00e1llapot\u00e1t. Ahhoz, hogy az alapul szolg\u00e1l\u00f3 platform nyomon k\u00f6vethesse a szolg\u00e1ltat\u00e1sokat, a Spring-fejleszt\u0151k \u00e1ltal\u00e1ban testreszabott HealthIndicator-t \u00e9s Spring Boot Actuator-t haszn\u00e1lnak. A Quarkusban ezt a MicroProfile Health seg\u00edts\u00e9g\u00e9vel lehet megtenni, amely alap\u00e9rtelmez\u00e9s szerint \u00e9lettartam-ellen\u0151rz\u00e9st (liveness check) v\u00e9gez, de be\u00e1ll\u00edthat\u00f3, hogy egyidej\u0171leg ellen\u0151rizze az \u00e9lettartamot \u00e9s a k\u00e9szenl\u00e9tet (readiness). A t\u00e1mogatott MicroProfile Health API-k haszn\u00e1lat\u00e1nak p\u00e9ld\u00e1i a 6. t\u00e1bl\u00e1zatban tal\u00e1lhat\u00f3k, tov\u00e1bbi inform\u00e1ci\u00f3k pedig a Quarkus \u00fatmutat\u00f3j\u00e1ban. <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/microprofile-health\">Eg\u00e9szs\u00e9g\u00fcgyi \u00fatmutat\u00f3<\/a><\/noindex>.<\/p>\n<p><i>6. t\u00e1bl\u00e1zat. A t\u00e1mogatott MicroProfile Health API-k haszn\u00e1lat\u00e1nak p\u00e9ld\u00e1i.<\/i><\/p>\n<p>MicroProfile Health funkci\u00f3k<br \/>\nLe\u00edr\u00e1s<br \/>\nP\u00e9ld\u00e1k<\/p>\n<p>@Liveness<\/p>\n<p>A platform \u00fajraind\u00edtja a hib\u00e1s kont\u00e9neriz\u00e1lt alkalmaz\u00e1sokat<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>A platform will not route traffic to containerized applications if they are not ready.<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>Metrik\u00e1k<\/h4>\n<p>\nApplications provide metrics either for operational purposes (to monitor SLA performance indicators) or for non-operational ones (business SLA indicators). Spring developers provide metrics using Spring Boot Actuator and Micrometer. In turn, Quarkus uses MicroProfile Metrics to provide basic metrics (JVM and operating system), vendor metrics (Quarkus), and application metrics. MicroProfile Metrics requires the implementation to support output formats of JSON and OpenMetrics (Prometheus). Examples of using the MicroProfile Metrics API are presented in Table 7.<\/p>\n<p>A <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">a p\u00e9lda projektben<\/a><\/noindex> MicroProfile Metrics are used to provide application metrics. For more details, refer to the Quarkus guide. <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/microprofile-metrics\">Metrics Guide<\/a><\/noindex>.<\/p>\n<p><i>Table 7. Examples of using the MicroProfile Metrics APIs.<\/i><\/p>\n<p>Functions of MicroProfile Metrics<br \/>\nLe\u00edr\u00e1s<br \/>\nP\u00e9ld\u00e1k<\/p>\n<p>@Counted<\/p>\n<p>Indicates a counter that counts the number of calls to the annotated object.<\/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>Indicates a gauge that counts the number of concurrent calls to the annotated object.<\/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>Indicates a gauge that measures the value of the annotated object.<\/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>Indicates a meter that tracks the frequency of calls to the annotated object.<\/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\">Metric<\/a><\/noindex><\/p>\n<p>Annotation containing metadata information when a request for metric generation or submission is received.<\/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\">Timed<\/a><\/noindex><\/p>\n<p>Indicates a timer that tracks the duration of the annotated object.<\/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>Metrias v\u00e9gpontok (Metrics Endpoints)<\/b><\/p>\n<p>Alkalmaz\u00e1si metrik\u00e1k <noindex><a rel=\"nofollow\" href=\"http:\/\/localhost\">localhost<\/a><\/noindex>:8080\/metrics\/application<br \/>\nAlapmetrik\u00e1k <noindex><a rel=\"nofollow\" href=\"http:\/\/localhost\">localhost<\/a><\/noindex>:8080\/metrics\/base<br \/>\nSz\u00e1ll\u00edt\u00f3 metrik\u00e1k <noindex><a rel=\"nofollow\" href=\"http:\/\/localhost\">localhost<\/a><\/noindex>:8080\/metrics\/vendor<br \/>\n\u00d6sszes metrika <noindex><a rel=\"nofollow\" href=\"http:\/\/localhost\">localhost<\/a><\/noindex>:8080\/metrics<\/p>\n<h4>MicroProfile Rest kliens<\/h4>\n<p>\nA mikroszolg\u00e1ltat\u00e1sok gyakran RESTful v\u00e9gpontokat biztos\u00edtanak, amelyek haszn\u00e1lat\u00e1hoz megfelel\u0151 kliens API-k sz\u00fcks\u00e9gesek. A RESTful v\u00e9gpontok haszn\u00e1lat\u00e1hoz a Spring-fejleszt\u0151k \u00e1ltal\u00e1ban a RestTemplate-et alkalmazz\u00e1k. A Quarkus e feladat megold\u00e1s\u00e1ra MicroProfile Rest Client API-interf\u00e9szeket k\u00edn\u00e1l, amelyek haszn\u00e1lat\u00e1nak p\u00e9ld\u00e1i a 8. t\u00e1bl\u00e1zatban tal\u00e1lhat\u00f3k.<\/p>\n<p>A <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">a p\u00e9lda projektben<\/a><\/noindex> A RESTful v\u00e9gpontok haszn\u00e1lata a MicroProfile Rest Client seg\u00edts\u00e9g\u00e9vel t\u00f6rt\u00e9nik. Tov\u00e1bbi inform\u00e1ci\u00f3k \u00e9s p\u00e9ld\u00e1k tal\u00e1lhat\u00f3k a Quarkus \u00fatmutat\u00f3j\u00e1ban. <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/rest-client\">Rest Kliens \u00datmutat\u00f3<\/a><\/noindex>.<\/p>\n<p><i>8. t\u00e1bl\u00e1zat. MicroProfile Rest Client API-interf\u00e9szek haszn\u00e1lat\u00e1nak p\u00e9ld\u00e1i.<\/i><\/p>\n<p>MicroProfile Rest Client funkci\u00f3i<br \/>\nLe\u00edr\u00e1s<br \/>\nP\u00e9ld\u00e1k<\/p>\n<p>@RegisterRestClient<\/p>\n<p>Regisztr\u00e1lja a t\u00edpusos Java interf\u00e9szt REST kliensk\u00e9nt.<\/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>Megjel\u00f6li a t\u00edpusos REST kliens interf\u00e9sz p\u00e9ld\u00e1ny\u00e1nak befecskendez\u00e9s\u00e9t.<\/p>\n<pre><code class=\"plaintext\">@Autowired \/\/ or @Inject\n@RestClient\nMyRestClient restClient;\n<\/code><\/pre>\n<p>H\u00edv\u00e1s<\/p>\n<p>H\u00edvja a REST v\u00e9gpontot.<\/p>\n<pre><code class=\"plaintext\">System.out.println(\n   restClient.getSalutation());\n<\/code><\/pre>\n<p>mp-rest\/url<\/p>\n<p>Meghat\u00e1rozza a REST v\u00e9gpontot.<\/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>\u00d6sszegz\u00e9s<\/h3>\n<p>\nEbben a blogban, amely f\u0151leg a Spring-fejleszt\u0151k sz\u00e1m\u00e1ra hasznos, r\u00f6viden bemutattuk, hogyan lehet a Quarkus-ban a Spring API-kat egy\u00fctt haszn\u00e1lni a MicroProfile API-kkal Java mikroszolg\u00e1ltat\u00e1sok fejleszt\u00e9s\u00e9re, majd azokat nat\u00edv bin\u00e1ris k\u00f3dra ford\u00edtani, ami t\u00f6bb sz\u00e1z megab\u00e1jt mem\u00f3ri\u00e1t takar\u00edt meg \u00e9s millisekund\u00e1k alatt indul.<\/p>\n<p>Ahogy m\u00e1r eml\u00edtetted, tov\u00e1bbi inform\u00e1ci\u00f3k tal\u00e1lhat\u00f3k a Spring \u00e9s MicroProfile API-k t\u00e1mogat\u00e1s\u00e1r\u00f3l, valamint sok m\u00e1s hasznos inform\u00e1ci\u00f3 a <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/\">Quarkus \u00fatmutat\u00f3kban.<\/a><\/noindex>.<br \/>\n<br \/>Forr\u00e1s: <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.3 - 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\/hu\/blog\/administrirovanie\/kak-quarkus-obedinyaet-microprofile-i-spring\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"hu_HU\" \/>\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\/hu\/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\udd47Hogyan egyes\u00edti a Quarkus a MicroProfile-t \u00e9s a Spring-et | ProHoster","description":"\u00dcdv\u00f6zlet mindenkinek, itt van a harmadik poszt a Quarkusr\u00f3l sz\u00f3l\u00f3 sorozatunkb\u00f3l!","canonical_url":"https:\/\/prohoster.info\/hu\/blog\/administrirovanie\/kak-quarkus-obedinyaet-microprofile-i-spring","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"hu_HU","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\/hu\/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\/hu\/wp-json\/wp\/v2\/posts\/79987","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/comments?post=79987"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/posts\/79987\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/media\/79988"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/media?parent=79987"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/categories?post=79987"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/hu\/wp-json\/wp\/v2\/tags?post=79987"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}