{"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\/sq\/blog\/administrirovanie\/kak-quarkus-obedinyaet-microprofile-i-spring","title":{"rendered":"Si i bashkon Quarkus MicroProfile dhe Spring","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>P\u00ebrsh\u00ebndetje t\u00eb gjith\u00ebve, dhe k\u00ebtu \u00ebsht\u00eb postimi i tret\u00eb nga seria mbi Quarkus!<\/p>\n<p><img decoding=\"async\" alt=\"Si i bashkon Quarkus MicroProfile dhe Spring\" src=\"\/wp-content\/uploads\/2020\/05\/d98ff470b49f8de1fa488a6818160969.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nN\u00eb zhvillimin e mikrosherbimeve Java shpesh konsiderohet se <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/blog\/2019\/02\/28\/jumpstart-microservices-microprofile-starter-beta\/\">Eclipse MicroProfile<\/a><\/noindex> dhe <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/topics\/spring-boot\/\">Spring Boot<\/a><\/noindex> \u00ebsht\u00eb nj\u00eb grup API-sh t\u00eb ve\u00e7anta dhe t\u00eb pavarura nga nj\u00ebra-tjetra. N\u00eb m\u00ebnyr\u00eb t\u00eb paracaktuar, programuesit zakonisht p\u00ebrdorin ato API q\u00eb ata tashm\u00eb jan\u00eb m\u00ebsuar, pasi t\u00eb m\u00ebsuarit e framework-eve t\u00eb rinj dhe komponenteve t\u00eb runtime-it k\u00ebrkon shum\u00eb koh\u00eb. Sot do t\u00eb p\u00ebrpiqemi ta thjeshtojm\u00eb m\u00ebsimin e disa API-ve t\u00eb njohura <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/blog\/2018\/11\/21\/eclipse-microprofile-for-spring-boot-developers\/\">MicroProfile p\u00ebr zhvilluesit e Spring<\/a><\/noindex> dhe do t\u00eb tregojm\u00eb se si t\u00eb p\u00ebrfshihen nj\u00ebkoh\u00ebsisht API-t\u00eb e Spring dhe mund\u00ebsit\u00eb e reja t\u00eb dobishme <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/\">Quarkus<\/a><\/noindex>.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nN\u00ebse shohim m\u00eb n\u00eb detaje, s\u00eb pari do t\u00eb shqyrtojm\u00eb fush\u00ebn e aplikacionit dhe detajet e m\u00ebnyr\u00ebs se si Quarkus mb\u00ebshtet API-t\u00eb e Spring, p\u00ebr t\u00eb treguar zhvilluesve t\u00eb Spring se si mund t\u00eb p\u00ebrdorin API-t\u00eb e MicroProfile n\u00eb pun\u00ebn e tyre t\u00eb p\u00ebrditshme. M\u00eb pas do t\u00eb flasim p\u00ebr API-t\u00eb e MicroProfile q\u00eb do t'u duhen zhvilluesve t\u00eb Spring p\u00ebr nd\u00ebrtimin e mikrosherbimeve.<\/p>\n<p>Pse pik\u00ebrisht Quarkus? S\u00eb pari, kjo \u00ebsht\u00eb kodim n\u00eb koh\u00eb reale (live coding), do t\u00eb thot\u00eb riformatimi automatik i \u00e7do ndryshimi n\u00eb API-t\u00eb MicroProfile, API-t\u00eb e Spring dhe API t\u00eb tjera Java, q\u00eb realizohet vet\u00ebm me nj\u00eb komand\u00eb: mvn quarkus:dev. S\u00eb dyti, shembulli q\u00eb shqyrtojm\u00eb n\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">shembullin ton\u00eb<\/a><\/noindex> sh\u00ebrbimi Person (ai kompilon nga API-t\u00eb e Spring, MicroProfile dhe JPA n\u00eb nj\u00eb skedar binar duke p\u00ebrdorur imazhin natyral GraalVM) starton p\u00ebr vet\u00ebm 0.055 sekonda dhe konsumon rreth 90 MB n\u00eb memorien operative (RSS) n\u00eb pik\u00ebn fundore t\u00eb aplikacionit RESTful. P\u00ebr m\u00eb tep\u00ebr, vet\u00eb kompilimi i tij kryhet me vet\u00ebm nj\u00eb komand\u00eb: mvn package -Pnative.<\/p>\n<p>Nuk do t\u00eb thellohemi n\u00eb detajet e MicroProfile, por do t\u00eb p\u00ebrpiqemi t\u00eb ndihmojm\u00eb zhvilluesit e Spring t\u00eb kuptojn\u00eb se si Quarkus mund t\u00eb p\u00ebrdor\u00eb API-t\u00eb e Spring s\u00eb bashku me API-t\u00eb e MicroProfile.<\/p>\n<h3>Kontejner\u00ebt dhe Kubernetes<\/h3>\n<p>\nP\u00ebr t\u00eb mos e ngarkuar k\u00ebt\u00eb artikull, k\u00ebtu do t\u00eb shqyrtojm\u00eb vet\u00ebm aspektet me nivel t\u00eb lart\u00eb t\u00eb mb\u00ebshtetjes <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/developer-tools\/kubernetes\">Kubernetes<\/a><\/noindex>, pasi kjo \u00ebsht\u00eb e r\u00ebnd\u00ebsishme p\u00ebr t'u kuptuar. Quarkus pozicionohet si nj\u00eb stack Java p\u00ebr Kubernetes, ai \u00ebsht\u00eb i destinuar t\u00eb minimizoj\u00eb konsumin e memorie dhe koh\u00ebn e startit t\u00eb aplikacioneve dhe sh\u00ebrbimeve Java, dhe, si pasoj\u00eb, t\u00eb rris\u00eb densitetin e vendosjes s\u00eb tyre n\u00eb host dhe t\u00eb zvog\u00ebloj\u00eb shpenzimet totale.<\/p>\n<p>Quarkus gjithashtu <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/kubernetes-resources\">mb\u00ebshtet gjenerimin automatik<\/a><\/noindex> e burimeve Kubernetes dhe ofron <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/\">udh\u00ebzimet<\/a><\/noindex> p\u00ebr implementimin n\u00eb platformat Kubernetes dhe Red Hat OpenShift. P\u00ebr m\u00eb tep\u00ebr, Quarkus automatikisht gjeneron skedar\u00ebt Dockerfile.jvm (paketimi JVM) dhe Dockerfile.native (paketimi i binar\u00ebve natyral), t\u00eb nevojsh\u00ebm p\u00ebr krijimin e kontejner\u00ebve.<\/p>\n<p>Dhe s\u00eb fundmi, duke u orientuar n\u00eb Kubernetes si mjedisin e synuar p\u00ebr shp\u00ebrndarjen, Quarkus nuk p\u00ebrdor framework-e Java n\u00eb ato raste kur funksionaliteti i ngjash\u00ebm \u00ebsht\u00eb realizuar n\u00eb nivelin e vet\u00eb \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u00ebs Kubernetes. N\u00eb tabel\u00ebn 1 \u00ebsht\u00eb paraqitur harta e p\u00ebrputhshm\u00ebris\u00eb funksionale midis Kubernetes dhe framework-eve tipike Java q\u00eb p\u00ebrdoren nga zhvilluesit e Spring.<\/p>\n<p><i>Tabela 1. Harta e p\u00ebrputhshm\u00ebris\u00eb funksionale midis framework-eve Java dhe Kubernetes.<\/i><\/p>\n<p>Funksionaliteti<br \/>\nSpring Boot tradicionale<br \/>\nKubernetes<\/p>\n<p>Zbulimi i sh\u00ebrbimeve<br \/>\nEureka<br \/>\nDNS<\/p>\n<p>Konfigurimi<br \/>\nSpring Cloud Config<br \/>\nConfig Maps \/ Secrets<\/p>\n<p>Balancimi i ngarkes\u00ebs<br \/>\nRibbon (n\u00eb an\u00ebn e klientit)<br \/>\nSh\u00ebrbimi, Replication Controller (n\u00eb an\u00ebn e serverit)<\/p>\n<p><\/p>\n<h3>Kompilimi dhe ekzekutimi i kodit nga shembulli<\/h3>\n<p>\nN\u00eb k\u00ebt\u00eb artikull ne referohemi n\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">shembulli i projektit<\/a><\/noindex>, ku p\u00ebrdoren s\u00eb bashku API-t\u00eb e Spring dhe MicroProfile dhe madje edhe ai Java klas\u00eb. Kodi nga ky shembull mund t\u00eb komilohet dhe ekzekutohet nga linja e komand\u00ebs, shihni skedarin README.md p\u00ebr m\u00eb shum\u00eb detaje.<\/p>\n<h3>API-t\u00eb e Spring Framework<\/h3>\n<p><\/p>\n<h4>Dependency Injection<\/h4>\n<p>\nQuarkus mb\u00ebshtet nj\u00eb gam\u00eb t\u00eb gjer\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/cdi-reference\">API-t\u00eb e Konteksteve dhe Injeksionit t\u00eb Var\u00ebsis\u00eb (CDI)<\/a><\/noindex> dhe API-t\u00eb e Injeksionit t\u00eb Var\u00ebsis\u00eb t\u00eb Spring (Spring DI). N\u00ebse punoni me 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 dhe Jakarta EE<\/a><\/noindex>, do t\u00eb jeni tashm\u00eb mir\u00eb t\u00eb njohur me CDI. N\u00eb an\u00ebn tjet\u00ebr, zhvilluesit e Spring mund t\u00eb p\u00ebrdorin Quarkus Extension p\u00ebr API-n\u00eb e Spring DI p\u00ebr t\u00eb siguruar p\u00ebrputhshm\u00ebri me Spring DI. Shembujt e p\u00ebrdorimit t\u00eb API-ve t\u00eb mb\u00ebshtetur t\u00eb Spring DI paraqiten n\u00eb tabel\u00ebn 2.<\/p>\n<p>N\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">n\u00eb projektin ton\u00eb t\u00eb shembullit<\/a><\/noindex> p\u00ebrdoret si CDI ashtu edhe Injeksioni i Var\u00ebsis\u00eb i Spring. Informacione t\u00eb tjera dhe shembuj mbi k\u00ebt\u00eb tem\u00eb mund t\u00eb gjenden n\u00eb udh\u00ebzimin e Quarkus, i cili quhet <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/spring-di\">Udhezuesi i Spring DI<\/a><\/noindex>.<\/p>\n<p><i>Tabela 2. Shembuj t\u00eb p\u00ebrdorimit t\u00eb API-ve t\u00eb mb\u00ebshtetur t\u00eb Spring DI.<\/i><\/p>\n<p>Funksionet e mb\u00ebshtetura t\u00eb Spring DI<br \/>\nShembuj<\/p>\n<p>Injeksioni i Konstruktorit<\/p>\n<pre><code class=\"plaintext\">public PersonSpringController(\n   PersonSpringRepository personRepository,  \/\/ injektuar      \n   PersonSpringMPService personService) {    \/\/ injektuar\n      this.personRepository = personRepository;\n      this.personService = personService;\n}\n<\/code><\/pre>\n<p>Injeksioni i Fush\u00ebs<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\">Vlera<\/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\">Bina<\/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\">Sh\u00ebrbimi<\/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>Korniza e uebit<\/h4>\n<p>\nP\u00ebrdoruesit e MicroProfile do t\u00eb p\u00eblqejn\u00eb se Quarkus mb\u00ebshtet JAX-RS, MicroProfile Rest Client, JSON-P dhe JSON-B si modelin kryesor t\u00eb programimit t\u00eb uebit. Disa zhvillues t\u00eb Spring do t\u00eb g\u00ebzohen nga mb\u00ebshtetje e sapo shfaqur p\u00ebr Spring Web API n\u00eb Quarkus, ve\u00e7an\u00ebrisht p\u00ebr nd\u00ebrfaqet q\u00eb trajtojn\u00eb REST. N\u00eb p\u00ebrputhje me DI-n\u00eb e Spring, q\u00ebllimi kryesor i mb\u00ebshtetjes s\u00eb Spring Web API \u00ebsht\u00eb q\u00eb zhvilluesit e Spring t\u00eb mund t\u00eb p\u00ebrdorin nd\u00ebrfaqet e Spring Web s\u00eb bashku me ato t\u00eb MicroProfile. Shembujt e p\u00ebrdorimit t\u00eb Spring Web API t\u00eb mb\u00ebshtetur jepen n\u00eb tabel\u00ebn 3, dhe informacion t\u00eb m\u00ebtejsh\u00ebm dhe shembuj mbi k\u00ebt\u00eb tem\u00eb mund t\u00eb gjenden n\u00eb udh\u00ebzimin e Quarkus t\u00eb quajtur <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/spring-web\">Udh\u00ebzuesi i Spring Web<\/a><\/noindex>.<\/p>\n<p><i>Tabela 3. Shembuj t\u00eb p\u00ebrdorimit t\u00eb nd\u00ebrfaqeve t\u00eb mb\u00ebshtetura t\u00eb Spring Web.<\/i><\/p>\n<p>Funksionet e mb\u00ebshtetura t\u00eb Spring Web<br \/>\nShembuj<\/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 (pjese)<\/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>\nP\u00ebrdoruesit e MicroProfile gjithashtu do t\u00eb g\u00ebzohen se Quarkus mb\u00ebshtet JPA duke p\u00ebrdorur Hibernate ORM. Lajme t\u00eb mira ka edhe p\u00ebr zhvilluesit e Spring: Quarkus mb\u00ebshtet annotimet dhe llojet e zakonshme t\u00eb Spring Data JPA. Shembujt e p\u00ebrdorimit t\u00eb API-ve t\u00eb mb\u00ebshtetur t\u00eb Spring Data JPA jepen n\u00eb tabel\u00ebn 4.<br \/>\nN\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">n\u00eb projektin ton\u00eb t\u00eb shembullit<\/a><\/noindex> p\u00ebrdoren interfecet e Spring Data JPA, nd\u00ebrsa informacioni shtes\u00eb \u00ebsht\u00eb n\u00eb dispozicion n\u00eb udh\u00ebzimin e Quarkus t\u00eb titulluar <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/spring-data-jpa-guide\">Udh\u00ebzuesi i Spring Data JPA<\/a><\/noindex>.<\/p>\n<p><i>Tabela 4. Shembuj t\u00eb p\u00ebrdorimit t\u00eb nd\u00ebrfaqeve t\u00eb mb\u00ebshtetura t\u00eb Spring Data JPA.<\/i><\/p>\n<p>Funksionet e mb\u00ebshtetura t\u00eb Spring Data JPA<br \/>\nShembuj<\/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>Repozitoret Fragment<\/p>\n<pre><code class=\"plaintext\">public interface PersonRepository\n         extends JpaRepository,\n                 PersonFragment {\n   ...\n}\n<\/code><\/pre>\n<p>Metoda t\u00eb derivate t\u00eb pyetjeve<\/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>Pyetje t\u00eb p\u00ebrcaktuara nga p\u00ebrdoruesi<\/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-t\u00eb e MicroProfile<\/h3>\n<p><\/p>\n<h4>P\u00ebrballueshm\u00ebria (Hetimi i gabimeve)<\/h4>\n<p>\nStruktura e toleranc\u00ebs ndaj defekteve \u00ebsht\u00eb shum\u00eb e r\u00ebnd\u00ebsishme p\u00ebr t\u00eb parandaluar d\u00ebshtime kaskad\u00eb dhe p\u00ebr t\u00eb krijuar arkitektura mikrosherish m\u00eb t\u00eb besueshme. Zhvilluesit e Spring e kan\u00eb p\u00ebrdorur p\u00ebr shum\u00eb vite p\u00ebr toleranc\u00ebn ndaj defekteve circuit-breaker. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/Netflix\/Hystrix\">Hystrix<\/a><\/noindex>. Megjithat\u00eb, Hystrix nuk \u00ebsht\u00eb p\u00ebrdit\u00ebsuar p\u00ebr nj\u00eb koh\u00eb t\u00eb gjat\u00eb, nd\u00ebrsa toleranca e defekteve t\u00eb MicroProfile tashm\u00eb po zhvillohet aktivisht dhe ka disa vite p\u00ebrvoj\u00eb n\u00eb prodhim. Prandaj, p\u00ebr t\u00eb rritur besueshm\u00ebrin\u00eb e sh\u00ebrbimeve n\u00eb Quarkus, rekomandohet t\u00eb p\u00ebrdoren nd\u00ebrfaqet e API-t t\u00eb MicroProfile Fault Tolerance, shembujt e t\u00eb cil\u00ebve jepen n\u00eb tabel\u00ebn 5. Informacione t\u00eb tjera mbi k\u00ebt\u00eb mund t\u00eb gjenden n\u00eb udh\u00ebzuesin Quarkus. <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/microprofile-fault-tolerance\">Udh\u00ebzuesi p\u00ebr Toleranc\u00ebn ndaj Defekteve<\/a><\/noindex>.<\/p>\n<p><i>Tabela 5. Shembuj t\u00eb p\u00ebrdorimit t\u00eb nd\u00ebrfaqeve t\u00eb API-t t\u00eb mb\u00ebshtetur nga MicroProfile Fault Tolerance.<\/i><\/p>\n<p>Funksionet e MicroProfile Fault Tolerance<br \/>\nP\u00ebrshkrimi<br \/>\nShembuj<\/p>\n<p>@Asynchronous<\/p>\n<p>Ekzekutimi i logjik\u00ebs n\u00eb nj\u00eb thread t\u00eb ve\u00e7ant\u00eb<\/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>Kufizimi i numrit t\u00eb k\u00ebrkesave t\u00eb nj\u00ebkohshme<\/p>\n<pre><code class=\"plaintext\">@Bulkhead(5)\npublic void fiveConcurrent() {\n   makeRemoteCall(); \/\/...\n}\n<\/code><\/pre>\n<p>@CircuitBreaker<\/p>\n<p>Trajtimi inteligjent i d\u00ebshtimeve dhe rikuperimi pas d\u00ebshtimeve<\/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>Thirrja e logjik\u00ebs alternative n\u00eb rast d\u00ebshtimi<\/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\">Riprovimi<\/a><\/noindex><\/p>\n<p>Riprovim n\u00eb rast d\u00ebshtimi t\u00eb k\u00ebrkes\u00ebs<\/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\">Skadimi<\/a><\/noindex><\/p>\n<p>Kontrolli i koh\u00ebs s\u00eb pritjes n\u00eb rast d\u00ebshtimi<\/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>Kontrolli i sh\u00ebrbimeve (Sh\u00ebndeti i Sh\u00ebrbimit)<\/h4>\n<p>\nPlatformat Kubernetes monitorojn\u00eb sh\u00ebndetin e kontejner\u00ebve p\u00ebrmes sh\u00ebrbimeve speciale. K\u00ebshtu q\u00eb platforma e poshtme t\u00eb mund t\u00eb monitoroj\u00eb sh\u00ebrbimet, zhvilluesit e Spring zakonisht p\u00ebrdorin HealthIndicator t\u00eb personalizuar dhe Spring Boot Actuator. N\u00eb Quarkus, kjo mund t\u00eb b\u00ebhet p\u00ebrmes MicroProfile Health, q\u00eb normalisht kryen kontrollin e aktivitetit (liveness check), por mund t\u00eb konfigurrohet edhe p\u00ebr kontrollin e aktivitetit dhe gatishm\u00ebris\u00eb (readiness check) n\u00eb t\u00eb nj\u00ebjt\u00ebn koh\u00eb. Shembujt e p\u00ebrdorimit t\u00eb API-ve t\u00eb mb\u00ebshtetura nga MicroProfile Health jepen n\u00eb tabel\u00ebn 6, dhe informacione t\u00eb tjera jan\u00eb t\u00eb dh\u00ebna n\u00eb udh\u00ebzuesin Quarkus. <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/microprofile-health\">Udh\u00ebzuesi p\u00ebr Sh\u00ebndetin<\/a><\/noindex>.<\/p>\n<p><i>Tabela 6. Shembuj t\u00eb p\u00ebrdorimit t\u00eb nd\u00ebrfaqeve t\u00eb API-t t\u00eb mb\u00ebshtetur nga MicroProfile Health.<\/i><\/p>\n<p>Funksionet e MicroProfile Health<br \/>\nP\u00ebrshkrimi<br \/>\nShembuj<\/p>\n<p>@Liveness<\/p>\n<p>Platforma kryen ri-ngarkimin e aplikacioneve t\u00eb kontejnerizuara q\u00eb nuk punojn\u00eb<br \/>\nEndpoint:<br \/>\nhost:8080\/health\/live<\/p>\n<pre><code class=\"plaintext\">@Liveness\npublic class MyHC implements HealthCheck {\n  public HealthCheckResponse call() {\n\n   ...\n   return HealthCheckResponse\n     .named(\"myHCProbe\")\n     .status(ready ? true:false)\n     .withData(\"mydata\", data)\n     .build();  \n}\n<\/code><\/pre>\n<p>@Readiness<\/p>\n<p>Platforma nuk do d\u00ebrgoj\u00eb trafik te aplikacionet e containerizuar n\u00eb rast se ato nuk jan\u00eb gati<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>Metrikat<\/h4>\n<p>\nAplikacionet ofrojn\u00eb metrika ose n\u00eb q\u00ebllime operative (p\u00ebr monitorimin e SLA-ve t\u00eb performanc\u00ebs), ose n\u00eb ato jo-operative (metrika t\u00eb biznesit SLA). Zhvilluesit e Spring ofrojn\u00eb metrika p\u00ebrmes Spring Boot Actuator dhe Micrometer. Nd\u00ebrkoh\u00eb, Quarkus p\u00ebrdor MicroProfile Metrics p\u00ebr ofrimin e metrikeve themelore (JVM dhe sistemi operativ), metrik\u00eb t\u00eb furnizuesve (Quarkus) dhe metrika t\u00eb aplikacioneve. MicroProfile Metrics k\u00ebrkon q\u00eb implementimi t\u00eb mb\u00ebshtes\u00eb formatet e daljes JSON dhe OpenMetrics (Prometheus). Shembujt e p\u00ebrdorimit t\u00eb API-s\u00eb MicroProfile Metrics jepen n\u00eb tabel\u00ebn 7.<\/p>\n<p>N\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">n\u00eb projektin ton\u00eb t\u00eb shembullit<\/a><\/noindex> MicroProfile Metrics p\u00ebrdoren p\u00ebr ofrimin e metrikeve t\u00eb aplikacionit. Informacione t\u00eb m\u00ebtejshme mund t\u00eb gjenden n\u00eb udh\u00ebzimin e Quarkus <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/microprofile-metrics\">Guid\u00eb p\u00ebr Metrikat<\/a><\/noindex>.<\/p>\n<p><i>Tabela 7. Shembujt e p\u00ebrdorimit t\u00eb API-ve p\u00ebr MicroProfile Metrics.<\/i><\/p>\n<p>Ve\u00e7orit\u00eb e MicroProfile Metrics<br \/>\nP\u00ebrshkrimi<br \/>\nShembuj<\/p>\n<p>@Counted<\/p>\n<p>Sh\u00ebnon nj\u00eb num\u00ebrues, q\u00eb num\u00ebron numrin e thirrjeve t\u00eb objektit t\u00eb annotuar<\/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>Sh\u00ebnon nj\u00eb mat\u00ebs, q\u00eb num\u00ebron numrin e thirrjeve paralele t\u00eb objektit t\u00eb annotuar<\/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>Sh\u00ebnon nj\u00eb mat\u00ebs, q\u00eb mat vler\u00ebn e objektit t\u00eb annotuar<\/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>Sh\u00ebnon nj\u00eb mat\u00ebs, q\u00eb ndjek frekuenc\u00ebn e thirrjes s\u00eb objektit t\u00eb annotuar<\/p>\n<pre><code class=\"plaintext\">@Metered(name = \"MeteredFallback\",\n   displayName=\"Metered Fallback\",\n   description=\"Fallback frequency\")\npublic String salutationFallback() {\n   return fallbackSalutation;\n}\n<\/code><\/pre>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/metric\/\" class=\"user_link\">Metrika<\/a><\/noindex><\/p>\n<p>Annotimi q\u00eb p\u00ebrmban informacion mbi metadata, kur b\u00ebhet k\u00ebrkes\u00eb p\u00ebr t\u00eb futur ose prodhuar metrik\u00ebn<\/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\">E matur<\/a><\/noindex><\/p>\n<p>Sh\u00ebnon nj\u00eb timer q\u00eb ndjek koh\u00ebzgjatjen e objektit t\u00eb annotuar<\/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>Pikat e metriksave (Metrics Endpoints)<\/b><\/p>\n<p>Metrikat e aplikacioneve <noindex><a rel=\"nofollow\" href=\"http:\/\/localhost\">localhost<\/a><\/noindex>:8080\/metrics\/application<br \/>\nMetrikat baz\u00eb <noindex><a rel=\"nofollow\" href=\"http:\/\/localhost\">localhost<\/a><\/noindex>:8080\/metrics\/base<br \/>\nMetrikat e ofruesve <noindex><a rel=\"nofollow\" href=\"http:\/\/localhost\">localhost<\/a><\/noindex>:8080\/metrics\/vendor<br \/>\nT\u00eb gjitha metrikat <noindex><a rel=\"nofollow\" href=\"http:\/\/localhost\">localhost<\/a><\/noindex>:8080\/metrics<\/p>\n<h4>Rest-klienti MicroProfile<\/h4>\n<p>\nMikrosherbimet shpesh ofrojn\u00eb pika RESTful, p\u00ebr t\u00eb cilat k\u00ebrkohen API p\u00ebrkat\u00ebse klienti. P\u00ebr t\u00eb p\u00ebrdorur pikat RESTful, zhvilluesit e Spring zakonisht p\u00ebrdorin RestTemplate. Quarkus ofron p\u00ebr zgjidhjen e k\u00ebsaj problemi API-t\u00eb e MicroProfile Rest Client, shembuj t\u00eb p\u00ebrdorimit t\u00eb t\u00eb cilave jepen n\u00eb tabel\u00ebn 8.<\/p>\n<p>N\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jclingan\/quarkus-spring-microprofile\">n\u00eb projektin ton\u00eb t\u00eb shembullit<\/a><\/noindex> p\u00ebrdorimi i pikave RESTful realizohet me MicroProfile Rest Client. Informacione t\u00eb m\u00ebtejshme dhe shembuj rreth k\u00ebsaj mund t\u00eb gjenden n\u00eb udh\u00ebzuesin Quarkus. <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/rest-client\">Udh\u00ebzuesi i Rest Klientit<\/a><\/noindex>.<\/p>\n<p><i>Tabela 8. Shembuj t\u00eb p\u00ebrdorimit t\u00eb API-t\u00eb e MicroProfile Rest Client.<\/i><\/p>\n<p>Funksionet e MicroProfile Rest Client<br \/>\nP\u00ebrshkrimi<br \/>\nShembuj<\/p>\n<p>@RegisterRestClient<\/p>\n<p>Regjistron nj\u00eb nd\u00ebrfaqe t\u00eb tipizuar Java si klient REST<\/p>\n<pre><code class=\"plaintext\">@RegisterRestClient\n@Path(\"\/\")\npublic interface MyRestClient {\n    @GET\n    @Produces(MediaType.TEXT_PLAIN)\n    public String getSalutation();\n}\n<\/code><\/pre>\n<p>@RestClient<\/p>\n<p>Sh\u00ebnon injektimin e nj\u00eb instance t\u00eb nd\u00ebrfaqes tipizuar t\u00eb klientit REST<\/p>\n<pre><code class=\"plaintext\">@Autowired \/\/ or @Inject\n@RestClient\nMyRestClient restClient;\n<\/code><\/pre>\n<p>Thirrje<\/p>\n<p>Th\u00ebrret pik\u00ebn e REST<\/p>\n<pre><code class=\"plaintext\">System.out.println(\n   restClient.getSalutation());\n<\/code><\/pre>\n<p>mp-rest\/url<\/p>\n<p>P\u00ebrcakton pik\u00ebn e REST<\/p>\n<pre><code class=\"plaintext\">application.properties:\norg.example.MyRestClient\/mp-rest\/url=\n   http:\/\/localhost:8081\/myendpoint\n<\/code><\/pre>\n<p><\/p>\n<h3>P\u00ebrfundime<\/h3>\n<p>\nN\u00eb k\u00ebt\u00eb blog, q\u00eb \u00ebsht\u00eb kryesisht i dobish\u00ebm p\u00ebr zhvilluesit e Spring, ne e shqyrtova shkurtimisht se si n\u00eb Quarkus t\u00eb p\u00ebrdoren API-t\u00eb e Spring s\u00eb bashku me API-t\u00eb e MicroProfile p\u00ebr t\u00eb zhvilluar mikrosherbime Java dhe m\u00eb pas t'i kompilojm\u00eb ato n\u00eb kod t\u00eb natyrsh\u00ebm, q\u00eb kursen qindra megabajt t\u00eb RAM-it dhe e ngarkon p\u00ebr disa milisekonda.<\/p>\n<p>Si\u00e7 keni kuptuar, informacion t\u00eb m\u00ebtejsh\u00ebm mbi mb\u00ebshtetje p\u00ebr API-t\u00eb e Spring dhe MicroProfile, si edhe nj\u00eb mori informacioni tjet\u00ebr t\u00eb dobish\u00ebm mund t\u00eb gjenden n\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/\">udh\u00ebzuesit e Quarkus<\/a><\/noindex>.<br \/>\n<br \/>Burimi: <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.2 - 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\/sq\/blog\/administrirovanie\/kak-quarkus-obedinyaet-microprofile-i-spring\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"sq_AL\" \/>\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\/sq\/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\udd47Si Quarkus bashkon MicroProfile dhe Spring | ProHoster","description":"P\u00ebrsh\u00ebndetje t\u00eb gjith\u00ebve, dhe k\u00ebtu \u00ebsht\u00eb postimi i tret\u00eb nga seria mbi Quarkus!","canonical_url":"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/kak-quarkus-obedinyaet-microprofile-i-spring","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sq_AL","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\/sq\/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\/sq\/wp-json\/wp\/v2\/posts\/79987","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/comments?post=79987"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts\/79987\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/media\/79988"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/media?parent=79987"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/categories?post=79987"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/tags?post=79987"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}