{"id":74795,"date":"2020-03-20T20:42:21","date_gmt":"2020-03-20T17:42:21","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/kak-quarkus-obedinyaet-imperativnoe-i-reaktivnoe-programmirovanie"},"modified":"2020-03-20T20:42:21","modified_gmt":"2020-03-20T17:42:21","slug":"kak-quarkus-obedinyaet-imperativnoe-i-reaktivnoe-programmirovanie","status":"publish","type":"post","link":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/kak-quarkus-obedinyaet-imperativnoe-i-reaktivnoe-programmirovanie","title":{"rendered":"Cum Quarkus combin\u0103 programarea imperativ\u0103 \u0219i reactiv\u0103","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Anul acesta ne propunem s\u0103 dezvolt\u0103m serios temele containerelor, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.piter.com\/product_by_id\/112863337\">Java Cloud-Native<\/a><\/noindex> \u0219i <noindex><a rel=\"nofollow\" href=\"https:\/\/www.piter.com\/product_by_id\/125705747\">Kubernetes<\/a><\/noindex>. O continuare logic\u0103 a acestor teme va fi discutarea framework-ului Quarkus, deja <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/haulmont\/blog\/443242\/\">examinat<\/a><\/noindex> pe Habr. Articolul de ast\u0103zi nu este at\u00e2t despre cum func\u021bioneaz\u0103 \u00abJava subatomic\u0103 super rapid\u0103\u00bb, c\u00e2t despre perspectivele pe care Quarkus le aduce \u00een Enterprise.<\/p>\n<p><img decoding=\"async\" alt=\"Cum Quarkus combin\u0103 programarea imperativ\u0103 \u0219i reactiv\u0103\" src=\"\/wp-content\/uploads\/2020\/03\/6337d74cb66ee078c2b7c206be3d88fe.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nJava \u0219i JVM sunt \u00eenc\u0103 extrem de populare, dar \u00een contextul tehnologiilor f\u0103r\u0103 server \u0219i al microserviciilor cloud-native, Java \u0219i alte limbaje pentru JVM sunt din ce \u00een ce mai rar utilizate, deoarece consum\u0103 prea mult\u0103 memorie \u0219i se \u00eencarc\u0103 prea lent, ceea ce le face inadecvate pentru utilizarea \u00een containere cu o via\u021b\u0103 scurt\u0103. Din fericire, aceast\u0103 situa\u021bie \u00eencepe s\u0103 se schimbe datorit\u0103 lui Quarkus.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>Java subatomic\u0103 super rapid\u0103 a ajuns la un nou nivel!<\/h3>\n<p>\n42 de versiuni, 8 luni de munc\u0103 a comunit\u0103\u021bii \u0219i 177 de dezvoltatori uimitori - toate acestea au dus la lansarea \u00een noiembrie 2019 <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/topics\/quarkus\/\">Quarkus 1.0<\/a><\/noindex>, o versiune care marcheaz\u0103 un punct de cotitur\u0103 important \u00een dezvoltarea acestui proiect \u0219i ofer\u0103 o mul\u021bime de caracteristici \u0219i func\u021bionalit\u0103\u021bi grozave (mai multe detalii pot fi citite \u00een <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/blog\/announcing-quarkus-1-0\/\">anun\u021b<\/a><\/noindex>).<\/p>\n<p>Ast\u0103zi vom explica cum Quarkus combin\u0103 modelele de programare imperativ\u0103 \u0219i reactiv\u0103 bazate pe un nucleu reactiv unic. Vom \u00eencepe cu o scurt\u0103 excursie \u00een istorie \u0219i apoi vom analiza \u00een detaliu \u00een ce const\u0103 dualitatea nucleului reactiv al Quarkus \u0219i cum <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/topics\/enterprise-java\/\">Java<\/a><\/noindex>-dezvoltatorii pot profita de aceste avantaje.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/topics\/microservices\/\">Microservicii<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/topics\/event-driven\/\">arhitecturi gestionate prin evenimente<\/a><\/noindex> \u0219i <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/topics\/serverless-architecture\/\">func\u021bii serverless \u2013 toate acestea sunt ast\u0103zi, ce se cheam\u0103, \u00een ascensiune. Recent, a devenit mult mai simplu \u0219i accesibil s\u0103 construie\u0219ti arhitecturi cloud-native, dar problemele persist\u0103 \u2013 \u00een special pentru dezvoltatorii Java. De exemplu, \u00een cazul func\u021biilor serverless \u0219i microserviciilor exist\u0103 o necesitate acut\u0103 de a reduce timpul de pornire, de a diminua consumul de memorie \u0219i de a face dezvoltarea lor o activitate mai comod\u0103 \u0219i pl\u0103cut\u0103. Java a adus c\u00e2teva \u00eembun\u0103t\u0103\u021biri \u00een ultimii ani, cum ar fi ergnomicile \u00eembun\u0103t\u0103\u021bite pentru containere \u0219i altele. Totu\u0219i, ob\u021binerea unei func\u021bion\u0103ri normale a Java \u00eentr-un container r\u0103m\u00e2ne complex\u0103. De aceea, vom \u00eencepe cu analiza unor dificult\u0103\u021bi interne ale Java, care se manifest\u0103 \u00een mod distinct \u00een dezvoltarea aplica\u021biilor Java orientate pe containere.<\/a><\/noindex>-Func\u021biile sunt, a\u0219adar, \u00een prezent, \u00een plin\u0103 expansiune. De ceva vreme, crearea arhitecturilor orientate pe cloud a devenit mult mai u\u0219oar\u0103 \u0219i accesibil\u0103, \u00eens\u0103 problemele persist\u0103 \u2013 \u00een special pentru dezvoltatorii Java. De exemplu, \u00een cazul func\u021biilor serverless \u0219i al microserviciilor, exist\u0103 o necesitate acut\u0103 de a reduce timpul de ini\u021biere, de a diminua consumul de memorie \u0219i, totodat\u0103, de a face dezvoltarea lor mai convenabil\u0103 \u0219i pl\u0103cut\u0103. Java a adus \u00een ultimii ani c\u00e2teva \u00eembun\u0103t\u0103\u021biri, cum ar fi func\u021bionalitatea ergonomics, adaptat\u0103 pentru containere, \u0219i altele. Cu toate acestea, realizarea unei func\u021bion\u0103ri optime a Java \u00eentr-un container este, \u00een continuare, dificil\u0103. Prin urmare, vom \u00eencepe prin a analiza unele dintre complexit\u0103\u021bile interne ale Java, care se manifest\u0103 \u00een mod special \u00een timpul dezvolt\u0103rii aplica\u021biilor Java orientate pe containere.<\/p>\n<p>Pentru \u00eenceput, haide\u021bi s\u0103 ne \u00eentoarcem la istorie.<\/p>\n<p><img decoding=\"async\" alt=\"Cum Quarkus combin\u0103 programarea imperativ\u0103 \u0219i reactiv\u0103\" src=\"\/wp-content\/uploads\/2020\/03\/4478ef5c3b89a1bd91752a4ede74bdfd.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Fluxuri \u0219i containere<\/h3>\n<p>\n\u00cencep\u00e2nd cu versiunea 8u131, Java a \u00eenceput s\u0103 sprijine mai bine containerele prin \u00eembun\u0103t\u0103\u021biri ale func\u021bionalit\u0103\u021bii ergonomice. \u00cen special, acum JVM \u0219tie pe c\u00e2te nuclee de procesor ruleaz\u0103 \u0219i poate s\u0103-\u0219i ajusteze \u00een mod corespunz\u0103tor grupurile de fire \u2013 de obicei, grupuri fork\/join. F\u0103r\u0103 \u00eendoial\u0103, acest lucru este minunat, dar s\u0103 presupunem c\u0103 avem o aplica\u021bie web tradi\u021bional\u0103 care folose\u0219te servlet-uri HTTP \u0219i este rulat\u0103 \u00een Tomcat, Jetty etc. Ca rezultat, aceast\u0103 aplica\u021bie va aloca un fir separatat fiec\u0103rui request \u0219i \u00eei va permite s\u0103 blocheze acest fir \u00een a\u0219teptarea opera\u021biunilor de intrare-ie\u0219ire, de exemplu, atunci c\u00e2nd se face apel la o baz\u0103 de date, fi\u0219iere sau alte servicii. Asta \u00eenseamn\u0103 c\u0103 dimensiunea unei astfel de aplica\u021bii depinde nu de num\u0103rul de nuclee disponibile, ci de num\u0103rul de cereri simultane. \u00cen plus, aceasta \u00eenseamn\u0103 c\u0103 cotele sau limitele \u00een Kubernetes privind num\u0103rul de nuclee nu vor ajuta prea mult, iar situa\u021bia se va finaliza cu throttling.<\/p>\n<h3>Epuizarea memoriei<\/h3>\n<p>\nFirele sunt memorie. Iar restric\u021biile de memorie dintre containere nu sunt de niciun ajutor. Pur \u0219i simplu \u00eencepe\u021bi s\u0103 cre\u0219te\u021bi num\u0103rul de aplica\u021bii \u0219i fire, \u0219i mai devreme sau mai t\u00e2rziu ve\u021bi \u00eent\u00e2lni o cre\u0219tere critic\u0103 a frecven\u021bei comut\u0103rilor \u0219i, ca urmare, o degradare a performan\u021bei. \u00cen plus, dac\u0103 aplica\u021bia folose\u0219te framework-uri tradi\u021bionale de microservicii sau se conecteaz\u0103 la o baz\u0103 de date, sau utilizeaz\u0103 caching, sau \u00een orice alt mod consum\u0103 suplimentar memorie, este evident c\u0103 ave\u021bi nevoie de un instrument care s\u0103 v\u0103 permit\u0103 s\u0103 privi\u021bi \u00een interiorul JVM-ului \u0219i s\u0103 observa\u021bi cum gestioneaz\u0103 memoria, f\u0103r\u0103 a afecta \u00eens\u0103\u0219i JVM-ul (de exemplu, XX:+UseCGroupMemoryLimitForHeap). Chiar dac\u0103 \u00eencep\u00e2nd cu Java 9, JVM-ul a \u00eenv\u0103\u021bat s\u0103 recunoasc\u0103 cgroups \u0219i s\u0103 se adapteze \u00een mod corespunz\u0103tor, rezervarea \u0219i gestionarea memoriei r\u0103m\u00e2n ni\u0219te sarcini destul de complexe.<\/p>\n<h3>Cote \u0219i limite<\/h3>\n<p>\n\u00cen Java 11 a ap\u0103rut suport pentru cotele CPU (de genul PreferContainerQuotaForCPUCount). Kubernetes ofer\u0103, de asemenea, suport pentru limite \u0219i cote. Da, toate acestea au sens, dar, dac\u0103 aplica\u021bia dep\u0103\u0219e\u0219te din nou cota alocat\u0103, revenim la situa\u021bia \u00een care dimensiunea \u2013 la fel ca \u00een cazul aplica\u021biilor tradi\u021bionale Java \u2013 este determinat\u0103 de num\u0103rul de nuclee \u0219i se aloc\u0103 un fir separat pentru fiecare cerere, ceea ce \u00eenseamn\u0103 c\u0103 toate acestea nu sunt de mare folos.<br \/>\n\u00cen plus, chiar dac\u0103 folosim cote \u0219i limite sau func\u021bii de scalare orizontal\u0103 (scale-out) ale platformei care st\u0103 la baza Kubernetes, problema nu se rezolv\u0103 de la sine. Pur \u0219i simplu cheltuim mai multe resurse pentru a rezolva problema ini\u021bial\u0103 sau, \u00een final, ajungem la un consum excesiv de resurse. Iar dac\u0103 este un sistem de \u00eenalt\u0103 \u00eenc\u0103rcare \u00eentr-un nor public, aproape cu siguran\u021b\u0103 \u00eencepem s\u0103 folosim mai multe resurse dec\u00e2t ar fi necesar.<\/p>\n<h3>\u0218i ce s\u0103 facem cu toate acestea?<\/h3>\n<p>\nDac\u0103 vrem s\u0103 o spunem simplu, ar trebui s\u0103 folosim biblioteci \u0219i cadre de lucru asyncrone \u0219i non-blocante, precum Netty, <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/blog\/2019\/10\/21\/eclipse-vert-x-3-8-1-update-for-red-hat-runtimes\/\">Vert.x<\/a><\/noindex> sau Akka. Acestea sunt mult mai potrivite pentru utilizarea \u00een containere datorit\u0103 naturii lor reactive. Datorit\u0103 I\/O-ului non-blocant, aceea\u0219i fire de execu\u021bie poate gestiona mai multe cereri simultan. \u00cen timp ce o cerere a\u0219teapt\u0103 rezultatele I\/O-ului, firul care o proceseaz\u0103 este eliberat \u0219i preia o alt\u0103 cerere. Iar c\u00e2nd rezultatele I\/O-ului sosesc \u00een sf\u00e2r\u0219it, procesarea primei cereri continu\u0103. Altern\u00e2nd procesarea cererilor \u00een cadrul aceluia\u0219i fir, putem reduce num\u0103rul total de fire \u0219i s\u0103 sc\u0103dem consumul de resurse pentru procesarea cererilor.<\/p>\n<p>\u00cen cazul I\/O-ului non-blocant, num\u0103rul de nuclee devine un parametru cheie, deoarece acesta determin\u0103 num\u0103rul de fire de execu\u021bie I\/O care pot fi executate \u00een paralel. Folosit corect, acest lucru permite distribuirea eficient\u0103 a \u00eenc\u0103rc\u0103turii \u00eentre nuclee \u0219i gestionarea sarcinilor mai mari cu mai pu\u021bine resurse.<\/p>\n<h3>Cum, at\u00e2t \u0219i asta?<\/h3>\n<p>\nNu, mai este ceva. Programarea reactiv\u0103 ajut\u0103 la utilizarea mai bun\u0103 a resurselor, dar are \u0219i un cost asociat. \u00cen special, codul va trebui rescris conform principiilor non-bloc\u0103rii \u0219i trebuie s\u0103 evit\u0103m blocarea firelor de execu\u021bie I\/O. Aceasta este o modelare complet diferit\u0103 de dezvoltare \u0219i execu\u021bie. \u0218i de\u0219i exist\u0103 o mul\u021bime de biblioteci utile, tot r\u0103m\u00e2ne o schimbare radical\u0103 \u00een modul de g\u00e2ndire obi\u0219nuit.<\/p>\n<p>\u00cen primul r\u00e2nd, trebuie s\u0103 \u00eenve\u021bi s\u0103 scrii cod care se execut\u0103 \u00een mod asincron. Odat\u0103 ce \u00eencepi s\u0103 folose\u0219ti intrarea-ie\u0219irea neblocat, trebuie s\u0103 specifici clar ce ar trebui s\u0103 se \u00eent\u00e2mple c\u00e2nd prime\u0219ti un r\u0103spuns la cerere. Pur \u0219i simplu s\u0103 blochezi \u0219i s\u0103 a\u0219tep\u021bi nu mai este o op\u021biune. \u00cen schimb, po\u021bi transmite apeluri inverse, folosi programarea reactiv\u0103 sau continuarea. Dar asta nu este tot: pentru a utiliza intrarea-ie\u0219irea neblocat, ai nevoie de servere \u0219i clien\u021bi nebloca\u021bi, ideal \u00een toate locurile. \u00cen cazul HTTP, totul este simplu, dar mai exist\u0103 \u0219i baze de date, sisteme de fi\u0219iere \u0219i multe altele.<\/p>\n<p>\u0218i de\u0219i reac\u021bia total\u0103 \u00een serie ofer\u0103 maxima eficien\u021b\u0103, o astfel de schimbare poate fi greu de digerat \u00een practic\u0103. Prin urmare, capacitatea de a combina codul reactiv \u0219i cel imperativ devine o condi\u021bie necesar\u0103 pentru a:<\/p>\n<ol>\n<li>Utiliza eficient resursele \u00een cele mai aglomerate direc\u021bii ale sistemului software;<\/li>\n<li>Folosi un cod mai simplu din punct de vedere stilistic \u00een celelalte p\u0103r\u021bi ale acestuia.<\/li>\n<\/ol>\n<p><\/p>\n<h3>\u00ce\u021bi prezent\u0103m Quarkus<\/h3>\n<p>\nDe fapt, acesta este scopul lui Quarkus \u2013 de a combina modelele reactive \u0219i imperative \u00eentr-un singur mediu de execu\u021bie.<\/p>\n<p>La baza Quarkus se afl\u0103 Vert.x \u0219i Netty, deasupra c\u0103rora se folose\u0219te o serie de cadre \u0219i extensii reactive, concepute pentru a ajuta dezvoltatorul. Quarkus este destinat s\u0103 construiasc\u0103 nu doar microservicii HTTP, ci \u0219i arhitecturi bazate pe evenimente. Datorit\u0103 naturii sale reactive, func\u021bioneaz\u0103 foarte eficient cu sistemele de mesagerie (Apache Kafka, AMQP etc.).<\/p>\n<p>Toat\u0103 miza st\u0103 \u00een modul de utilizare a aceluia\u0219i motor reactiv at\u00e2t pentru codul imperativ, c\u00e2t \u0219i pentru cel reactiv.<\/p>\n<p><img decoding=\"async\" alt=\"Cum Quarkus combin\u0103 programarea imperativ\u0103 \u0219i reactiv\u0103\" src=\"\/wp-content\/uploads\/2020\/03\/f7269f4bb9d6767ab3bcc79d317861b0.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Quarkus se descurc\u0103 excelent cu asta. Alegerea \u00eentre programarea imperativ\u0103 \u0219i reactiv\u0103 este evident\u0103 \u2013 folosi\u021bi nucleul reactiv at\u00e2t pentru una, c\u00e2t \u0219i pentru cealalt\u0103. \u0218i ceea ce ajut\u0103 mult este codul rapid non-blocant care proceseaz\u0103 aproape tot ce trece prin firul ciclului de evenimente (event-loop thread, de asemenea \u2013 fir IO). Dar dac\u0103 ave\u021bi aplica\u021bii REST clasice sau aplica\u021bii pe partea clientului, Quarkus are modelul de programare imperativ preg\u0103tit. De exemplu, suportul HTTP \u00een Quarkus este construit pe utilizarea unui motor non-blocant \u0219i reactiv (Eclipse Vert.x \u0219i Netty). Toate cererile HTTP primite de aplica\u021bia dumneavoastr\u0103 trec mai \u00eent\u00e2i prin ciclul evenimentelor (IO Thread), apoi sunt trimise p\u0103r\u021bii de cod care se ocup\u0103 de cereri. \u00cen func\u021bie de destina\u021bie, codul de gestionare a cererilor poate fi apelat \u00een cadrul unui fir separat\u0103 (a\u0219a-numitul worker thread, folosit \u00een cazul servletelor \u0219i Jax-RS) sau poate utiliza firul de intrare-i\u0219ire original (ruta reactiv\u0103).<\/p>\n<p><img decoding=\"async\" alt=\"Cum Quarkus combin\u0103 programarea imperativ\u0103 \u0219i reactiv\u0103\" src=\"\/wp-content\/uploads\/2020\/03\/7338d6881fc9d7582f3fadf3e5f69618.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Pentru conectorii sistemelor de transmitere a mesajelor sunt utiliza\u021bi clien\u021bi non-blocan\u021bi, care func\u021bioneaz\u0103 pe baza motorului Vert.x. Astfel, pute\u021bi trimite, primi \u0219i procesa eficient mesaje din sisteme de tip messaging middleware.<\/p>\n<p>se men\u021bioneaz\u0103: <noindex><a rel=\"nofollow\" href=\"http:\/\/www.quarkus.io\/\">Quarkus.io<\/a><\/noindex> sunt disponibile mai multe ghiduri utile pentru a \u00eencepe lucrul cu Quarkus:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/reactive-routes-guide\">Folosirea rutelor reactive<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/reactive-sql-clients\">Clien\u021bi SQL reactivi<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/kafka-guide\">Folosirea Apache Kafka cu mesagerie reactiv\u0103<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/amqp-guide\">Folosirea AMQP cu mesagerie reactiv\u0103<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/using-vertx\">Folosirea API-ului Vert.x<\/a><\/noindex><\/li>\n<\/ul>\n<p>\n\u00cen plus, am preg\u0103tit lec\u021bii practice online pentru a v\u0103 familiariza cu diverse aspecte ale program\u0103rii reactive, iar pentru a le parcurge este suficient un browser; nu este necesar\u0103 nicio IDE, iar un computer nu este obligatoriu. Pute\u021bi g\u0103si aceste lec\u021bii <noindex><a rel=\"nofollow\" href=\"https:\/\/learn.openshift.com\/middleware\/courses\/middleware-quarkus\/\">aici<\/a><\/noindex>.<\/p>\n<h3>Resurse utile<\/h3>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.redhat.com\/cms\/managed-files\/cl-4-reasons-try-quarkus-checklist-f19180cs-201909-en.pdf\">4 motive s\u0103 \u00eencerca\u021bi Quarkus<\/a><\/noindex><\/li>\n<li>Site-ul proiectului Quarkus \u2013 <noindex><a rel=\"nofollow\" href=\"http:\/\/quarkus.io\">quarkus.io<\/a><\/noindex><\/li>\n<li>Proiectul Quarkus pe GitHub \u2013 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/quarkusio\/quarkus\">github.com\/quarkusio\/quarkus<\/a><\/noindex><\/li>\n<li>Twitterul proiectului Quarkus \u2013 <noindex><a rel=\"nofollow\" href=\"https:\/\/twitter.com\/QuarkusIO\">twitter.com\/QuarkusIO<\/a><\/noindex><\/li>\n<li>Chatul proiectului Quarkus \u2013 <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkusio.zulipchat.com\/\">quarkusio.zulipchat.com<\/a><\/noindex><\/li>\n<li>Forumurile proiectului Quarkus \u2013 <noindex><a rel=\"nofollow\" href=\"https:\/\/groups.google.com\/forum\/#\">groups.google.com\/forum\/#<\/a><\/noindex>!forum\/quarkus-dev<\/li>\n<\/ul>\n<h3>10 lec\u021bii video despre Quarkus pentru a v\u0103 familiariza cu subiectul<\/h3>\n<p>\nA\u0219a cum se men\u021bioneaz\u0103 pe site <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/\">Quarkus.io<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/blog\/2019\/05\/09\/create-your-first-quarkus-project-with-eclipse-ide-red-hat-codeready-studio\/\">Quarkus<\/a><\/noindex> , which combines <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/topics\/kubernetes\/\">Kubernetes<\/a><\/noindex>-stiva Java orientat\u0103, optimizat\u0103 pentru GraalVM \u0219i OpenJDK HotSpot \u0219i construit\u0103 din cele mai bune biblioteci Java \u0219i standarde.<\/p>\n<p>Pentru a v\u0103 ajuta s\u0103 \u00een\u021belege\u021bi subiectul, am selectat 10 lec\u021bii video care abordeaz\u0103 diverse aspecte ale Quarkus \u0219i exemple de utilizare:<\/p>\n<h4>1. Introducere \u00een Quarkus: un framework Java de nou\u0103 genera\u021bie pentru Kubernetes<\/h4>\n<p>\nAutori: Thomas Qvarnstrom \u0219i Jason Greene<br \/>\nScopul proiectului Quarkus este de a crea o platform\u0103 Java pentru Kubernetes \u0219i medii serverless, precum \u0219i de a combina modelele reactive \u0219i imperative de programare \u00eentr-un mediu de execu\u021bie unificat, astfel \u00eenc\u00e2t dezvoltatorii s\u0103 poat\u0103 varia flexibil abordarea \u00een lucrul cu o gam\u0103 larg\u0103 de arhitecturi distribuite ale aplica\u021biilor. Afla\u021bi mai multe din lec\u021bia introductiv\u0103 de mai jos.<\/p>\n<p><center><div class=\"youtube-placeholder\" data-id=\"ZCsWi_641Rk\" onclick=\"loadVideo(this)\">\r\n        <img decoding=\"async\" src=\"https:\/\/img.youtube.com\/vi\/ZCsWi_641Rk\/hqdefault.jpg\" alt=\"Reda\u021bi video\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><\/p>\n<h4>2. Quarkus: Java subatomic\u0103 superrapid\u0103<\/h4>\n<p>\nAutor: Burr Sutter<br \/>\nTutorialul video din cadrul DevNation Live demonstreaz\u0103 cum s\u0103 utiliza\u021bi Quarkus pentru a optimiza aplica\u021biile Java de corpora\u021bie, API-urile, microserviciile \u0219i func\u021biile serverless \u00een medii Kubernetes\/OpenShift, f\u0103c\u00e2ndu-le mult mai mici, mai rapide \u0219i mai scalabile.<\/p>\n<p><center><div class=\"youtube-placeholder\" data-id=\"7G_r1iyrn2c\" onclick=\"loadVideo(this)\">\r\n        <img decoding=\"async\" src=\"https:\/\/img.youtube.com\/vi\/7G_r1iyrn2c\/hqdefault.jpg\" alt=\"Reda\u021bi video\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><\/p>\n<h4>3. Quarkus \u0219i GraalVM: acceler\u0103m Hibernate la viteze super rapide \u0219i comprim\u0103m la dimensiuni subatomice<\/h4>\n<p>\nAutor: Sanne Grinovero<br \/>\nDin prezentare ve\u021bi afla cum a ap\u0103rut Quarkus, cum func\u021bioneaz\u0103 acesta \u0219i cum permite interoperabilitatea bibliotecilor complexe, precum Hibernate ORM, cu imaginile native GraalVM.<\/p>\n<p><center><div class=\"youtube-placeholder\" data-id=\"za5CSBX-UME\" onclick=\"loadVideo(this)\">\r\n        <img decoding=\"async\" src=\"https:\/\/img.youtube.com\/vi\/za5CSBX-UME\/hqdefault.jpg\" alt=\"Reda\u021bi video\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><\/p>\n<h4>4. \u00cenv\u0103\u021b\u0103m s\u0103 dezvolt\u0103m aplica\u021bii serverless<\/h4>\n<p>\nAutor: Marthen Luther<br \/>\n\u00cen videoclipul de mai jos, este prezentat cum s\u0103 crea\u021bi o aplica\u021bie Java simpl\u0103 folosind Quarkus \u0219i s\u0103 o desf\u0103\u0219ura\u021bi ca aplica\u021bie serverless pe Knative.<\/p>\n<p><center><div class=\"youtube-placeholder\" data-id=\"-c1Sh-1uAeM\" onclick=\"loadVideo(this)\">\r\n        <img decoding=\"async\" src=\"https:\/\/img.youtube.com\/vi\/-c1Sh-1uAeM\/hqdefault.jpg\" alt=\"Reda\u021bi video\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><\/p>\n<h4>5. Quarkus: codifica\u021bi cu pl\u0103cere<\/h4>\n<p>\nAutor: Edson Yanaga<br \/>\nGhid video pentru crearea primului vostru proiect Quarkus, care ajut\u0103 s\u0103 \u00een\u021belege\u021bi de ce Quarkus c\u00e2\u0219tig\u0103 inimile dezvoltatorilor.<\/p>\n<p><center><div class=\"youtube-placeholder\" data-id=\"8r3ZV36ah4I\" onclick=\"loadVideo(this)\">\r\n        <img decoding=\"async\" src=\"https:\/\/img.youtube.com\/vi\/8r3ZV36ah4I\/hqdefault.jpg\" alt=\"Reda\u021bi video\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><\/p>\n<h4>6. Java \u0219i containere \u2013 cum va fi viitorul lor comun<\/h4>\n<p>\nAutor: Mark Little<br \/>\nAceast\u0103 prezentare v\u0103 introduce \u00een istoria Java \u0219i explic\u0103 de ce Quarkus este viitorul Java.<\/p>\n<p><center><div class=\"youtube-placeholder\" data-id=\"O085h6jKBWc\" onclick=\"loadVideo(this)\">\r\n        <img decoding=\"async\" src=\"https:\/\/img.youtube.com\/vi\/O085h6jKBWc\/hqdefault.jpg\" alt=\"Reda\u021bi video\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><\/p>\n<h4>7. Quarkus: Java subatomic\u0103 superrapid\u0103<\/h4>\n<p>\nAutor: Dimitris Andreadis<br \/>\nO prezentare general\u0103 a avantajelor Quarkus, recunoscute de dezvoltatori: simplitate, viteze extreme, cele mai bune biblioteci \u0219i standarde.<\/p>\n<p><center><div class=\"youtube-placeholder\" data-id=\"UWETnSFB0WA\" onclick=\"loadVideo(this)\">\r\n        <img decoding=\"async\" src=\"https:\/\/img.youtube.com\/vi\/UWETnSFB0WA\/hqdefault.jpg\" alt=\"Reda\u021bi video\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><\/p>\n<h4>8. Quarkus \u0219i sistemele reactive subatomice<\/h4>\n<p>\nAutor: Clement Escoffier<br \/>\nDatorit\u0103 integr\u0103rii cu GraalVM, Quarkus ofer\u0103 o experien\u021b\u0103 de dezvoltare super rapid\u0103 \u0219i un mediu de execu\u021bie subatomic. Autorul vorbe\u0219te despre latura reactiv\u0103 a Quarkus \u0219i cum s\u0103 o folosim la crearea aplica\u021biilor reactive \u0219i aplica\u021biilor cu transmitere de date \u00een flux.<\/p>\n<p><center><div class=\"youtube-placeholder\" data-id=\"trwJxZawglc\" onclick=\"loadVideo(this)\">\r\n        <img decoding=\"async\" src=\"https:\/\/img.youtube.com\/vi\/trwJxZawglc\/hqdefault.jpg\" alt=\"Reda\u021bi video\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><\/p>\n<h4>9. Quarkus \u0219i dezvoltarea rapid\u0103 a aplica\u021biilor \u00een Eclipse MicroProfile<\/h4>\n<p>\nAutor: John Clingan<br \/>\nPrin combinarea Eclipse MicroProfile \u0219i Quarkus, dezvoltatorii pot crea aplica\u021bii containerizate MicroProfile complet func\u021bionale, care pornesc \u00een c\u00e2teva zeci de milisecunde. \u00cen acest videoclip se analizeaz\u0103 \u00een detaliu cum se poate codifica o aplica\u021bie containerizat\u0103 MicroProfile pentru desf\u0103\u0219urarea pe platforma Kubernetes.<\/p>\n<p><center><div class=\"youtube-placeholder\" data-id=\"hReKM6rmcho\" onclick=\"loadVideo(this)\">\r\n        <img decoding=\"async\" src=\"https:\/\/img.youtube.com\/vi\/hReKM6rmcho\/hqdefault.jpg\" alt=\"Reda\u021bi video\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><\/p>\n<h4>10. Java, versiunea \u201eTurbo\u201d<\/h4>\n<p>\nAutor: Marcus Biel<br \/>\nAutorul arat\u0103 cum se poate utiliza Quarkus pentru a crea containere Java super-mici \u0219i super-rapide, permi\u021b\u00e2nd astfel o adev\u0103rat\u0103 revolu\u021bie, \u00een special \u00een medii f\u0103r\u0103 server.<\/p>\n<p><center><div class=\"youtube-placeholder\" data-id=\"eqUApOrYeS8\" onclick=\"loadVideo(this)\">\r\n        <img decoding=\"async\" src=\"https:\/\/img.youtube.com\/vi\/eqUApOrYeS8\/hqdefault.jpg\" alt=\"Reda\u021bi video\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><br \/>\n<br \/>Sursa: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/redhatrussia\/blog\/493010\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412 \u044d\u0442\u043e\u043c \u0433\u043e\u0434\u0443 \u043c\u044b \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u043c \u0432\u0441\u0435\u0440\u044c\u0435\u0437 \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0442\u044c \u0442\u0435\u043c\u044b \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432, Cloud-Native Java \u0438 Kubernetes. \u041b\u043e\u0433\u0438\u0447\u043d\u044b\u043c \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435\u043c \u044d\u0442\u0438\u0445 \u0442\u0435\u043c \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0441\u0441\u043a\u0430\u0437 \u043e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0435 Quarkus, \u0443\u0436\u0435 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u043d\u043e\u043c \u043d\u0430 \u0425\u0430\u0431\u0440\u0435. \u0421\u0435\u0433\u043e\u0434\u043d\u044f\u0448\u043d\u044f\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u0430 \u043d\u0435 \u0441\u0442\u043e\u043b\u044c\u043a\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0443 \u00ab\u0441\u0443\u0431\u0430\u0442\u043e\u043c\u043d\u043e\u0439 \u0441\u0432\u0435\u0440\u0445\u0431\u044b\u0441\u0442\u0440\u043e\u0439 Java\u00bb, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0442\u0435\u043c \u043f\u0435\u0440\u0441\u043f\u0435\u043a\u0442\u0438\u0432\u0430\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 Quarkus \u043f\u0440\u0438\u0432\u043d\u043e\u0441\u0438\u0442 \u0432 Enterprise. Java \u0438 JVM \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b, \u043d\u043e \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0431\u0435\u0441\u0441\u0435\u0440\u0432\u0435\u0440\u043d\u044b\u043c\u0438 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044f\u043c\u0438 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":74796,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-74795","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=\"description\" content=\"\u0412 \u044d\u0442\u043e\u043c \u0433\u043e\u0434\u0443 \u043c\u044b \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u043c \u0432\u0441\u0435\u0440\u044c\u0435\u0437 \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0442\u044c \u0442\u0435\u043c\u044b \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432, Cloud-Native Java \u0438\" \/>\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\/kak-quarkus-obedinyaet-imperativnoe-i-reaktivnoe-programmirovanie\" \/>\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\udd47\u041a\u0430\u043a Quarkus \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0435\u0442 \u0438\u043c\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0435 \u0438 \u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0412 \u044d\u0442\u043e\u043c \u0433\u043e\u0434\u0443 \u043c\u044b \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u043c \u0432\u0441\u0435\u0440\u044c\u0435\u0437 \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0442\u044c \u0442\u0435\u043c\u044b \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432, Cloud-Native Java \u0438\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/kak-quarkus-obedinyaet-imperativnoe-i-reaktivnoe-programmirovanie\" \/>\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:21+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-03-20T17:42:21+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\udd47 Cum combin\u0103 Quarkus programarea imperativ\u0103 \u0219i reactiv\u0103 | ProHoster","description":"Anul acesta ne propunem s\u0103 dezvolt\u0103m \u00een mod serios temele de containere, Cloud-Native Java \u0219i","canonical_url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/kak-quarkus-obedinyaet-imperativnoe-i-reaktivnoe-programmirovanie","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\udd47\u041a\u0430\u043a Quarkus \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0435\u0442 \u0438\u043c\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0435 \u0438 \u0440\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 | ProHoster","og:description":"\u0412 \u044d\u0442\u043e\u043c \u0433\u043e\u0434\u0443 \u043c\u044b \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u043c \u0432\u0441\u0435\u0440\u044c\u0435\u0437 \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0442\u044c \u0442\u0435\u043c\u044b \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432, Cloud-Native Java \u0438","og:url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/kak-quarkus-obedinyaet-imperativnoe-i-reaktivnoe-programmirovanie","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:21+00:00","article:modified_time":"2020-03-20T17:42:21+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"74795","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-10-01 02:07:41","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\/74795","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=74795"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/74795\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media\/74796"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media?parent=74795"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/categories?post=74795"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/tags?post=74795"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}