{"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\/pl\/blog\/administrirovanie\/kak-quarkus-obedinyaet-imperativnoe-i-reaktivnoe-programmirovanie","title":{"rendered":"Jak Quarkus \u0142\u0105czy programowanie imperatywne i reaktywne","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>W tym roku planujemy powa\u017cnie rozwija\u0107 temat kontener\u00f3w, <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>. Logicznym rozwini\u0119ciem tych temat\u00f3w b\u0119dzie opowie\u015b\u0107 o frameworku Quarkus, kt\u00f3ry ju\u017c <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/haulmont\/blog\/443242\/\">zosta\u0142 om\u00f3wiony<\/a><\/noindex> na Habrze. Dzisiejszy artyku\u0142 po\u015bwi\u0119cony jest nie tyle zasadom dzia\u0142ania \"subatomowej super szybkie Java\", ile perspektywom, kt\u00f3re Quarkus wnosi do Enterprise.<\/p>\n<p><img decoding=\"async\" alt=\"Jak Quarkus \u0142\u0105czy programowanie imperatywne i reaktywne\" src=\"\/wp-content\/uploads\/2020\/03\/6337d74cb66ee078c2b7c206be3d88fe.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nJava i JVM wci\u0105\u017c ciesz\u0105 si\u0119 ogromn\u0105 popularno\u015bci\u0105, ale w pracy z technologiami serverless i mikroserwisami opartymi na chmurze Java i inne j\u0119zyki dla JVM s\u0105 coraz rzadziej stosowane, poniewa\u017c zajmuj\u0105 zbyt du\u017co miejsca w pami\u0119ci i zbyt wolno si\u0119 \u0142adowa\u0107, przez co nie nadaj\u0105 si\u0119 do u\u017cycia z kr\u00f3tko\u017cyj\u0105cymi kontenerami. Na szcz\u0119\u015bcie ta sytuacja zaczyna si\u0119 zmienia\u0107 dzi\u0119ki Quarkus.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>Super szybka subatomowa Java wesz\u0142a na nowy poziom!<\/h3>\n<p>\n42 wydania, 8 miesi\u0119cy pracy spo\u0142eczno\u015bci i 177 niesamowitych programist\u00f3w \u2013 efektem tego by\u0142a premiera w listopadzie 2019 roku <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/topics\/quarkus\/\">Quarkus 1.0<\/a><\/noindex>, wydania, kt\u00f3re oznacza wa\u017cny kamie\u0144 milowy w rozwoju projektu i oferuje mn\u00f3stwo \u015bwietnych funkcji i mo\u017cliwo\u015bci (wi\u0119cej informacji mo\u017cna znale\u017a\u0107 w <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/blog\/announcing-quarkus-1-0\/\">zapowiedzi<\/a><\/noindex>).<\/p>\n<p>Dzi\u015b opowiemy, jak Quarkus \u0142\u0105czy modele programowania imperatywnego i reaktywnego na bazie jednego reaktywnego rdzenia. Rozpoczniemy od kr\u00f3tkiego rysu historycznego, a nast\u0119pnie szczeg\u00f3\u0142owo om\u00f3wimy, na czym polega dualizm reaktywnego rdzenia Quarkus i jak <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/topics\/enterprise-java\/\">Java<\/a><\/noindex>-programi\u015bci mog\u0105 skorzysta\u0107 z tych korzy\u015bci.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/topics\/microservices\/\">Mikroserwisy<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/topics\/event-driven\/\">architektury z zarz\u0105dzanymi zdarzeniami<\/a><\/noindex> i <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/topics\/serverless-architecture\/\">serverless<\/a><\/noindex>-funkcje \u2013 wszystko to dzi\u015b, jak si\u0119 m\u00f3wi, jest na fali. Ostatnio tworzenie chmurowych architektur sta\u0142o si\u0119 znacznie prostsze i bardziej dost\u0119pne, jednak problemy pozosta\u0142y \u2013 szczeg\u00f3lnie w\u015br\u00f3d programist\u00f3w Java. Na przyk\u0142ad, w przypadku funkcji serverless i mikroserwis\u00f3w istnieje pilna potrzeba skr\u00f3cenia czasu uruchamiania, zmniejszenia zu\u017cycia pami\u0119ci i uczynienia ich tworzenia bardziej wygodnym i przyjemnym. Java w ostatnich latach wprowadzi\u0142a kilka udoskonale\u0144, takich jak funkcjonalno\u015b\u0107 ergonomii poprawiona dla kontener\u00f3w itd. Jednak osi\u0105gni\u0119cie prawid\u0142owej pracy Java w kontenerze wci\u0105\u017c jest trudne. Dlatego zaczniemy od om\u00f3wienia niekt\u00f3rych z wewn\u0119trznych trudno\u015bci Java, kt\u00f3re szczeg\u00f3lnie wyra\u017anie ujawniaj\u0105 si\u0119 w czasie tworzenia aplikacji Java opartych na kontenerach.<\/p>\n<p>Na pocz\u0105tek zwr\u00f3\u0107my uwag\u0119 na histori\u0119.<\/p>\n<p><img decoding=\"async\" alt=\"Jak Quarkus \u0142\u0105czy programowanie imperatywne i reaktywne\" src=\"\/wp-content\/uploads\/2020\/03\/4478ef5c3b89a1bd91752a4ede74bdfd.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>W\u0105tki i kontenery<\/h3>\n<p>\nZaczynaj\u0105c od wersji 8u131, Java zacz\u0119\u0142a w miar\u0119 dobrze wspiera\u0107 kontenery dzi\u0119ki ulepszeniom w funkcji ergonomii. W szczeg\u00f3lno\u015bci teraz JVM wie, na ilu rdzeniach procesora jest uruchamiana, i mo\u017ce odpowiednio dostosowa\u0107 pule w\u0105tk\u00f3w \u2014 zazwyczaj puli fork\/join. Oczywi\u015bcie, to \u015bwietnie, ale za\u0142\u00f3\u017cmy, \u017ce mamy tradycyjn\u0105 aplikacj\u0119 internetow\u0105, kt\u00f3ra korzysta z serwlet\u00f3w HTTP i jest uruchamiana w Tomcat, Jetty itd. W rezultacie ta aplikacja przydzieli oddzielny w\u0105tek dla ka\u017cdego \u017c\u0105dania i pozwoli mu zablokowa\u0107 ten w\u0105tek podczas oczekiwania na operacje I\/O, na przyk\u0142ad podczas dost\u0119pu do bazy danych, plik\u00f3w lub innych us\u0142ug. To oznacza, \u017ce rozmiar takiej aplikacji nie zale\u017cy od liczby dost\u0119pnych rdzeni, lecz od liczby r\u00f3wnoczesnych \u017c\u0105da\u0144. Ponadto oznacza to, \u017ce kwoty lub limity w Kubernetes dotycz\u0105ce liczby rdzeni nie pomog\u0105 w tym przypadku szczeg\u00f3lnie, a sprawa zako\u0144czy si\u0119 throttlingiem.<\/p>\n<h3>Wycieki pami\u0119ci<\/h3>\n<p>\nW\u0105tki to pami\u0119\u0107. A wewn\u0119trzne ograniczenia kontener\u00f3w dotycz\u0105ce pami\u0119ci wcale nie s\u0105 panaceum. Po prostu zacznij zwi\u0119ksza\u0107 liczb\u0119 aplikacji i w\u0105tk\u00f3w, a pr\u0119dzej czy p\u00f3\u017aniej napotkasz krytyczny wzrost cz\u0119stotliwo\u015bci prze\u0142\u0105cze\u0144 i, w konsekwencji, degradacj\u0119 wydajno\u015bci. Co wi\u0119cej, je\u015bli aplikacja korzysta z tradycyjnych framework\u00f3w mikroserwisowych lub \u0142\u0105czy si\u0119 z baz\u0105 danych, lub wykorzystuje cache, lub w jakikolwiek inny spos\u00f3b dodatkowo zu\u017cywa pami\u0119\u0107, zdecydowanie potrzebujesz narz\u0119dzia, kt\u00f3re pozwoli zajrze\u0107 do wn\u0119trza JVM i sprawdzi\u0107, jak zarz\u0105dza pami\u0119ci\u0105, przy tym nie zabijaj\u0105c samej JVM (na przyk\u0142ad XX:+UseCGroupMemoryLimitForHeap). I nawet mimo \u017ce, od Java 9, JVM nauczy\u0142a si\u0119 kompatybilno\u015bci z cgroups i odpowiedniego dostosowywania, rezerwacja i zarz\u0105dzanie pami\u0119ci\u0105 pozostaje do\u015b\u0107 skomplikowanym zadaniem.<\/p>\n<h3>Kwoty i limity<\/h3>\n<p>\nW Java 11 wprowadzono wsparcie dla kwot CPU (np. PreferContainerQuotaForCPUCount). Kubernetes r\u00f3wnie\u017c oferuje wsparcie dla limit\u00f3w i kwot. Tak, to wszystko ma sens, ale je\u015bli aplikacja zn\u00f3w wychodzi poza przydzielon\u0105 kwot\u0119, ponownie dochodzimy do sytuacji, \u017ce rozmiar, jak w przypadku tradycyjnych aplikacji Java, determinowany jest przez liczb\u0119 rdzeni i z przydzieleniem oddzielnego w\u0105tku dla ka\u017cdego \u017c\u0105dania, co oznacza, \u017ce niewiele z tego mo\u017cna skorzysta\u0107.<br \/>\nPonadto, korzystaj\u0105c z kwot i limit\u00f3w lub funkcji poziomego (scale-out) skalowania platformy opartej na Kubernetes, problem nie rozwi\u0105zuje si\u0119 sam. Po prostu wydajemy wi\u0119cej zasob\u00f3w na rozwi\u0105zanie pierwotnego problemu, co w ko\u0144cu prowadzi do nadmiernego zu\u017cycia zasob\u00f3w. A je\u015bli jest to system o du\u017cym obci\u0105\u017ceniu w publicznej chmurze, niemal na pewno zaczynamy zu\u017cywa\u0107 wi\u0119cej zasob\u00f3w, ni\u017c jest to rzeczywi\u015bcie potrzebne.<\/p>\n<h3>I co z tym wszystkim zrobi\u0107?<\/h3>\n<p>\nM\u00f3wi\u0105c prosto, nale\u017cy korzysta\u0107 z asynchronicznych i nieblokuj\u0105cych bibliotek wej\u015bcia\/wyj\u015bcia oraz framework\u00f3w takich jak 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> lub Akka. S\u0105 one znacznie lepiej dostosowane do pracy w kontenerach dzi\u0119ki swojej reaktywnej naturze. Dzi\u0119ki nieblokuj\u0105cemu wej\u015bciu\/wyj\u015bciu, ten sam w\u0105tek mo\u017ce obs\u0142ugiwa\u0107 jednocze\u015bnie wiele r\u00f3wnoleg\u0142ych zapyta\u0144. Podczas gdy jedno zapytanie czeka na wyniki wej\u015bcia\/wyj\u015bcia, w\u0105tek je obs\u0142uguj\u0105cy jest zwalniany i przechodzi do obs\u0142ugi innego zapytania. A kiedy wyniki wej\u015bcia\/wyj\u015bcia w ko\u0144cu przychodz\u0105, przetwarzanie pierwszego zapytania jest kontynuowane. Przeplataj\u0105c przetwarzanie zapyta\u0144 w ramach tego samego w\u0105tku, mo\u017cna zmniejszy\u0107 \u0142\u0105czn\u0105 liczb\u0119 w\u0105tk\u00f3w i zredukowa\u0107 zu\u017cycie zasob\u00f3w na przetwarzanie zapyta\u0144.<\/p>\n<p>W przypadku nieblokuj\u0105cego wej\u015bcia\/wyj\u015bcia liczba rdzeni staje si\u0119 kluczowym parametrem, poniewa\u017c to w\u0142a\u015bnie ona okre\u015bla liczb\u0119 w\u0105tk\u00f3w wej\u015bcia\/wyj\u015bcia, kt\u00f3re mog\u0105 by\u0107 wykonywane r\u00f3wnolegle. Przy odpowiednim wykorzystaniu pozwala to efektywnie rozk\u0142ada\u0107 obci\u0105\u017cenie w\u015br\u00f3d rdzeni i radzi\u0107 sobie z wi\u0119kszymi obci\u0105\u017ceniami przy mniejszych zasobach.<\/p>\n<h3>Jak, to wszystko?<\/h3>\n<p>\nNie, jest jeszcze co\u015b. Programowanie reaktywne pomaga lepiej wykorzysta\u0107 zasoby, ale te\u017c ma swoj\u0105 cen\u0119. W szczeg\u00f3lno\u015bci, kod b\u0119dzie musia\u0142 by\u0107 przepisany zgodnie z zasadami nieblokowania i unika\u0107 blokowania w\u0105tk\u00f3w wej\u015bcia\/wyj\u015bcia. A to zupe\u0142nie inny model rozwoju i wykonania. I chocia\u017c istnieje wiele u\u017cytecznych bibliotek, to wci\u0105\u017c jest to radykalna zmiana w sposobie my\u015blenia.<\/p>\n<p>Po pierwsze, musisz nauczy\u0107 si\u0119 pisa\u0107 kod, kt\u00f3ry dzia\u0142a asynchronicznie. Gdy zaczynasz korzysta\u0107 z nieblokuj\u0105cego wej\u015bcia-wyj\u015bcia, musisz wyra\u017anie okre\u015bli\u0107, co ma si\u0119 sta\u0107 po otrzymaniu odpowiedzi na zapytanie. Nie mo\u017cna ju\u017c po prostu blokowa\u0107 i czeka\u0107. Zamiast tego mo\u017cesz przekazywa\u0107 wywo\u0142ania zwrotne, korzysta\u0107 z programowania reaktywnego lub kontynuacji. Ale to nie wszystko: aby korzysta\u0107 z nieblokuj\u0105cego wej\u015bcia-wyj\u015bcia, potrzebujesz zar\u00f3wno nieblokuj\u0105cych serwer\u00f3w, jak i klient\u00f3w, i najlepiej w ka\u017cdej sytuacji. W przypadku HTTP wszystko jest proste, ale s\u0105 te\u017c bazy danych, systemy plik\u00f3w i wiele wi\u0119cej.<\/p>\n<p>I chocia\u017c ca\u0142kowita reakcja skrajna zapewnia maksymaln\u0105 efektywno\u015b\u0107, takie przesuni\u0119cie mo\u017ce by\u0107 trudne do prze\u0142kni\u0119cia w praktyce. Dlatego mo\u017cliwo\u015b\u0107 \u0142\u0105czenia kodu reaktywnego i imperatywnego staje si\u0119 warunkiem koniecznym, aby:<\/p>\n<ol>\n<li>Efektywnie wykorzystywa\u0107 zasoby w najbardziej obci\u0105\u017conych kierunkach systemu oprogramowania;<\/li>\n<li>U\u017cywa\u0107 prostszego stylowo kodu w pozosta\u0142ych cz\u0119\u015bciach.<\/li>\n<\/ol>\n<p><\/p>\n<h3>Przedstawiamy Quarkus<\/h3>\n<p>\nW\u0142a\u015bciwie to jest sedno Quarkus \u2013 po\u0142\u0105czenie modeli reaktywnych i imperatywnych w ramach jednego \u015brodowiska wykonawczego.<\/p>\n<p>Na bazie Quarkus le\u017c\u0105 Vert.x i Netty, na kt\u00f3rych zbudowano szereg reaktywnych framework\u00f3w i rozszerze\u0144 maj\u0105cych na celu pomoc deweloperowi. Quarkus jest przeznaczony do budowy nie tylko mikrous\u0142ug HTTP, ale tak\u017ce architektur opartych na zdarzeniach. Dzi\u0119ki swojej reaktywnej naturze, bardzo efektywnie wsp\u00f3\u0142pracuje z systemami wymiany wiadomo\u015bci (Apache Kafka, AMQP itd.).<\/p>\n<p>Ca\u0142a sztuczka polega na tym, jak u\u017cywa\u0107 tego samego reaktywnego silnika zar\u00f3wno dla kodu imperatywnego, jak i reaktywnego.<\/p>\n<p><img decoding=\"async\" alt=\"Jak Quarkus \u0142\u0105czy programowanie imperatywne i reaktywne\" src=\"\/wp-content\/uploads\/2020\/03\/f7269f4bb9d6767ab3bcc79d317861b0.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Quarkus radzi sobie z tym doskonale. Wyb\u00f3r mi\u0119dzy programowaniem imperatywnym a reaktywnym jest oczywisty \u2013 nale\u017cy u\u017cywa\u0107 reaktywnego rdzenia zar\u00f3wno do jednego, jak i drugiego. A w czym to naprawd\u0119 pomaga, to szybki kod nieblokuj\u0105cy, kt\u00f3ry przetwarza prawie wszystko, co przechodzi przez p\u0119tl\u0119 zdarze\u0144 (event-loop thread, znan\u0105 te\u017c jako IO thread). Ale je\u015bli masz klasyczne aplikacje REST lub aplikacje po stronie klienta, Quarkus ma dla ciebie gotowy imperatywny model programowania. Na przyk\u0142ad wsparcie dla HTTP w Quarkus opiera si\u0119 na u\u017cywaniu nieblokuj\u0105cego i reaktywnego silnika (Eclipse Vert.x i Netty). Wszystkie zapytania HTTP, kt\u00f3re otrzymuje twoja aplikacja, najpierw przechodz\u0105 przez p\u0119tl\u0119 zdarze\u0144 (IO Thread), a nast\u0119pnie s\u0105 przesy\u0142ane do tej cz\u0119\u015bci kodu, kt\u00f3ra zarz\u0105dza zapytaniami. W zale\u017cno\u015bci od miejsca docelowego kod zarz\u0105dzaj\u0105cy zapytaniami mo\u017ce by\u0107 wywo\u0142ywany w ramach osobnego w\u0105tku (tzw. worker thread, u\u017cywane w przypadku serwlet\u00f3w i Jax-RS) lub korzysta\u0107 z pierwotnego w\u0105tku wej\u015bcia-wyj\u015bcia (reaktywny szlak reactive route).<\/p>\n<p><img decoding=\"async\" alt=\"Jak Quarkus \u0142\u0105czy programowanie imperatywne i reaktywne\" src=\"\/wp-content\/uploads\/2020\/03\/7338d6881fc9d7582f3fadf3e5f69618.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Dla \u0142\u0105cznik\u00f3w system\u00f3w przesy\u0142ania wiadomo\u015bci u\u017cywane s\u0105 nieblokuj\u0105ce klienty, kt\u00f3re dzia\u0142aj\u0105 na silniku Vert.x. Dzi\u0119ki temu mo\u017cesz efektywnie wysy\u0142a\u0107, odbiera\u0107 i przetwarza\u0107 wiadomo\u015bci z system\u00f3w klasy messaging middleware.<\/p>\n<p>Na stronie <noindex><a rel=\"nofollow\" href=\"http:\/\/www.quarkus.io\/\">Quarkus.io<\/a><\/noindex> zebrano kilka dobrych przewodnik\u00f3w, kt\u00f3re pomog\u0105 rozpocz\u0105\u0107 prac\u0119 z Quarkus:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/reactive-routes-guide\">Using Reactive Routes<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/reactive-sql-clients\">Reactive SQL Clients<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/kafka-guide\">Using Apache Kafka with Reactive Messaging<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/amqp-guide\">Using AMQP with Reactive Messaging<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/using-vertx\">Using Vertx API<\/a><\/noindex><\/li>\n<\/ul>\n<p>\nPonadto przygotowali\u015bmy internetowe praktyczne lekcje, kt\u00f3re wprowadzaj\u0105 w r\u00f3\u017cne aspekty reaktywnego programowania; do ich odbywania wystarczy tylko przegl\u0105darka, nie jest wymagana \u017cadna IDE, a komputer nie jest konieczny. Te lekcje mo\u017cna znale\u017a\u0107 <noindex><a rel=\"nofollow\" href=\"https:\/\/learn.openshift.com\/middleware\/courses\/middleware-quarkus\/\">tutaj<\/a><\/noindex>.<\/p>\n<h3>Przydatne zasoby<\/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 powody, aby spr\u00f3bowa\u0107 Quarkus<\/a><\/noindex><\/li>\n<li>Strona projektu Quarkus \u2013 <noindex><a rel=\"nofollow\" href=\"http:\/\/quarkus.io\">quarkus.io<\/a><\/noindex><\/li>\n<li>Projekt Quarkus na GitHubie \u2013 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/quarkusio\/quarkus\">github.com\/quarkusio\/quarkus<\/a><\/noindex><\/li>\n<li>Twitter projektu Quarkus \u2013 <noindex><a rel=\"nofollow\" href=\"https:\/\/twitter.com\/QuarkusIO\">twitter.com\/QuarkusIO<\/a><\/noindex><\/li>\n<li>Czat projektu Quarkus \u2013 <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkusio.zulipchat.com\/\">quarkusio.zulipchat.com<\/a><\/noindex><\/li>\n<li>Fora projektu 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 samouczk\u00f3w wideo o Quarkus, aby zapozna\u0107 si\u0119 z tematem<\/h3>\n<p>\nJak pisz\u0105 na stronie <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 <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/topics\/kubernetes\/\">Kubernetes<\/a><\/noindex>-oryjentowany Java-Stack dostosowany do GraalVM oraz OpenJDK HotSpot, zbudowany z najlepszych bibliotek i standard\u00f3w Java.<\/p>\n<p>Aby pom\u00f3c ci zrozumie\u0107 temat, wybrali\u015bmy 10 samouczk\u00f3w wideo, kt\u00f3re omawiaj\u0105 r\u00f3\u017cne aspekty Quarkus i przyk\u0142ady jego zastosowania:<\/p>\n<h4>1. Przedstawiamy Quarkus: framework Java nowej generacji dla Kubernetes<\/h4>\n<p>\nAutorzy: Thomas Qvarnstrom i Jason Greene<br \/>\nCelem projektu Quarkus jest stworzenie platformy Java dla Kubernetes i \u015brodowisk serverless, a tak\u017ce po\u0142\u0105czenie modeli programowania reaktywnego i imperatywnego w ramach jednego \u015brodowiska wykonawczego, aby deweloperzy mogli elastycznie dobiera\u0107 podej\u015bcie do pracy z szerokim zakresem rozproszonych architektur aplikacji. Dowiedz si\u0119 wi\u0119cej z poni\u017cszego wyk\u0142adu wprowadzaj\u0105cego.<\/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=\"Odtwarzaj wideo\" 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: super szybka subatomowa Java<\/h4>\n<p>\nAutor: Burr Sutter<br \/>\nFilm instrukta\u017cowy z internetowego wyk\u0142adu DevNation Live pokazuje, jak wykorzysta\u0107 Quarkus do optymalizacji korporacyjnych aplikacji Java, API, mikroserwis\u00f3w oraz funkcji serverless w \u015brodowisku Kubernetes\/OpenShift, czyni\u0105c je znacznie mniejszymi, szybszymi i bardziej skalowalnymi.<\/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=\"Odtwarzaj wideo\" 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: przyspieszamy Hibernate do ekstremalnych pr\u0119dko\u015bci i \u015bciskamy do subatomowych rozmiar\u00f3w<\/h4>\n<p>\nAutor: Sanne Grinovero<br \/>\nZ prezentacji dowiesz si\u0119, jak powsta\u0142 Quarkus, jak dzia\u0142a i jak umo\u017cliwia tworzenie skomplikowanych bibliotek, takich jak Hibernate ORM, zgodnych z natywnymi obrazami 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=\"Odtwarzaj wideo\" 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. Uczymy si\u0119 rozwija\u0107 aplikacje serverless<\/h4>\n<p>\nAutor: Marthen Luther<br \/>\nW poni\u017cszym filmie pokazano, jak stworzy\u0107 prost\u0105 aplikacj\u0119 Java za pomoc\u0105 Quarkus i wdro\u017cy\u0107 j\u0105 jako aplikacj\u0119 serverless 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=\"Odtwarzaj wideo\" 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: programuj z przyjemno\u015bci\u0105<\/h4>\n<p>\nAutor: Edson Yanaga<br \/>\nFilmowy przewodnik po tworzeniu pierwszego projektu Quarkus, kt\u00f3ry pozwala zobaczy\u0107, dlaczego Quarkus zdobywa serca deweloper\u00f3w.<\/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=\"Odtwarzaj wideo\" 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 kontenery \u2013 jak b\u0119dzie wygl\u0105da\u0107 ich wsp\u00f3lna przysz\u0142o\u015b\u0107<\/h4>\n<p>\nAutor: Mark Little<br \/>\nTa prezentacja przedstawia histori\u0119 Javy i wyja\u015bnia, dlaczego Quarkus jest przysz\u0142o\u015bci\u0105 Javy.<\/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=\"Odtwarzaj wideo\" 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: super szybka subatomowa Java<\/h4>\n<p>\nAutor: Dimitris Andreadis<br \/>\nPrzegl\u0105d korzy\u015bci Quarkus, kt\u00f3re zdoby\u0142y uznanie deweloper\u00f3w: prostota, ekstremalne pr\u0119dko\u015bci, najlepsze biblioteki i standardy.<\/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=\"Odtwarzaj wideo\" 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 subatomowe systemy reaktywne<\/h4>\n<p>\nAutor: Clement Escoffier<br \/>\nDzi\u0119ki integracji z GraalVM Quarkus zapewnia superszybkie do\u015bwiadczenie w rozwijaniu oraz subatomowe \u015brodowisko wykonawcze. Autor m\u00f3wi o reaktywnej stronie Quarkusa i jak z niej korzysta\u0107 przy tworzeniu aplikacji reaktywnych i aplikacji z przesy\u0142aniem strumieniowym.<\/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=\"Odtwarzaj wideo\" 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 szybkie tworzenie aplikacji w Eclipse MicroProfile<\/h4>\n<p>\nAutor: John Clingan<br \/>\n\u0141\u0105cz\u0105c Eclipse MicroProfile z Quarkus, programi\u015bci mog\u0105 tworzy\u0107 w pe\u0142ni funkcjonalne aplikacje kontenerowe MicroProfile, kt\u00f3re uruchamiaj\u0105 si\u0119 w ci\u0105gu kilku milisekund. Film szczeg\u00f3\u0142owo omawia, jak kodowa\u0107 aplikacj\u0119 kontenerow\u0105 MicroProfile do wdro\u017cenia na platformie 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=\"Odtwarzaj wideo\" 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, wersja \u201eTurbo\u201d<\/h4>\n<p>\nAutor: Marcus Biel<br \/>\nAutor pokazuje, jak wykorzysta\u0107 Quarkus do tworzenia superma\u0142ych i superszybkich kontener\u00f3w Java, co pozwala na prawdziwy prze\u0142om, szczeg\u00f3lnie w \u015brodowiskach serverless.<\/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=\"Odtwarzaj wideo\" 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 \/>\u0179r\u00f3d\u0142o: <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.1.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\/pl\/blog\/administrirovanie\/kak-quarkus-obedinyaet-imperativnoe-i-reaktivnoe-programmirovanie\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"pl_PL\" \/>\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\/pl\/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\udd47Jak Quarkus \u0142\u0105czy programowanie imperatywne i reaktywne | ProHoster","description":"W tym roku planujemy powa\u017cnie rozwija\u0107 tematy kontener\u00f3w, Cloud-Native Java oraz","canonical_url":"https:\/\/prohoster.info\/pl\/blog\/administrirovanie\/kak-quarkus-obedinyaet-imperativnoe-i-reaktivnoe-programmirovanie","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pl_PL","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\/pl\/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\/pl\/wp-json\/wp\/v2\/posts\/74795","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/comments?post=74795"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/posts\/74795\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media\/74796"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/media?parent=74795"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/categories?post=74795"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pl\/wp-json\/wp\/v2\/tags?post=74795"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}