{"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\/hr\/blog\/administrirovanie\/kak-quarkus-obedinyaet-imperativnoe-i-reaktivnoe-programmirovanie","title":{"rendered":"Kako Quarkus spaja imperativno i reaktivno programiranje","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Ove godine planiramo ozbiljno razvijati teme kontejnera, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.piter.com\/product_by_id\/112863337\">Cloud-Native Java<\/a><\/noindex> i <noindex><a rel=\"nofollow\" href=\"https:\/\/www.piter.com\/product_by_id\/125705747\">Kubernetes<\/a><\/noindex>. Logi\u010dno nastavak ovih tema bit \u0107e razgovor o frameworku Quarkus, ve\u0107 <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/haulmont\/blog\/443242\/\">razmatranom<\/a><\/noindex> na Habr\u00e9. Dana\u0161nja prilog posve\u0107en je ne toliko ure\u0111aju \"subatomske super brze Java\", koliko perspektivama koje Quarkus donosi u Enterprise.<\/p>\n<p><img decoding=\"async\" alt=\"Kako Quarkus spaja imperativno i reaktivno programiranje\" src=\"\/wp-content\/uploads\/2020\/03\/6337d74cb66ee078c2b7c206be3d88fe.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nJava i JVM su i dalje izuzetno popularni, ali prilikom rada s serverless tehnologijama i obla\u010dno orijentiranim mikroslu\u017ebama, Java i drugi jezici za JVM se sve re\u0111e koriste, jer zauzimaju previ\u0161e memorije i sporo se u\u010ditavaju, zbog \u010dega slabo odgovaraju za kori\u0161tenje s kratkotrajim kontejnerima. Na sre\u0107u, ova situacija se trenutno po\u010dinje mijenjati zahvaljuju\u0107i Quarkus.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>Super brza subatomska Java je dostigla novu razinu!<\/h3>\n<p>\n42 izdanja, 8 mjeseci rada zajednice i 177 nevjerojatnih developera \u2013 rezultat svega ovoga bio je izlazak u novembru 2019. godine <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/topics\/quarkus\/\">Quarkus 1.0<\/a><\/noindex>, izdanja koje ozna\u010dava va\u017enu prekretnicu u razvoju projekta i nudi brojne sjajne funkcije i mogu\u0107nosti (vi\u0161e o njima mo\u017eete pro\u010ditati u <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/blog\/announcing-quarkus-1-0\/\">najavi<\/a><\/noindex>).<\/p>\n<p>Danas \u0107emo pri\u010dati kako Quarkus spaja modele imperativnog i reaktivnog programiranja na osnovi jedinstvenog reaktivnog jezgra. Po\u010det \u0107emo s kratkim uvodom u povijest, a zatim \u0107emo detaljno razraditi u \u010demu se sastoji dualnost reaktivnog jezgra Quarkus i kako <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/topics\/enterprise-java\/\">Java<\/a><\/noindex>-programeri mogu iskoristiti ove prednosti.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/topics\/microservices\/\">Mikroslu\u017ebe<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/topics\/event-driven\/\">arhitekture vo\u0111ene doga\u0111ajima<\/a><\/noindex> i <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/topics\/serverless-architecture\/\">serverless<\/a><\/noindex>-funkcije \u2013 sve to danas, \u0161to se mo\u017ee re\u0107i, na vrhuncu je. U posljednje vrijeme kreiranje obla\u010dno orijentiranih arhitektura postalo je mnogo jednostavnije i pristupa\u010dnije, me\u0111utim problemi su ostali \u2013 posebno za Java developere. Na primjer, u slu\u010daju serverless funkcija i mikroslu\u017ebi postoji hitna potreba za smanjenjem vremena pokretanja, smanjenjem potro\u0161nje memorije i u\u010diniti njihov razvoj ugodnijim i jednostavnijim. Java je u posljednjih nekoliko godina unijela nekoliko pobolj\u0161anja, poput doradnog funkcionalnog ergonomske podr\u0161ke za kontejnere i sli\u010dno. Me\u0111utim, postizanje normalnog rada Java u kontejneru jo\u0161 uvijek je izazovno. Stoga \u0107emo po\u010deti razmatrati neke od unutarnjih slo\u017eenosti Jave, koje se posebno isti\u010du prilikom razvoja kontejnerski orijentiranih Java aplikacija.<\/p>\n<p>Za po\u010detak, obratimo se povijesti.<\/p>\n<p><img decoding=\"async\" alt=\"Kako Quarkus spaja imperativno i reaktivno programiranje\" src=\"\/wp-content\/uploads\/2020\/03\/4478ef5c3b89a1bd91752a4ede74bdfd.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Tokovi i kontejneri<\/h3>\n<p>\nPo\u010dev\u0161i od verzije 8u131, Java je postala prili\u010dno podr\u017eavati kontejnere zahvaljuju\u0107i pobolj\u0161anjima u funkcionalnosti ergonomije. Naime, sada JVM zna na koliko se procesorskih jezgri pokre\u0107e i mo\u017ee odgovaraju\u0107e prilagoditi bazene tokova \u2013 obi\u010dno fork\/join bazene. Naravno, to je odli\u010dno, ali recimo da imamo tradicionalnu web aplikaciju koja koristi HTTP servlete i pokre\u0107e se u Tomcat, Jetty i sli\u010dnim okru\u017eenjima. Kao rezultat toga, ova aplikacija \u0107e svakoj zahtjevini dodijeliti zasebni tok i omogu\u0107iti mu da blokira taj tok dok \u010deka ulazno-izlazne operacije, primjerice, prilikom pristupa bazi podataka, datotekama ili ostalim servisima. Drugim rije\u010dima, veli\u010dina takve aplikacije ne ovisi o broju dostupnih jezgri, ve\u0107 o broju istodobnih zahtjeva. Osim toga, to zna\u010di da kvote ili ograni\u010denja u Kubernetesu po broju jezgri ovdje nisu od velike pomo\u0107i, i na kraju \u0107e se sve svesti na throttling.<\/p>\n<h3>Iscrpljivanje memorije<\/h3>\n<p>\nTokovi su memorija. I unutarkontejnerska ograni\u010denja memorije nisu lijek za sve. Jednostavno po\u010dnite pove\u0107avati broj aplikacija i tokova, i prije ili kasnije suo\u010dit \u0107ete se s kriti\u010dnim rastom u\u010destalosti promjena i, kao posljedica, s degradacijom performansi. Nadalje, ako aplikacija koristi tradicionalne mikroservisne okvire ili se povezuje s bazom podataka, ili koristi ke\u0161iranje, ili na neki na\u010din dodatno tro\u0161i memoriju, o\u010dito vam je potreban alat koji omogu\u0107uje da zavirite unutar JVM-a i vidite kako upravlja memorijom, a da pritom ne ubijete samu JVM (npr. XX:+UseCGroupMemoryLimitForHeap). I \u010dak iako je, po\u010dev\u0161i s Javom 9, JVM nau\u010dila prepoznavati cgroups i odgovaraju\u0107e se prilago\u0111avati, rezervacija i upravljanje memorijom ostaje prili\u010dno slo\u017een zadatak.<\/p>\n<h3>Kvote i ograni\u010denja<\/h3>\n<p>\nU Javi 11 uvedena je podr\u0161ka za CPU kvote (poput PreferContainerQuotaForCPUCount). Kubernetes tako\u0111er nudi podr\u0161ku za ograni\u010denja i kvote. Da, sve to ima smisla, ali ako aplikacija opet prema\u0161i dodijeljenu kvotu, ponovno dolazimo do toga da veli\u010dinu \u2013 kao u slu\u010daju tradicionalnih Java aplikacija \u2013 odre\u0111uje broj jezgri uz dodjeljivanje zasebnog toka za svaki zahtjev, dakle, koristi od svega toga su ograni\u010dene.<br \/>\nOsim toga, kori\u0161tenje kvota i limita ili funkcija horizontalnog (scale-out) skaliranja platforme koja temelji Kubernetes ne rje\u0161ava problem samo od sebe. Tako samo tro\u0161imo vi\u0161e resursa na rje\u0161avanje osnovnog problema ili na kraju zavr\u0161avamo s prekomjernom potro\u0161njom resursa. A ako je to visoko optere\u0107en sustav u javnom oblaku, gotovo sigurno po\u010dinjemo tro\u0161iti vi\u0161e resursa nego \u0161to je stvarno potrebno.<\/p>\n<h3>\u0160to u\u010diniti sa svime tim?<\/h3>\n<p>\nAko ka\u017eemo jednostavno, treba koristiti asinkrone i neblokiraju\u0107e biblioteke ulaza\/izlaza i okvire poput Netyja, <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> ili Akka. Oni su mnogo bolje prilago\u0111eni radu u kontejnerima zbog svoje reaktivne prirode. Zahvaljuju\u0107i neblokiraju\u0107em ulazu\/izlazu, ista nit mo\u017ee obra\u0111ivati vi\u0161e istovremenih zahtjeva. Dok jedan zahtjev \u010deka rezultate ulaza\/izlaza, nit koja ga obra\u0111uje se osloba\u0111a i preuzima drugi zahtjev. A kada rezultati ulaza\/izlaza napokon stignu, obrada prvog zahtjeva se nastavlja. Naizmjeni\u010dnim obra\u0111ivanjem zahtjeva unutar iste niti, mogu\u0107e je smanjiti ukupni broj niti i smanjiti potro\u0161nju resursa na obradi zahtjeva.<\/p>\n<p>Kod neblokiraju\u0107eg ulaza\/izlaza, broj jezgra postaje klju\u010dni parametar, jer on odre\u0111uje broj niti ulaza\/izlaza koje mogu raditi paralelno. Ako se pravilno koriste, omogu\u0107ava u\u010dinkovito raspore\u0111ivanje optere\u0107enja izme\u0111u jezgri i upravljanje ve\u0107im optere\u0107enjima s manjim resursima.<\/p>\n<h3>Kako, i to je sve?<\/h3>\n<p>\nNe, ima jo\u0161 ne\u010dega. Reaktivno programiranje poma\u017ee bolje koristiti resurse, ali tako\u0111er ima svoju cijenu. Naime, kod \u0107e se morati prepisivati prema na\u010delima neblokiraju\u0107eg ulaza\/izlaza i izbjegavati blokiranje ulaznih\/izlaznih niti. A to je potpuno druga\u010diji model razvoja i izvr\u0161avanja. I iako postoji mno\u0161tvo korisnih biblioteka, to je i dalje radikalna promjena u uobi\u010dajenom na\u010dinu razmi\u0161ljanja.<\/p>\n<p>Prvo, trebate nau\u010diti pisati kod koji se izvr\u0161ava asinkrono. Kada po\u010dnete koristiti neblokiraju\u0107i ulaz-izlaz, morate izri\u010dito navesti \u0161to se treba dogoditi nakon \u0161to dobijete odgovor na zahtjev. Vi\u0161e ne mo\u017eete jednostavno blokirati i \u010dekati. Umjesto toga, mo\u017eete proslijediti povratne pozive, koristiti reaktivno programiranje ili nastavak. No, to nije sve: da biste koristili neblokiraju\u0107i ulaz-izlaz, trebate i neblokiraju\u0107e poslu\u017eitelje i klijente, i po\u017eeljno je da budu svugdje. U slu\u010daju HTTP-a sve je jednostavno, ali tu su i baze podataka, datote\u010dni sustavi i jo\u0161 mnogo toga.<\/p>\n<p>I iako potpuna proaktivna reaktivnost donosi maksimalnu efikasnost, takva promjena mo\u017ee biti te\u0161ka za probaviti u praksi. Stoga mogu\u0107nost kombiniranja reaktivnog i imperativnog koda postaje nu\u017ena za:<\/p>\n<ol>\n<li>Efikasno kori\u0161tenje resursa na najoptere\u0107enijim dijelovima softverskog sustava;<\/li>\n<li>Kori\u0161tenje jednostavnijeg koda u njegovim ostalim dijelovima.<\/li>\n<\/ol>\n<p><\/p>\n<h3>Predstavljamo Quarkus<\/h3>\n<p>\nU biti, o tome se radi kod Quarkusa \u2013 spojiti reaktivne i imperativne modele unutar jednog okru\u017eenja izvr\u0161avanja.<\/p>\n<p>Osnova Quarkusa su Vert.x i Netty, iznad kojih se koristi niz reaktivnih okvira i pro\u0161irenja koja poma\u017eu programerima. Quarkus je namijenjen izgradnji ne samo HTTP mikroservisa, ve\u0107 i arhitektura vo\u0111enih doga\u0111ajima. Zbog svoje reaktivne prirode, izuzetno je u\u010dinkovit u radu sa sustavima za razmjenu poruka (Apache Kafka, AMQP i sl.).<\/p>\n<p>Caka je u tome kako koristiti isti reaktivni motor i za imperativni i za reaktivni kod.<\/p>\n<p><img decoding=\"async\" alt=\"Kako Quarkus spaja imperativno i reaktivno programiranje\" src=\"\/wp-content\/uploads\/2020\/03\/f7269f4bb9d6767ab3bcc79d317861b0.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Quarkus to izvrsno rje\u0161ava. Odabir izme\u0111u imperativnog i reaktivnog programiranja je jasan \u2013 koristiti reaktivno jezgro za oboje. Ono \u0161to posebno poma\u017ee je brzi, neblokiraju\u0107i kod koji obra\u0111uje gotovo sve \u0161to prolazi kroz petlju doga\u0111aja (event-loop thread, tako\u0111er poznat kao IO thread). No, ako imate klasi\u010dne REST aplikacije ili klijentske aplikacije, Quarkus nudi imperativni model programiranja. Na primjer, podr\u0161ka za HTTP u Quarkusu temelji se na kori\u0161tenju neblokiraju\u0107eg i reaktivnog motora (Eclipse Vert.x i Netty). Svi HTTP zahtjevi koje va\u0161a aplikacija prima prvo prolaze kroz petlju doga\u0111aja (IO Thread), a zatim se proslje\u0111uju onom dijelu koda koji upravlja zahtjevima. Ovisno o odredi\u0161tu, kod za upravljanje zahtjevima mo\u017ee se pozivati u okviru zasebnog tijeka (tzv. worker thread, primjenjuje se u slu\u010daju servlet-a i Jax-RS) ili koristiti izvorni IO stream (reaktivna ruta).<\/p>\n<p><img decoding=\"async\" alt=\"Kako Quarkus spaja imperativno i reaktivno programiranje\" src=\"\/wp-content\/uploads\/2020\/03\/7338d6881fc9d7582f3fadf3e5f69618.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Za konektore sustava za prijenos poruka koriste se neblokiraju\u0107i klijenti koji rade na motoru Vert.x. Zato mo\u017eete u\u010dinkovito slati, primati i obra\u0111ivati poruke iz sustava klasifikacije messaging middleware.<\/p>\n<p>Na web stranici <noindex><a rel=\"nofollow\" href=\"http:\/\/www.quarkus.io\/\">Quarkus.io<\/a><\/noindex> pripremljeno je nekoliko dobrih vodi\u010da koji \u0107e vam pomo\u0107i da zapo\u010dnete rad s Quarkus-om:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/reactive-routes-guide\">Kori\u0161tenje reaktivnih ruta<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/reactive-sql-clients\">Reaktivni SQL klijenti<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/kafka-guide\">Kori\u0161tenje Apache Kafke s reaktivnim porukama<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/amqp-guide\">Kori\u0161tenje AMQP s reaktivnim porukama<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/using-vertx\">Kori\u0161tenje Vertx API<\/a><\/noindex><\/li>\n<\/ul>\n<p>\nOsim toga, pripremili smo online prakti\u010dne te\u010dajeve za upoznavanje s razli\u010ditim aspektima reaktivnog programiranja; za njihovo pra\u0107enje dovoljan je samo preglednik, nije potrebna nikakva IDE, niti je ra\u010dunar obavezan. Ove te\u010dajeve mo\u017eete prona\u0107i <noindex><a rel=\"nofollow\" href=\"https:\/\/learn.openshift.com\/middleware\/courses\/middleware-quarkus\/\">ovdje<\/a><\/noindex>.<\/p>\n<h3>Koristan resurs<\/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 razloga za isprobavanje Quarkus-a<\/a><\/noindex><\/li>\n<li>Web stranica projekta Quarkus \u2013 <noindex><a rel=\"nofollow\" href=\"http:\/\/quarkus.io\">quarkus.io<\/a><\/noindex><\/li>\n<li>Projekt Quarkus na GitHub-u \u2013 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/quarkusio\/quarkus\">github.com\/quarkusio\/quarkus<\/a><\/noindex><\/li>\n<li>Twitter projekt Quarkus \u2013 <noindex><a rel=\"nofollow\" href=\"https:\/\/twitter.com\/QuarkusIO\">twitter.com\/QuarkusIO<\/a><\/noindex><\/li>\n<li>Chat projekta Quarkus \u2013 <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkusio.zulipchat.com\/\">quarkusio.zulipchat.com<\/a><\/noindex><\/li>\n<li>Forumi projekta 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 video lekcija o Quarkus-u za po\u010detak<\/h3>\n<p>\nKako navode na web stranici <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> \u2013 to je <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/topics\/kubernetes\/\">Kubernetes<\/a><\/noindex>-orijentirani Java-tehnolo\u0161ki skup, prilago\u0111en GraalVM-u i OpenJDK HotSpot-u, sastavljen od najboljih Java biblioteka i standarda.<\/p>\n<p>Kako bismo vam pomogli da se bolje upoznate s temom, odabrali smo 10 video lekcija koje pokrivaju razli\u010dite aspekte Quarkus-a i primjere njegove upotrebe:<\/p>\n<h4>1. Predstavljamo Quarkus: Java okvir nove generacije za Kubernetes<\/h4>\n<p>\nAutori: Thomas Qvarnstrom i Jason Greene<br \/>\nCilj projekta Quarkus je izgraditi Java platformu za Kubernetes i serverless okru\u017eenja, a tako\u0111er kombinirati reaktivne i imperativne modele programiranja unutar jedne izvr\u0161ne sredine kako bi programeri mogli fleksibilno mijenjati pristup dok rade s \u0161irokim spektrom distribuiranih arhitektura aplikacija. Saznajte vi\u0161e iz uvodne lekcije u nastavku.<\/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=\"Pogledajte 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: superbrza subatomska Java<\/h4>\n<p>\nAutor: Burr Sutter<br \/>\nVideo lekcija iz internetskog lektora DevNation Live pokazuje kako koristiti Quarkus za optimizaciju poslovnih Java aplikacija, API-ja, mikrousluga i serverless funkcija u Kubernetes\/OpenShift okru\u017eenju, \u010dine\u0107i ih znatno manjima, br\u017eima i skalabilnijima.<\/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=\"Pogledajte 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 i GraalVM: ubrzavamo Hibernate do superbrzih brzina i smanjujemo ga do subatomskih dimenzija<\/h4>\n<p>\nAutor: Sanne Grinovero<br \/>\nIz prezentacije \u0107ete saznati kako je Quarkus nastao, kako funkcionira i kako omogu\u0107ava da slo\u017eene biblioteke, poput Hibernate ORM, budu kompatibilne s native slikama 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=\"Pogledajte 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. U\u010dimo razvijati serverless aplikacije<\/h4>\n<p>\nAutor: Marthen Luther<br \/>\nU videu ispod prikazano je kako stvoriti jednostavnu Java aplikaciju koriste\u0107i Quarkus i implementirati je kao serverless aplikaciju na 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=\"Pogledajte 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: kodirajte s u\u017eitkom<\/h4>\n<p>\nAutor: Edson Yanaga<br \/>\nVodi\u010d video o stvaranju va\u0161eg prvog Quarkus projekta, koji obja\u0161njava za\u0161to Quarkus osvaja srca programera.<\/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=\"Pogledajte 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 i kontejneri \u2013 kakva \u0107e biti njihova zajedni\u010dka budu\u0107nost<\/h4>\n<p>\nAutor: Mark Little<br \/>\nOva prezentacija upoznaje s povije\u0161\u0107u Jave i obja\u0161njava za\u0161to je Quarkus budu\u0107nost Jave.<\/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=\"Pogledajte 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: superbrza subatomska Java<\/h4>\n<p>\nAutor: Dimitris Andreadis<br \/>\nPregled prednosti Quarkusa, koje su programeri prepoznali: jednostavnost, ultra visoke brzine, najbolje biblioteke i standardi.<\/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=\"Pogledajte 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 i subatomski reaktivni sustavi<\/h4>\n<p>\nAutor: Clement Escoffier<br \/>\nZahvaljuju\u0107i integraciji s GraalVM, Quarkus osigurava superbrzu razvojnu iskustvo i subatomsku sredinu izvr\u0161avanja. Autor govori o reaktivnoj strani Quarkusa i o tome kako je koristiti pri stvaranju reaktivnih aplikacija i aplikacija s prijenosom podataka.<\/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=\"Pogledajte 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 i brza izrada aplikacija u Eclipse MicroProfile<\/h4>\n<p>\nAutor: John Clingan<br \/>\nKombinacijom Eclipse MicroProfile i Quarkusa, programeri mogu razvijati potpuno funkcionalne kontejnerske aplikacije MicroProfile koje se pokre\u0107u za samo nekoliko desetaka milisekundi. U videu se detaljno obja\u0161njava kako kodirati kontejnersku aplikaciju MicroProfile za implementaciju na Kubernetes platformi.<\/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=\"Pogledajte 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, verzija \u201eTurbo\u201c<\/h4>\n<p>\nAutor: Markus Biel<br \/>\nAutor pokazuje kako koristiti Quarkus za kreiranje super malih i super brzih Java kontejnera, omogu\u0107avaju\u0107i stvaranje pravih proboja, posebno u serverless okru\u017eenjima.<\/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=\"Pogledajte 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 \/>Izvor: <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.4 - 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\/hr\/blog\/administrirovanie\/kak-quarkus-obedinyaet-imperativnoe-i-reaktivnoe-programmirovanie\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"hr_HR\" \/>\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\/hr\/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\udd47Kako Quarkus spaja imperativno i reaktivno programiranje | ProHoster","description":"Ove godine planiramo ozbiljno razvijati teme kontejnera, Cloud-Native Java i","canonical_url":"https:\/\/prohoster.info\/hr\/blog\/administrirovanie\/kak-quarkus-obedinyaet-imperativnoe-i-reaktivnoe-programmirovanie","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"hr_HR","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\/hr\/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\/hr\/wp-json\/wp\/v2\/posts\/74795","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/comments?post=74795"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/posts\/74795\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/media\/74796"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/media?parent=74795"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/categories?post=74795"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/hr\/wp-json\/wp\/v2\/tags?post=74795"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}