{"id":74793,"date":"2020-03-20T20:42:19","date_gmt":"2020-03-20T17:42:19","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/quarkus-sverhzvukovaya-subatomnaya-java-kratkij-obzor-frejmvorka"},"modified":"2020-03-20T20:42:19","modified_gmt":"2020-03-20T17:42:19","slug":"quarkus-sverhzvukovaya-subatomnaya-java-kratkij-obzor-frejmvorka","status":"publish","type":"post","link":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/quarkus-sverhzvukovaya-subatomnaya-java-kratkij-obzor-frejmvorka","title":{"rendered":"Quarkus \u2014 Java subsonic\u0103 subatomic\u0103. Un scurt rezumat al framework-ului","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Quarkus \u2014 Java subsonic\u0103 subatomic\u0103. Un scurt rezumat al framework-ului\" src=\"\/wp-content\/uploads\/2020\/03\/b40e193b4a696206aad8b08a5e4795a1.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<h3 id=\"vvedenie\">Introducere<\/h3>\n<p><\/p>\n<p>Pe 7 martie, compania RedHat (\u00een cur\u00e2nd \u2014 IBM) <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/blog\/2019\/03\/07\/quarkus-next-generation-kubernetes-native-java-framework\/\">a prezentat<\/a><\/noindex> un nou cadru \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/\">Quarkus<\/a><\/noindex>. Potrivit dezvoltatorilor, acest cadru se bazeaz\u0103 pe GraalVM \u0219i OpenJDK HotSpot \u0219i este destinat Kubernetes. Stiva Quarkus include: JPA\/Hibernate, JAX-RS\/RESTEasy, Eclipse Vert.x, Netty, Apache Camel, Kafka, Prometheus \u0219i altele.<\/p>\n<p><\/p>\n<p>Scopul cre\u0103rii este de a face Java o platform\u0103 de frunte pentru desf\u0103\u0219urarea \u00een Kubernetes \u0219i dezvoltarea aplica\u021biilor serverless, oferind dezvoltatorilor o abordare unificat\u0103 at\u00e2t pentru dezvoltarea reactiv\u0103, c\u00e2t \u0219i pentru cea imperativ\u0103.<\/p>\n<p><\/p>\n<p>Dac\u0103 ne uit\u0103m la <noindex><a rel=\"nofollow\" href=\"https:\/\/dzone.com\/articles\/classification-of-development-frameworks-for-enter\"><u>aceast\u0103<\/u><\/a><\/noindex> \u00een clasificarea cadrelor, Quarkus se \u00eencadreaz\u0103 undeva \u00eentre &#171;Aggregatori\/Generatoare de cod&#187; \u0219i &#171;Cadre fullstack de nivel \u00eenalt&#187;. Este deja mai mult dec\u00e2t un agregator, dar nu ajunge la full-stack, deoarece este destinat dezvolt\u0103rii backend.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Se promite o vitez\u0103 de pornire foarte mare a aplica\u021biei \u0219i un consum sc\u0103zut de memorie. Iat\u0103 datele de pe site-ul dezvoltatorului:<\/p>\n<p><\/p>\n<p>Timp de la pornire p\u00e2n\u0103 la primul r\u0103spuns (s):<\/p>\n<p><\/p>\n<p>Configura\u021bie<br \/>\nREST<br \/>\nREST+JPA<\/p>\n<p>Quarkus+GraalVM<br \/>\n0.014<br \/>\n0.055<\/p>\n<p>Quarkus+OpenJDK<br \/>\n0.75<br \/>\n2.5<\/p>\n<p>Stiva Cloud Native tradi\u021bional\u0103*<br \/>\n4.3<br \/>\n9.5<\/p>\n<p><\/p>\n<p>Consumul de memorie (Mb):<\/p>\n<p><\/p>\n<p>Configura\u021bie<br \/>\nREST<br \/>\nREST+JPA<\/p>\n<p>Quarkus+GraalVM<br \/>\n13<br \/>\n35<\/p>\n<p>Quarkus+OpenJDK<br \/>\n74<br \/>\n130<\/p>\n<p>Stiva Cloud Native tradi\u021bional\u0103*<br \/>\n140<br \/>\n218<\/p>\n<p><\/p>\n<p>Impresionant, nu-i a\u0219a?<\/p>\n<p><\/p>\n<p>*<em>Informa\u021bii despre aceast\u0103 stiv\u0103 de tehnologii nu am g\u0103sit, se poate presupune c\u0103 este un fel de Spring Boot cu accesorii suplimentare.<\/em>.<\/p>\n<p><\/p>\n<h3 id=\"hello-world\">Hello World!<\/h3>\n<p><\/p>\n<p>Cel mai simplu aplica\u021bie scris\u0103 pe Quarkus va ar\u0103ta astfel:<\/p>\n<p><\/p>\n<pre><code class=\"java\">@Path(\"\/hello\")\npublic class GreetingResource {\n\n   @GET\n   @Produces(MediaType.TEXT_PLAIN)\n   public String hello() {\n       return \"hello\";\n   }\n}<\/code><\/pre>\n<p><\/p>\n<p>Este practic o singur\u0103 clas\u0103 \u0219i este suficient! Po\u021bi porni aplica\u021bia folosind Maven \u00een modul de dezvoltare:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">mvn compile quarkus:dev\n\u2026\n$ curl http:\/\/localhost:8080\/hello\nhello<\/code><\/pre>\n<p><\/p>\n<p>Diferen\u021ba fa\u021b\u0103 de aplica\u021bia obi\u0219nuit\u0103 \u2014 nu exist\u0103 clasa Application! Quarkus suport\u0103 re\u00eenc\u0103rcarea rapid\u0103, a\u0219a c\u0103 po\u021bi schimba aplica\u021bia f\u0103r\u0103 a o reporni, ceea ce face dezvoltarea \u0219i mai rapid\u0103. <\/p>\n<p><\/p>\n<p>Ce urmeaz\u0103? Po\u021bi ad\u0103uga un serviciu \u00een controller folosind nota\u021bia <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/inject\/\" class=\"user_link\">Inject<\/a><\/noindex>. Codul serviciului:<\/p>\n<p><\/p>\n<pre><code class=\"java\">@ApplicationScoped\npublic class GreetingService {\n\n   public String greeting(String name) {\n       return \"Hello \" + name + \"!\";\n   }\n}<\/code><\/pre>\n<p><\/p>\n<p>Controlerul:<\/p>\n<p><\/p>\n<pre><code class=\"java\">@Path(\"\/hello\")\npublic class GreetingResource {\n\n   @Inject\n   GreetingService service;\n\n   @GET\n   @Produces(MediaType.TEXT_PLAIN)\n   @Path(\"\/{name}\")\n   public String greeting(@PathParam(\"name\") String name) {\n       return service.greeting(name);\n   }\n}<\/code><\/pre>\n<p><\/p>\n<pre><code class=\"plaintext\">$ curl http:\/\/localhost:8080\/hello\/developer\nHello developer!<\/code><\/pre>\n<p><\/p>\n<p>Observa\u021bi c\u0103 \u00een Quarkus sunt folosite nota\u021bii standard din cadrele cunoscute \u2014 CDI \u0219i JAX-RS. Nu este nevoie s\u0103 \u00eenve\u021bi nimic nou, dac\u0103 ai lucrat cu CDI \u0219i JAX-RS \u00eenainte, desigur. <\/p>\n<p><\/p>\n<h3 id=\"rabota-s-bazoy-dannyh\">Lucrul cu baza de date<\/h3>\n<p><\/p>\n<p>Se utilizeaz\u0103 Hibernate \u0219i standardele JPA pentru entit\u0103\u021bi. Ca \u0219i \u00een cazul controlerelor REST, este necesar s\u0103 scrie\u021bi un minim de cod. Este suficient s\u0103 specifica\u021bi dependen\u021bele \u00een fi\u0219ierul de construc\u021bie \u0219i s\u0103 ad\u0103uga\u021bi adnot\u0103rile. <code>@Entity<\/code> \u0219i s\u0103 configura\u021bi datasource \u00een application.properties. <\/p>\n<p><\/p>\n<p>Asta e tot. Niciun sessionFactory, persistence.xml \u0219i alte fi\u0219iere de servicii. Scriem doar codul de care avem nevoie. Totu\u0219i, dac\u0103 este necesar, se poate crea un fi\u0219ier persistence.xml \u0219i se poate configura DAO-ul mai detaliat. <\/p>\n<p><\/p>\n<p>Quarkus suport\u0103 caching pentru entit\u0103\u021bi, colec\u021bii pentru rela\u021bii de tip unul-la-mul\u021bi, precum \u0219i pentru interog\u0103ri. La prima vedere, pare grozav, dar <em>este un<\/em> cache local, pentru un singur nod Kubernetes. Adic\u0103, cache-urile diferitelor noduri nu sunt sincronizate \u00eentre ele. Sper c\u0103 este temporar. <\/p>\n<p><\/p>\n<h3 id=\"asinhronnoe-vypolnenie-koda\">Executarea asincron\u0103 a codului<\/h3>\n<p><\/p>\n<p>A\u0219a cum am men\u021bionat anterior, Quarkus suport\u0103 \u0219i stilul de programare reactiv. Codul aplica\u021biei anterioare poate fi scris \u00eentr-o alt\u0103 form\u0103.<\/p>\n<p><\/p>\n<pre><code class=\"java\">@Path(\"\/hello\")\npublic class GreetingResource {\n\n   @GET\n   @Produces(MediaType.TEXT_PLAIN)\n   @Path(\"\/{name}\")\n   public CompletionStage greeting(@PathParam(\"name\") String name) {\n       return CompletableFuture.supplyAsync(() -&gt; {\n           return \"Hello \" + name + \"!\";\n       });\n   }\n}<\/code><\/pre>\n<p><\/p>\n<p>Codul asincron poate fi de asemenea mutat \u00eentr-un serviciu, rezultatul va fi acela\u0219i. <\/p>\n<p><\/p>\n<h3 id=\"testirovanie\">Testare<\/h3>\n<p><\/p>\n<p>Testele pentru aplica\u021biile Quarkus pot fi scrise utiliz\u00e2nd JUnit4 sau JUnit5. Mai jos este un exemplu de test pentru endpoint, scris cu ajutorul RestAssured, dar se poate folosi \u0219i un alt framework: <\/p>\n<p><\/p>\n<pre><code class=\"java\">@QuarkusTest\npublic class GreetingResourceTest {\n\n   @Test\n   public void testGreetingEndpoint() {\n       String uuid = UUID.randomUUID().toString();\n       given()\n         .pathParam(\"name\", uuid)\n         .when().get(\"\/hello\/{name}\")\n         .then()\n           .statusCode(200)\n           .body(is(\"Hello \" + uuid + \"!\"));\n   }\n}<\/code><\/pre>\n<p><\/p>\n<p>Adnotarea @QuarkusTest indic\u0103 faptul c\u0103 aplica\u021bia trebuie s\u0103 fie pornit\u0103 \u00eenainte de a rula testele. \u00cen rest, codul este familiar pentru orice dezvoltator. <\/p>\n<p><\/p>\n<h3 id=\"platformo-zavisimoe-prilozhenie\">Aplica\u021bie dependent\u0103 de platform\u0103<\/h3>\n<p><\/p>\n<p>Deoarece Quarkus este str\u00e2ns integrat cu GraalVM, este posibil s\u0103 genera\u021bi cod dependent de platform\u0103. Pentru aceasta, trebuie s\u0103 instala\u021bi GraalVM \u0219i s\u0103 specifica\u021bi variabila de mediu GRAALVM_HOME. Apoi, <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/quarkusio\/quarkus-quickstarts\/blob\/fae88eaab10ed4d68ac44e0b8b7416e631b8a6f9\/getting-started-knative\/pom.xml#L105\">trebuie s\u0103 scrie\u021bi un profil pentru construc\u021bie<\/a><\/noindex> \u0219i s\u0103-l specifica\u021bi la construirea aplica\u021biei:<\/p>\n<p><\/p>\n<pre><code class=\"java\">mvn package -Pnative<\/code><\/pre>\n<p><\/p>\n<p>Ce este interesant, aplica\u021bia generat\u0103 poate fi testat\u0103. \u0218i aceasta este important\u0103, deoarece executarea codului \u201enativ\u201d poate diferi de execu\u021bia pe JVM. Annota\u021bia @SubstrateTest porne\u0219te codul dependent de platform\u0103 al aplica\u021biei. Reutilizarea codului existent pentru teste se poate face prin mo\u0219tenire, astfel \u00eenc\u00e2t codul pentru testarea aplica\u021biei dependent de platform\u0103 va ar\u0103ta astfel:<\/p>\n<p><\/p>\n<pre><code class=\"java\">@SubstrateTest\npublic class GreetingResourceIT extends GreetingResourceTest {\n\n}<\/code><\/pre>\n<p><\/p>\n<p>Imaginea generat\u0103 poate fi \u00eempachetat\u0103 \u00een Docker \u0219i rulat\u0103 \u00een Kubernetes sau OpenShift, detaliile sunt descrise \u00een <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/kubernetes-guide\">instruc\u021biuni<\/a><\/noindex>.<\/p>\n<p><\/p>\n<h3 id=\"instrumentariy\">Instrumentar<\/h3>\n<p><\/p>\n<p>Framework-ul Quarkus poate fi folosit cu Maven \u0219i Gradle. Maven este complet suportat, spre deosebire de Gradle. Din p\u0103cate, \u00een prezent, Gradle nu suport\u0103 generarea unui proiect gol, pe site exist\u0103 detalii <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/gradle-tooling.html\">tutorial<\/a><\/noindex>.<\/p>\n<p><\/p>\n<h3 id=\"rasshireniya\">Extensii<\/h3>\n<p><\/p>\n<p>Quarkus este un framework extensibil. \u00cen prezent exist\u0103 aproximativ <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/extensions\/\">40 de extensii<\/a><\/noindex>, care adaug\u0103 func\u021bionalit\u0103\u021bi diverse \u2014 de la suport pentru <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/extensions\/#migration\">containerul Spring DI<\/a><\/noindex> \u0219i <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/extensions\/#integration\">Apache Camel<\/a><\/noindex> p\u00e2n\u0103 la jurnalizare \u0219i publicarea de metrice pentru serviciile active. De asemenea, exist\u0103 deja o extensie pentru suportul dezvolt\u0103rii aplica\u021biilor \u00een limbajul Kotlin, pe l\u00e2ng\u0103 Java. <\/p>\n<p><\/p>\n<h2 id=\"zaklyuchenie\">Concluzie<\/h2>\n<p><\/p>\n<p>\u00cen opinia mea, Quarkus se aliniaz\u0103 bine tendin\u021belor actuale. Dezvoltarea codului backend devine din ce \u00een ce mai simpl\u0103, iar acest framework simplific\u0103 \u0219i mai mult \u0219i accelereaz\u0103 dezvoltarea serviciilor, ad\u0103ug\u00e2nd suport \u201enativ\u201d pentru Docker \u0219i Kubernetes. Un mare avantaj \u2014 suportul \u00eencorporat pentru GraalVM \u0219i generarea de imagini dependente de platform\u0103, ceea ce permite crearea de servicii care pornesc cu adev\u0103rat rapid \u0219i ocup\u0103 pu\u021bin spa\u021biu \u00een memorie. \u0218i acest lucru este foarte important \u00een vremurile noastre de popularitate a microserviciilor \u0219i arhitecturii serverless.<\/p>\n<p><\/p>\n<p>Site-ul oficial \u2014 <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/\">quarkus.io<\/a><\/noindex>. Exemple de proiecte pentru un start rapid sunt deja disponibile pe <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/quarkusio\/quarkus-quickstarts\">GitHub<\/a><\/noindex>.\n<\/p>\n<p>Sursa: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/haulmont\/blog\/443242\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0421\u0435\u0434\u044c\u043c\u043e\u0433\u043e \u043c\u0430\u0440\u0442\u0430 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f RedHat (\u0432\u0441\u043a\u043e\u0440\u0435 \u2014 IBM) \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u043b\u0430 \u043d\u043e\u0432\u044b\u0439 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u2014 Quarkus. \u041f\u043e \u0441\u043b\u043e\u0432\u0430\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432, \u044d\u0442\u043e\u0442 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0431\u0430\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0430 GraalVM \u0438 OpenJDK HotSpot \u0438 \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d \u0434\u043b\u044f Kubernetes. \u0421\u0442\u0435\u043a Quarkus \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432 \u0441\u0435\u0431\u044f: JPA\/Hibernate, JAX-RS\/RESTEasy, Eclipse Vert.x, Netty, Apache Camel, Kafka, Prometheus \u0438 \u0434\u0440\u0443\u0433\u0438\u0435. \u0426\u0435\u043b\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u2014 \u0441\u0434\u0435\u043b\u0430\u0442\u044c Java \u043b\u0438\u0434\u0438\u0440\u0443\u044e\u0449\u0435\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e\u0439 \u0434\u043b\u044f \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u0432 Kubernetes [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":74794,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-74793","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.1 - aioseo.com -->\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\/ro\/blog\/administrirovanie\/quarkus-sverhzvukovaya-subatomnaya-java-kratkij-obzor-frejmvorka\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"ro_RO\" \/>\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\udd47Quarkus \u2014 \u0441\u0432\u0435\u0440\u0445\u0437\u0432\u0443\u043a\u043e\u0432\u0430\u044f \u0441\u0443\u0431\u0430\u0442\u043e\u043c\u043d\u0430\u044f Java. \u041a\u0440\u0430\u0442\u043a\u0438\u0439 \u043e\u0431\u0437\u043e\u0440 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 | ProHoster\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/quarkus-sverhzvukovaya-subatomnaya-java-kratkij-obzor-frejmvorka\" \/>\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-03-20T17:42:19+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-03-20T17:42:19+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\udd47Quarkus \u2014 Java subatomic\u0103 hipersonic\u0103. O scurt\u0103 prezentare a framework-ului | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/quarkus-sverhzvukovaya-subatomnaya-java-kratkij-obzor-frejmvorka","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"ro_RO","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\udd47Quarkus \u2014 \u0441\u0432\u0435\u0440\u0445\u0437\u0432\u0443\u043a\u043e\u0432\u0430\u044f \u0441\u0443\u0431\u0430\u0442\u043e\u043c\u043d\u0430\u044f Java. \u041a\u0440\u0430\u0442\u043a\u0438\u0439 \u043e\u0431\u0437\u043e\u0440 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 | ProHoster","og:url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/quarkus-sverhzvukovaya-subatomnaya-java-kratkij-obzor-frejmvorka","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-03-20T17:42:19+00:00","article:modified_time":"2020-03-20T17:42:19+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"74793","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 18:07:28","updated":"2022-09-30 18:17:47","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/74793","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/comments?post=74793"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/74793\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media\/74794"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media?parent=74793"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/categories?post=74793"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/tags?post=74793"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}