{"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\/da\/blog\/administrirovanie\/kak-quarkus-obedinyaet-imperativnoe-i-reaktivnoe-programmirovanie","title":{"rendered":"Hvordan Quarkus kombinerer imperativ og reaktiv programmering","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>I \u00e5r planl\u00e6gger vi at fokusere p\u00e5 emner omkring containere, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.piter.com\/product_by_id\/112863337\">Cloud-Native Java<\/a><\/noindex> og <noindex><a rel=\"nofollow\" href=\"https:\/\/www.piter.com\/product_by_id\/125705747\">Kubernetes<\/a><\/noindex>. En logisk forts\u00e6ttelse af disse emner vil v\u00e6re en fort\u00e6lling om frameworket Quarkus, som allerede <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/haulmont\/blog\/443242\/\">er blevet diskuteret<\/a><\/noindex> p\u00e5 Habr. Dagens artikel handler ikke s\u00e5 meget om det, der kaldes \"subatomar superhurtig Java\", men om de muligheder, som Quarkus bringer til Enterprise.<\/p>\n<p><img decoding=\"async\" alt=\"Hvordan Quarkus kombinerer imperativ og reaktiv programmering\" src=\"\/wp-content\/uploads\/2020\/03\/6337d74cb66ee078c2b7c206be3d88fe.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nJava og JVM er fortsat ekstremt popul\u00e6re, men i arbejdet med serverless teknologier og cloud-orienterede mikrotjenester bliver Java og andre sprog til JVM anvendt mindre og mindre, da de optager for meget plads i hukommelsen og indl\u00e6ses for langsomt, hvilket g\u00f8r dem utilstr\u00e6kkelige til brug med kortvarige containere. Heldigvis begynder denne situation at \u00e6ndre sig takket v\u00e6re Quarkus.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>Superhurtig subatomar Java er n\u00e5et til et nyt niveau!<\/h3>\n<p>\n42 udgivelser, 8 m\u00e5neders samarbejde fra f\u00e6llesskabet og 177 fantastiske udviklere \u2013 resultatet af dette var udgivelsen i november 2019 <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/topics\/quarkus\/\">Quarkus 1.0<\/a><\/noindex>, en udgivelse, der markerer en vigtig milep\u00e6l i projektets udvikling og tilbyder en masse fantastiske funktioner og muligheder (l\u00e6s mere om dem i <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/blog\/announcing-quarkus-1-0\/\">annonceringen<\/a><\/noindex>).<\/p>\n<p>I dag vil vi fort\u00e6lle, hvordan Quarkus kombinerer modellerne for imperativ og reaktiv programmering baseret p\u00e5 et enkelt reaktivt kerne. Vi vil starte med et kort tilbageblik p\u00e5 historien og derefter grundigt analysere, hvad dualismen i Quarkus' reaktive kerne indeb\u00e6rer, og hvordan <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/topics\/enterprise-java\/\">Java<\/a><\/noindex>-udviklere kan drage fordel af disse fordele.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/topics\/microservices\/\">Mikrotjenester<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/topics\/event-driven\/\">begivenhedsdrevne arkitekturer<\/a><\/noindex> og <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/topics\/serverless-architecture\/\">serverless<\/a><\/noindex>-funktioner \u2013 alt dette er i \u00f8jeblikket, hvad man kalder en opadg\u00e5ende tendens. For nylig er det blevet meget lettere og mere tilg\u00e6ngeligt at skabe cloud-orienterede arkitekturer, men der er stadig problemer - is\u00e6r for Java-udviklere. For eksempel, i tilf\u00e6lde af serverless-funktioner og mikrotjenester er der et presserende behov for at reducere opstartstiden, mindske hukommelsesforbruget og g\u00f8re deres udvikling mere praktisk og behagelig. Java har i de senere \u00e5r indf\u00f8rt adskillige forbedringer, s\u00e5som ergonomisk st\u00f8tte til containere m.m. Men det er stadig en udfordring at f\u00e5 Java til at fungere ordentligt i en container. Derfor vil vi starte med at se p\u00e5 nogle af de indre kompleksiteter i Java, som viser sig s\u00e6rlig tydeligt i udviklingen af containerbaserede Java-applikationer.<\/p>\n<p>Lad os f\u00f8rst se p\u00e5 historien.<\/p>\n<p><img decoding=\"async\" alt=\"Hvordan Quarkus kombinerer imperativ og reaktiv programmering\" src=\"\/wp-content\/uploads\/2020\/03\/4478ef5c3b89a1bd91752a4ede74bdfd.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Tr\u00e5de og containere<\/h3>\n<p>\nFra version 8u131 begyndte Java mere eller mindre at underst\u00f8tte containere ved hj\u00e6lp af forbedringer inden for ergonomik. Is\u00e6r ved JVM i dag ved, hvor mange CPU-kerner den k\u00f8rer p\u00e5, og kan derfor tilpasse tr\u00e5dpoolerne \u2013 typisk fork\/join pooler. Uden tvivl er det fantastisk, men lad os antage, at vi har en traditionel webapplikation, der bruger HTTP-servlets og k\u00f8rer i Tomcat, Jetty osv. Som f\u00f8lge heraf vil denne applikation give hver anmodning en separat tr\u00e5d og tillade den at blokere denne tr\u00e5d, mens den venter p\u00e5 I\/O-operationer, for eksempel ved adgang til databaser, filer eller andre tjenester. Det betyder, at st\u00f8rrelsen p\u00e5 s\u00e5dan en applikation ikke afh\u00e6nger af antallet af tilg\u00e6ngelige kerner, men af antallet af samtidige anmodninger. Desuden betyder det, at kvoter eller gr\u00e6nser i Kubernetes for antallet af kerner ikke vil hj\u00e6lpe meget, og det hele ender med throttling.<\/p>\n<h3>Hukommelsesudt\u00f8mning<\/h3>\n<p>\nTr\u00e5de er hukommelse. Og begr\u00e6nsninger p\u00e5 hukommelse inde i containere er bestemt ikke en panacea. Bare begynd at \u00f8ge antallet af applikationer og tr\u00e5de, og f\u00f8r eller senere vil du st\u00f8de p\u00e5 en kritisk stigning i skiftfrekvenserne og som f\u00f8lge heraf en degradation af ydeevnen. Derudover, hvis applikationen bruger traditionelle mikrotjenestearkitekturer eller tilslutter sig en database, eller aktiverer caching, eller p\u00e5 anden m\u00e5de bruger mere hukommelse, s\u00e5 har du helt sikkert brug for et v\u00e6rkt\u00f8j, der lader dig kigge ind i JVM og se, hvordan den h\u00e5ndterer hukommelse, og samtidig ikke dr\u00e6ber selve JVM'en (for eksempel XX:+UseCGroupMemoryLimitForHeap). Og selvom JVM siden Java 9 har l\u00e6rt at opfatte cgroups og tilpasse sig derefter, er reservation og h\u00e5ndtering af hukommelse stadig en ret kompleks opgave.<\/p>\n<h3>Kvoter og gr\u00e6nser<\/h3>\n<p>\nJava 11 introducerede underst\u00f8ttelse af CPU-kvoter (som PreferContainerQuotaForCPUCount). Kubernetes tilbyder ogs\u00e5 st\u00f8tte for gr\u00e6nser og kvoter. Ja, alt dette giver mening, men hvis applikationen endnu en gang overskrider den tildelte kvote, kommer vi tilbage til, at st\u00f8rrelsen \u2013 som med traditionelle Java-applikationer \u2013 bestemmes af antallet af kerner og tildelingen af en separat tr\u00e5d til hver anmodning, hvilket betyder, at det hele kun har lidt v\u00e6rdi.<br \/>\nDesuden, hvis man bruger kvoter og gr\u00e6nser eller funktioner til horisontal (scale-out) skalering af platformen, der ligger til grund for Kubernetes, l\u00f8ser problemet sig ikke af sig selv. Vi bruger blot flere ressourcer p\u00e5 at l\u00f8se det oprindelige problem, eller vi ender med at overskride ressourcerne. Og hvis dette er et h\u00f8jt belastet system i et offentligt tilg\u00e6ngeligt cloud-milj\u00f8, begynder vi n\u00e6sten med sikkerhed at bruge flere ressourcer, end der faktisk er n\u00f8dvendigt.<\/p>\n<h3>Og hvad skal man g\u00f8re med alt dette?<\/h3>\n<p>\nHvis vi siger det enkelt, s\u00e5 brug asynkrone og ikke-blokerende input-output biblioteker og frameworks som 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> eller Akka. De er meget bedre egnet til at arbejde i containere p\u00e5 grund af deres reaktive natur. Takket v\u00e6re ikke-blokerende input-output kan den samme tr\u00e5d h\u00e5ndtere flere samtidige foresp\u00f8rgsler samtidigt. Mens \u00e9n foresp\u00f8rgsel venter p\u00e5 input-output-resultater, frig\u00f8res den tr\u00e5d, der behandler den, og g\u00e5r i gang med en anden foresp\u00f8rgsel. Og n\u00e5r input-output-resultaterne endelig kommer, forts\u00e6tter behandlingen af den f\u00f8rste foresp\u00f8rgsel. Ved at skifte mellem behandling af foresp\u00f8rgsler inden for den samme tr\u00e5d kan det samlede antal tr\u00e5de reduceres, og ressourceforbruget til behandling af foresp\u00f8rgslerne mindskes.<\/p>\n<p>Ved ikke-blokerende input-output bliver antallet af kerner en n\u00f8glev\u00e6rdi, da det bestemmer antallet af input-output tr\u00e5de, der kan udf\u00f8res parallelt. Ved korrekt brug g\u00f8r dette det muligt effektivt at fordele belastningen mellem kernerne og h\u00e5ndtere h\u00f8jere belastninger med f\u00e6rre ressourcer.<\/p>\n<h3>Hvordan, er det hele?<\/h3>\n<p>\nNej, der er mere. Reaktiv programmering hj\u00e6lper med at udnytte ressourcerne bedre, men det har ogs\u00e5 sin pris. Is\u00e6r skal koden skrives om i henhold til principperne for ikke-blokering og undg\u00e5 blokerende input-output tr\u00e5de. Og det er en helt anden model for udvikling og udf\u00f8relse. Selvom der er mange nyttige biblioteker her, er det stadig en radikal \u00e6ndring i den s\u00e6dvanlige tankegang.<\/p>\n<p>For det f\u00f8rste skal du l\u00e6re at skrive kode, der udf\u00f8res asynkront. N\u00e5r du begynder at bruge ikke-blokerende input-output, skal du eksplicit angive, hvad der skal ske, n\u00e5r et svar modtages. At blokere og vente fungerer ikke l\u00e6ngere. I stedet kan du sende tilbagekald, bruge reaktiv programmering eller forts\u00e6ttelse. Men det er ikke alt: For at bruge ikke-blokerende input-output har du brug for ikke-blokerende servere og klienter, gerne overalt. I tilf\u00e6lde af HTTP er det enkelt, men der er ogs\u00e5 databaser, filsystemer og meget mere.<\/p>\n<p>Og selvom total skalerbar reaktivitet giver maksimal effektivitet, kan det v\u00e6re sv\u00e6rt at ford\u00f8je denne \u00e6ndring i praksis. Derfor bliver muligheden for at kombinere reaktiv og imperativ kode en n\u00f8dvendighed for at:<\/p>\n<ol>\n<li>Effektivt udnytte ressourcerne i de mest belastede retninger i software-systemet;<\/li>\n<li>Brug en enklere stil i resten af koden.<\/li>\n<\/ol>\n<p><\/p>\n<h3>Pr\u00e6senterer Quarkus<\/h3>\n<p>\nOg det er essensen af Quarkus \u2013 at kombinere reaktive og imperative modeller inden for \u00e9n k\u00f8replatform.<\/p>\n<p>Quarkus er bygget p\u00e5 Vert.x og Netty, der oven p\u00e5 det underst\u00f8tter en r\u00e6kke reaktive rammer og udvidelser for at hj\u00e6lpe udvikleren. Quarkus er designet til at bygge ikke kun HTTP-mikrotjenester, men ogs\u00e5 event-drevne arkitekturer. Takket v\u00e6re sin reaktive natur fungerer det meget effektivt med beskedsystemer (Apache Kafka, AMQP osv.).<\/p>\n<p>Fintippet ligger i, hvordan man bruger den samme reaktive motor til b\u00e5de imperativ og reaktiv kode.<\/p>\n<p><img decoding=\"async\" alt=\"Hvordan Quarkus kombinerer imperativ og reaktiv programmering\" src=\"\/wp-content\/uploads\/2020\/03\/f7269f4bb9d6767ab3bcc79d317861b0.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Quarkus h\u00e5ndterer dette fremragende. Valget mellem imperativt og reaktivt er indlysende \u2013 at bruge reaktorkernen til begge dele. Det, det hj\u00e6lper meget med, er hurtig ikke-blokerende kode, der h\u00e5ndterer n\u00e6sten alt, hvad der passerer gennem event-loop-tr\u00e5den (event-loop thread, ogs\u00e5 kendt som IO-tr\u00e5den). Men hvis du har klassiske REST-applikationer eller klient-side applikationer, er der en imperativ programmeringsmodel klar til Quarkus. For eksempel er HTTP-underst\u00f8ttelse i Quarkus bygget p\u00e5 brugen af en ikke-blokerende og reaktiv motor (Eclipse Vert.x og Netty). Alle HTTP-anmodninger, der modtages af din applikation, sendes f\u00f8rst gennem event-loop (IO-tr\u00e5den), f\u00f8r de sendes til den del af koden, der h\u00e5ndterer anmodninger. Afh\u00e6ngigt af destinationen kan anmodningsstyringskoden kaldes inden for en separat tr\u00e5d (den s\u00e5kaldte worker thread, der bruges i tilf\u00e6lde af servlets og Jax-RS) eller bruge den oprindelige input-output-str\u00f8m (den reaktive rute).<\/p>\n<p><img decoding=\"async\" alt=\"Hvordan Quarkus kombinerer imperativ og reaktiv programmering\" src=\"\/wp-content\/uploads\/2020\/03\/7338d6881fc9d7582f3fadf3e5f69618.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>For connectorer til beskedoverf\u00f8rselsystemer anvendes ikke-blokerende klienter, der k\u00f8rer oven p\u00e5 Vert.x-motoren. Derfor kan du effektivt sende, modtage og behandle beskeder fra messaging middleware-systemer.<\/p>\n<p>P\u00e5 hjemmesiden <noindex><a rel=\"nofollow\" href=\"http:\/\/www.quarkus.io\/\">Quarkus.io<\/a><\/noindex> vi har samlet flere gode vejledninger, der kan hj\u00e6lpe dig med at komme i gang med Quarkus:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/reactive-routes-guide\">Brug af reaktive ruter<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/reactive-sql-clients\">Reaktive SQL-klienter<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/kafka-guide\">Brug af Apache Kafka med reaktiv beskedoverf\u00f8rsel<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/amqp-guide\">Brug af AMQP med reaktiv beskedoverf\u00f8rsel<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/using-vertx\">Brug af Vertx API<\/a><\/noindex><\/li>\n<\/ul>\n<p>\nDerudover har vi forberedt online praktiske lektioner for at g\u00f8re dig bekendt med forskellige aspekter af reaktiv programmering, og alt hvad du beh\u00f8ver for at deltage er en browser \u2013 ingen IDE er p\u00e5kr\u00e6vet, og en computer er heller ikke n\u00f8dvendig. Du kan finde disse lektioner <noindex><a rel=\"nofollow\" href=\"https:\/\/learn.openshift.com\/middleware\/courses\/middleware-quarkus\/\">her<\/a><\/noindex>.<\/p>\n<h3>Nyttige ressourcer<\/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 grunde til at pr\u00f8ve Quarkus<\/a><\/noindex><\/li>\n<li>Quarkus-projektets hjemmeside \u2013 <noindex><a rel=\"nofollow\" href=\"http:\/\/quarkus.io\">quarkus.io<\/a><\/noindex><\/li>\n<li>Quarkus-projektet p\u00e5 GitHub \u2013 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/quarkusio\/quarkus\">github.com\/quarkusio\/quarkus<\/a><\/noindex><\/li>\n<li>Quarkus-projektets Twitter \u2013 <noindex><a rel=\"nofollow\" href=\"https:\/\/twitter.com\/QuarkusIO\">twitter.com\/QuarkusIO<\/a><\/noindex><\/li>\n<li>Quarkus-projektets chat \u2013 <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkusio.zulipchat.com\/\">quarkusio.zulipchat.com<\/a><\/noindex><\/li>\n<li>Quarkus-projektets fora \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 videolektioner om Quarkus, for at f\u00e5 styr p\u00e5 emnet<\/h3>\n<p>\nSom det skrives p\u00e5 hjemmesiden <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 er <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/topics\/kubernetes\/\">Kubernetes<\/a><\/noindex>-orienteret Java-stak, designet til GraalVM og OpenJDK HotSpot og samlet fra de bedste Java-biblioteker og -standarder.<\/p>\n<p>For at hj\u00e6lpe dig med at forst\u00e5 emnet har vi udvalgt 10 videolektioner, der d\u00e6kker forskellige aspekter af Quarkus og eksempler p\u00e5 brug:<\/p>\n<h4>1. Pr\u00e6senterer Quarkus: En ny generation Java-ramme for Kubernetes<\/h4>\n<p>\nForfattere: Thomas Qvarnstrom og Jason Greene<br \/>\nM\u00e5let med Quarkus-projektet er at skabe en Java-platform til Kubernetes og serverless-milj\u00f8er samt at kombinere reaktive og imperativ programmeringsmodeller inden for et enkelt runtime-milj\u00f8, s\u00e5 udviklere kan variere deres tilgang fleksibelt, n\u00e5r de arbejder med en bred vifte af distribuerede applikationsarkitekturer. L\u00e6s mere i introduktionseforedraget nedenfor.<\/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=\"Afspil 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: ultr hurtig subatom\u00e6r Java<\/h4>\n<p>\nForfatter: Burr Sutter<br \/>\nVideokurset fra onlineforedraget DevNation Live viser, hvordan man bruger Quarkus til at optimere enterprise Java-applikationer, API'er, mikrotjenester og serverless-funktioner i Kubernetes\/OpenShift-milj\u00f8et, hvilket g\u00f8r dem meget mindre, hurtigere og mere skalerbare.<\/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=\"Afspil 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 og GraalVM: booster Hibernate til superhastigheder og komprimerer til subatom\u00e6re st\u00f8rrelser<\/h4>\n<p>\nForfatter: Sanne Grinovero<br \/>\nFra pr\u00e6sentationen vil du l\u00e6re, hvordan Quarkus opstod, hvordan det fungerer, og hvordan det g\u00f8r komplekse biblioteker som Hibernate ORM kompatible med native-billeder fra 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=\"Afspil 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. L\u00e6r at udvikle serverless-applikationer<\/h4>\n<p>\nForfatter: Marthen Luther<br \/>\nI videoen nedenfor vises, hvordan man opretter en simpel Java-applikation med Quarkus og implementerer den som en serverless-applikation p\u00e5 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=\"Afspil 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: kodning med gl\u00e6de<\/h4>\n<p>\nForfatter: Edson Yanaga<br \/>\nVideoguiden til at skabe dit f\u00f8rste Quarkus-projekt, der hj\u00e6lper dig med at forst\u00e5, hvorfor Quarkus vinder udvikleres hjerter.<\/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=\"Afspil 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 og containere \u2013 hvordan vil fremtiden se ud for dem sammen?<\/h4>\n<p>\nForfatter: Mark Little<br \/>\nDenne pr\u00e6sentation introducerer historien om Java og forklarer, hvorfor Quarkus er fremtiden for 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=\"Afspil 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: ultr hurtig subatom\u00e6r Java<\/h4>\n<p>\nForfatter: Dimitris Andreadis<br \/>\nOversigt over fordelene ved Quarkus, som udviklerne anerkender: enkelhed, super h\u00f8je hastigheder, bedre biblioteker og standarder.<\/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=\"Afspil 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 og subatom\u00e6re reaktive systemer<\/h4>\n<p>\nForfatter: Clement Escoffier<br \/>\nTakket v\u00e6re integrationen med GraalVM giver Quarkus en ultrahurtig udviklingsoplevelse og et subatom\u00e6rt runtime-milj\u00f8. Forfatteren taler om den reaktive side af Quarkus og hvordan man bruger det, n\u00e5r man skaber reaktive applikationer og applikationer med streaming data.<\/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=\"Afspil 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 og hurtig applikationsudvikling i Eclipse MicroProfile<\/h4>\n<p>\nForfatter: John Clingan<br \/>\nVed at kombinere Eclipse MicroProfile og Quarkus kan udviklere skabe fuldt funktionelle MicroProfile containerapplikationer, der starter p\u00e5 blot f\u00e5 millisekunder. Videoen gennemg\u00e5r i detaljer, hvordan man koder en MicroProfile containerapplikation til implementering p\u00e5 Kubernetes-platformen.<\/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=\"Afspil 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, version \"Turbo\"<\/h4>\n<p>\nForfatter: Markus Biel (Marcus Biel)<br \/>\nForfatteren viser, hvordan man bruger Quarkus til at skabe super sm\u00e5 og super hurtige Java-containere, hvilket muligg\u00f8r en reel breakthrough, is\u00e6r i serverless milj\u00f8er.<\/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=\"Afspil 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 \/>Kilde: <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.3 - 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\/da\/blog\/administrirovanie\/kak-quarkus-obedinyaet-imperativnoe-i-reaktivnoe-programmirovanie\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"da_DK\" \/>\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\/da\/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\udd47Hvordan Quarkus kombinerer imperativ og reaktiv programmering | ProHoster","description":"I \u00e5r planl\u00e6gger vi seri\u00f8st at udvikle emner om containere, Cloud-Native Java og","canonical_url":"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/kak-quarkus-obedinyaet-imperativnoe-i-reaktivnoe-programmirovanie","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"da_DK","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\/da\/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\/da\/wp-json\/wp\/v2\/posts\/74795","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/comments?post=74795"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts\/74795\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media\/74796"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media?parent=74795"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/categories?post=74795"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/tags?post=74795"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}