{"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\/pt\/blog\/administrirovanie\/kak-quarkus-obedinyaet-imperativnoe-i-reaktivnoe-programmirovanie","title":{"rendered":"Como o Quarkus une programa\u00e7\u00e3o imperativa e reativa","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Este ano, pretendemos desenvolver seriamente os temas de cont\u00eaineres, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.piter.com\/product_by_id\/112863337\">Java Nativa na Nuvem<\/a><\/noindex> e <noindex><a rel=\"nofollow\" href=\"https:\/\/www.piter.com\/product_by_id\/125705747\">Kubernetes<\/a><\/noindex>. A continua\u00e7\u00e3o l\u00f3gica desses t\u00f3picos ser\u00e1 uma discuss\u00e3o sobre o framework Quarkus, j\u00e1 <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/haulmont\/blog\/443242\/\">discutido<\/a><\/noindex> no Habr. O artigo de hoje n\u00e3o se concentra tanto na ess\u00eancia da \"Java subat\u00f4mica super-r\u00e1pida\", mas nas perspectivas que o Quarkus traz para o ambiente Enterprise.<\/p>\n<p><img decoding=\"async\" alt=\"Como o Quarkus une programa\u00e7\u00e3o imperativa e reativa\" src=\"\/wp-content\/uploads\/2020\/03\/6337d74cb66ee078c2b7c206be3d88fe.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nJava e JVM continuam extremamente populares, mas ao trabalhar com tecnologias sem servidor e microservi\u00e7os orientados para a nuvem, Java e outras linguagens para JVM est\u00e3o sendo usadas com menos frequ\u00eancia, pois ocupam muito espa\u00e7o na mem\u00f3ria e demoram para carregar, o que as torna pouco adequadas para uso com cont\u00eaineres de vida curta. Felizmente, essa situa\u00e7\u00e3o est\u00e1 come\u00e7ando a mudar gra\u00e7as ao Quarkus.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>A Java subat\u00f4mica super-r\u00e1pida alcan\u00e7ou um novo n\u00edvel!<\/h3>\n<p>\n42 lan\u00e7amentos, 8 meses de trabalho da comunidade e 177 desenvolvedores incr\u00edveis resultaram no lan\u00e7amento em novembro de 2019 <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/topics\/quarkus\/\">Quarkus 1.0<\/a><\/noindex>, uma vers\u00e3o que marca um marco importante no desenvolvimento do projeto e oferece uma s\u00e9rie de fun\u00e7\u00f5es e recursos incr\u00edveis (voc\u00ea pode ler mais sobre eles em <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/blog\/announcing-quarkus-1-0\/\">an\u00fancio<\/a><\/noindex>).<\/p>\n<p>Hoje, vamos mostrar como o Quarkus une os modelos de programa\u00e7\u00e3o imperativa e reativa com uma \u00fanica estrutura reativa. Come\u00e7aremos com uma breve excurs\u00e3o pela hist\u00f3ria e, em seguida, analisaremos detalhadamente o que constitui o dualismo do n\u00facleo reativo do Quarkus e como <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/topics\/enterprise-java\/\">Java<\/a><\/noindex>-desenvolvedores podem aproveitar essas vantagens.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/topics\/microservices\/\">Microservi\u00e7os<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/topics\/event-driven\/\">arquiteturas orientadas a eventos<\/a><\/noindex> e <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/topics\/serverless-architecture\/\">sem servidor<\/a><\/noindex>-fun\u00e7\u00f5es \u2013 tudo isso, hoje em dia, est\u00e1, por assim dizer, em alta. Recentemente, a cria\u00e7\u00e3o de arquiteturas orientadas para a nuvem tornou-se muito mais f\u00e1cil e acess\u00edvel, mas os problemas persistem \u2013 especialmente para os desenvolvedores Java. Por exemplo, no caso de fun\u00e7\u00f5es sem servidor e microservi\u00e7os, h\u00e1 uma necessidade urgente de reduzir o tempo de inicializa\u00e7\u00e3o, diminuir o consumo de mem\u00f3ria e tornar seu desenvolvimento mais conveniente e agrad\u00e1vel. Nos \u00faltimos anos, Java fez v\u00e1rias melhorias, como a funcionalidade ergonomics aprimorada para cont\u00eaineres, entre outras. No entanto, ainda assim, conseguir que o Java funcione corretamente em um cont\u00eainer continua sendo um desafio. Portanto, come\u00e7aremos examinando algumas das complexidades internas do Java, que se manifestam de forma particularmente aguda ao desenvolver aplica\u00e7\u00f5es Java orientadas a cont\u00eaineres.<\/p>\n<p>Primeiro, vamos olhar para a hist\u00f3ria.<\/p>\n<p><img decoding=\"async\" alt=\"Como o Quarkus une programa\u00e7\u00e3o imperativa e reativa\" src=\"\/wp-content\/uploads\/2020\/03\/4478ef5c3b89a1bd91752a4ede74bdfd.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Fluxos e cont\u00eaineres<\/h3>\n<p>\nA partir da vers\u00e3o 8u131, o Java come\u00e7ou a oferecer um suporte razo\u00e1vel para cont\u00eaineres, gra\u00e7as a melhorias na funcionalidade de ergonomia. Em particular, agora a JVM sabe em quantos n\u00facleos de processador est\u00e1 sendo executada e pode ajustar pools de threads de acordo \u2013 geralmente, pools fork\/join. Sem d\u00favida, isso \u00e9 \u00f3timo, mas, digamos, temos uma aplica\u00e7\u00e3o web tradicional que utiliza servlets HTTP e \u00e9 executada em Tomcat, Jetty, etc. Como resultado, essa aplica\u00e7\u00e3o criar\u00e1 um thread separado para cada solicita\u00e7\u00e3o e permitir\u00e1 que essa thread fique bloqueada enquanto aguarda opera\u00e7\u00f5es de entrada\/sa\u00edda, por exemplo, ao acessar bancos de dados, arquivos ou outros servi\u00e7os. Ou seja, o tamanho de tal aplicativo depende n\u00e3o da quantidade de n\u00facleos dispon\u00edveis, mas do n\u00famero de solicita\u00e7\u00f5es simult\u00e2neas. Al\u00e9m disso, isso significa que quotas ou limites em Kubernetes sobre a quantidade de n\u00facleos n\u00e3o ser\u00e3o muito \u00fateis, e acabaremos enfrentando throttling.<\/p>\n<h3>Exaust\u00e3o de mem\u00f3ria<\/h3>\n<p>\nAs threads s\u00e3o mem\u00f3ria. E as limita\u00e7\u00f5es de mem\u00f3ria dentro do cont\u00eainer n\u00e3o s\u00e3o uma panaceia. Comece a aumentar o n\u00famero de aplicativos e threads, e cedo ou tarde voc\u00ea enfrentar\u00e1 um crescimento cr\u00edtico na frequ\u00eancia de troca de contexto e, como resultado, uma degrada\u00e7\u00e3o no desempenho. Al\u00e9m disso, se o aplicativo utilizar frameworks de microservi\u00e7os tradicionais ou se conectar a bancos de dados, ou utilizar cache, ou de alguma outra forma gastar mem\u00f3ria, voc\u00ea definitivamente precisar\u00e1 de uma ferramenta que permita olhar dentro da JVM e ver como ela gerencia a mem\u00f3ria, sem que a pr\u00f3pria JVM seja prejudicada (por exemplo, XX:+UseCGroupMemoryLimitForHeap). E mesmo que, a partir do Java 9, a JVM tenha aprendido a entender cgroups e se adaptar adequadamente, a reserva e o gerenciamento de mem\u00f3ria continuam a ser quest\u00f5es bastante complicadas.<\/p>\n<h3>Quotas e limites<\/h3>\n<p>\nCom o Java 11, o suporte a quotas de CPU foi introduzido (como PreferContainerQuotaForCPUCount). O Kubernetes tamb\u00e9m oferece suporte a limites e quotas. Sim, tudo isso faz sentido, mas, se o aplicativo novamente ultrapassar a quota designada, voltamos \u00e0 situa\u00e7\u00e3o em que o tamanho \u2013 assim como no caso de aplicativos Java tradicionais \u2013 \u00e9 determinado pelo n\u00famero de n\u00facleos, com a aloca\u00e7\u00e3o de uma thread separada para cada solicita\u00e7\u00e3o, ou seja, o benef\u00edcio de tudo isso se torna limitado.<br \/>\nAl\u00e9m disso, se utilizarmos quotas e limites ou fun\u00e7\u00f5es de escalonamento horizontal (scale-out) da plataforma subjacente ao Kubernetes, o problema n\u00e3o se resolve por si s\u00f3. Estamos apenas gastando mais recursos para resolver o problema original ou, no final, acabamos com um desperd\u00edcio de recursos. E se isso for um sistema de alta carga em uma nuvem p\u00fablica acess\u00edvel, quase certamente come\u00e7amos a usar mais recursos do que realmente precisamos.<\/p>\n<h3>E o que fazer com tudo isso?<\/h3>\n<p>\nSe formos diretos, devemos usar bibliotecas e frameworks ass\u00edncronos e n\u00e3o bloqueantes de entrada e sa\u00edda, como o 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> ou Akka. Eles s\u00e3o muito mais adequados para trabalhar em cont\u00eaineres devido \u00e0 sua natureza reativa. Com a entrada e sa\u00edda n\u00e3o bloqueantes, o mesmo thread pode lidar com v\u00e1rias requisi\u00e7\u00f5es simultaneamente. Enquanto uma requisi\u00e7\u00e3o aguarda resultados de entrada e sa\u00edda, o thread que a processa se libera e assume outra requisi\u00e7\u00e3o. Quando os resultados de entrada e sa\u00edda finalmente chegam, o processamento da primeira requisi\u00e7\u00e3o continua. Alternando o processamento de requisi\u00e7\u00f5es dentro do mesmo thread, \u00e9 poss\u00edvel reduzir o n\u00famero total de threads e diminuir o consumo de recursos para o processamento das requisi\u00e7\u00f5es.<\/p>\n<p>Com a entrada e sa\u00edda n\u00e3o bloqueantes, o n\u00famero de n\u00facleos se torna um par\u00e2metro crucial, pois \u00e9 isso que determina o n\u00famero de threads de entrada e sa\u00edda que podem ser executadas em paralelo. Quando utilizado corretamente, isso permite distribuir a carga de forma eficiente entre os n\u00facleos e lidar com cargas mais altas com menos recursos.<\/p>\n<h3>Como, e \u00e9 tudo isso?<\/h3>\n<p>\nN\u00e3o, h\u00e1 mais. A programa\u00e7\u00e3o reativa ajuda a utilizar melhor os recursos, mas tamb\u00e9m tem seu custo. Em particular, o c\u00f3digo precisar\u00e1 ser reescrito de acordo com os princ\u00edpios de n\u00e3o bloqueio e evitar bloqueios de threads de entrada e sa\u00edda. E essa \u00e9 uma modelo de desenvolvimento e execu\u00e7\u00e3o completamente diferente. Embora existam muitas bibliotecas \u00fateis, isso ainda representa uma mudan\u00e7a radical na forma de pensar habitual.<\/p>\n<p>Primeiro, voc\u00ea precisa aprender a escrever c\u00f3digo que seja executado de forma ass\u00edncrona. Assim que voc\u00ea come\u00e7a a usar entrada e sa\u00edda n\u00e3o bloqueantes, \u00e9 necess\u00e1rio especificar claramente o que deve acontecer ao receber uma resposta para uma solicita\u00e7\u00e3o. Bloquear e esperar n\u00e3o \u00e9 mais uma op\u00e7\u00e3o. Em vez disso, voc\u00ea pode passar callbacks, usar programa\u00e7\u00e3o reativa ou continua\u00e7\u00e3o. Mas isso n\u00e3o \u00e9 tudo: para usar entrada e sa\u00edda n\u00e3o bloqueantes, voc\u00ea tamb\u00e9m precisa de servidores e clientes n\u00e3o bloqueantes, de prefer\u00eancia em todos os lugares. No caso do HTTP, \u00e9 simples, mas existem tamb\u00e9m bancos de dados, sistemas de arquivos e muito mais.<\/p>\n<p>E embora a reatividade total ofere\u00e7a m\u00e1xima efici\u00eancia, essa mudan\u00e7a pode ser dif\u00edcil de digerir na pr\u00e1tica. Portanto, a capacidade de combinar c\u00f3digo reativo e imperativo se torna uma condi\u00e7\u00e3o necess\u00e1ria para que:<\/p>\n<ol>\n<li>Utilize os recursos de forma eficaz nas \u00e1reas mais carregadas do sistema de software;<\/li>\n<li>Use um c\u00f3digo de estilo mais simples nas outras partes.<\/li>\n<\/ol>\n<p><\/p>\n<h3>Apresentamos o Quarkus<\/h3>\n<p>\nNa verdade, essa \u00e9 a ess\u00eancia do Quarkus \u2013 combinar modelos reativos e imperativos em um \u00fanico ambiente de execu\u00e7\u00e3o.<\/p>\n<p>A base do Quarkus \u00e9 formada pelo Vert.x e pelo Netty, sobre os quais \u00e9 utilizado uma gama de frameworks reativos e extens\u00f5es, projetados para ajudar o desenvolvedor. O Quarkus \u00e9 destinado \u00e0 constru\u00e7\u00e3o n\u00e3o apenas de microsservi\u00e7os HTTP, mas tamb\u00e9m de arquiteturas baseadas em eventos. Gra\u00e7as \u00e0 sua natureza reativa, ele funciona de maneira muito eficaz com sistemas de troca de mensagens (Apache Kafka, AMQP etc.).<\/p>\n<p>O truque est\u00e1 em como usar o mesmo motor reativo tanto para c\u00f3digo imperativo quanto para c\u00f3digo reativo.<\/p>\n<p><img decoding=\"async\" alt=\"Como o Quarkus une programa\u00e7\u00e3o imperativa e reativa\" src=\"\/wp-content\/uploads\/2020\/03\/f7269f4bb9d6767ab3bcc79d317861b0.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Quarkus se destaca nesse aspecto. A escolha entre o imperativo e o reativo \u00e9 clara \u2013 usar um n\u00facleo reativo para ambos. E onde ele realmente ajuda \u00e9 com c\u00f3digo n\u00e3o bloqueante r\u00e1pido que processa quase tudo o que passa pelo ciclo de eventos (event-loop thread, tamb\u00e9m conhecido como IO thread). Mas se voc\u00ea tem aplicativos REST cl\u00e1ssicos ou aplicativos do lado do cliente, Quarkus tem uma modelo de programa\u00e7\u00e3o imperativa pronta para uso. Por exemplo, o suporte a HTTP em Quarkus \u00e9 constru\u00eddo com base em um mecanismo n\u00e3o bloqueante e reativo (Eclipse Vert.x e Netty). Todas as solicita\u00e7\u00f5es HTTP recebidas pelo seu aplicativo passam primeiro pelo ciclo de eventos (IO Thread) e, em seguida, s\u00e3o enviadas para a parte do c\u00f3digo que gerencia as solicita\u00e7\u00f5es. Dependendo do destino, o c\u00f3digo de gerenciamento de solicita\u00e7\u00f5es pode ser chamado dentro de uma thread separada (o chamado worker thread, utilizado em servlets e Jax-RS) ou pode utilizar o pr\u00f3prio thread de entrada e sa\u00edda (o chamado reactive route).<\/p>\n<p><img decoding=\"async\" alt=\"Como o Quarkus une programa\u00e7\u00e3o imperativa e reativa\" src=\"\/wp-content\/uploads\/2020\/03\/7338d6881fc9d7582f3fadf3e5f69618.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Para conectores de sistemas de mensagem, s\u00e3o utilizados clientes n\u00e3o bloqueantes que operam sobre o motor Vert.x. Portanto, voc\u00ea pode enviar, receber e processar mensagens de forma eficaz a partir de sistemas de middleware de mensagens.<\/p>\n<p>est\u00e1 escrito: <noindex><a rel=\"nofollow\" href=\"http:\/\/www.quarkus.io\/\">Quarkus.io<\/a><\/noindex> um conjunto de bons tutoriais foi reunido para ajudar a come\u00e7ar a trabalhar com Quarkus:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/reactive-routes-guide\">Usando Rotas Reativas<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/reactive-sql-clients\">Clientes SQL Reativos<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/kafka-guide\">Usando Apache Kafka com Mensageria Reativa<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/amqp-guide\">Usando AMQP com Mensageria Reativa<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/guides\/using-vertx\">Usando a API Vertx<\/a><\/noindex><\/li>\n<\/ul>\n<p>\nAl\u00e9m disso, preparamos aulas pr\u00e1ticas online para familiariz\u00e1-lo com v\u00e1rios aspectos da programa\u00e7\u00e3o reativa, e para complet\u00e1-las, tudo o que voc\u00ea precisa \u00e9 de um navegador \u2014 n\u00e3o \u00e9 necess\u00e1rio IDE e nem mesmo um computador. Voc\u00ea pode encontrar essas aulas em <noindex><a rel=\"nofollow\" href=\"https:\/\/learn.openshift.com\/middleware\/courses\/middleware-quarkus\/\">aqui<\/a><\/noindex>.<\/p>\n<h3>Recursos \u00dateis<\/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 raz\u00f5es para experimentar Quarkus<\/a><\/noindex><\/li>\n<li>Site do projeto Quarkus \u2013 <noindex><a rel=\"nofollow\" href=\"http:\/\/quarkus.io\">quarkus.io<\/a><\/noindex><\/li>\n<li>Projeto Quarkus no GitHub \u2013 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/quarkusio\/quarkus\">github.com\/quarkusio\/quarkus<\/a><\/noindex><\/li>\n<li>Twitter do projeto Quarkus \u2013 <noindex><a rel=\"nofollow\" href=\"https:\/\/twitter.com\/QuarkusIO\">twitter.com\/QuarkusIO<\/a><\/noindex><\/li>\n<li>Chat do projeto Quarkus \u2013 <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkusio.zulipchat.com\/\">quarkusio.zulipchat.com<\/a><\/noindex><\/li>\n<li>F\u00f3runs do projeto 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 v\u00eddeos tutoriais sobre Quarkus para voc\u00ea se familiarizar com o assunto<\/h3>\n<p>\nComo est\u00e1 escrito no site <noindex><a rel=\"nofollow\" href=\"https:\/\/quarkus.io\/\">Quarkus.io<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/blog\/2019\/05\/09\/create-your-first-quarkus-project-with-eclipse-ide-red-hat-codeready-studio\/\">Quarkus<\/a><\/noindex> \u00e9 <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/topics\/kubernetes\/\">Kubernetes<\/a><\/noindex>- uma pilha Java orientada para GraalVM e OpenJDK HotSpot, constru\u00edda a partir das melhores bibliotecas e padr\u00f5es Java.<\/p>\n<p>Para ajud\u00e1-lo a entender o assunto, selecionamos 10 v\u00eddeos tutoriais que abordam diversos aspectos do Quarkus e exemplos de seu uso:<\/p>\n<h4>1. Apresentando Quarkus: um framework Java de nova gera\u00e7\u00e3o para Kubernetes<\/h4>\n<p>\nAutoras: Thomas Qvarnstrom e Jason Greene<br \/>\nO objetivo do projeto Quarkus \u00e9 criar uma plataforma Java para Kubernetes e ambientes serverless, al\u00e9m de unir modelos de programa\u00e7\u00e3o reativa e imperativa em um \u00fanico ambiente de execu\u00e7\u00e3o, permitindo que os desenvolvedores variem flexivelmente sua abordagem ao trabalhar com uma ampla gama de arquiteturas de aplicativos distribu\u00eddos. Saiba mais na palestra introdut\u00f3ria abaixo.<\/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=\"Por que no hosting comum a administra\u00e7\u00e3o do PrestaShop \u00e9 lenta, e no seu n\u00e3o \u00e9?\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><\/p>\n<h4>2. Quarkus: Java subat\u00f4mica super-r\u00e1pida<\/h4>\n<p>\nAutor: Burr Sutter<br \/>\nO tutorial em v\u00eddeo do DevNation Live demonstra como usar o Quarkus para otimizar aplicativos Java corporativos, APIs, microsservi\u00e7os e fun\u00e7\u00f5es serverless no ambiente Kubernetes\/OpenShift, tornando-os muito menores, mais r\u00e1pidos e escal\u00e1veis.<\/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=\"Por que no hosting comum a administra\u00e7\u00e3o do PrestaShop \u00e9 lenta, e no seu n\u00e3o \u00e9?\" 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 e GraalVM: acelerando Hibernate a velocidades super r\u00e1pidas e comprimindo a tamanhos subat\u00f4micos<\/h4>\n<p>\nAutor: Sanne Grinovero<br \/>\nNa apresenta\u00e7\u00e3o, voc\u00ea descobrir\u00e1 como o Quarkus surgiu, como funciona e como torna bibliotecas complexas, como o Hibernate ORM, compat\u00edveis com imagens nativas do 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=\"Por que no hosting comum a administra\u00e7\u00e3o do PrestaShop \u00e9 lenta, e no seu n\u00e3o \u00e9?\" 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. Aprendendo a desenvolver aplica\u00e7\u00f5es serverless<\/h4>\n<p>\nAutor: Marthen Luther<br \/>\nNo v\u00eddeo abaixo, \u00e9 mostrado como criar um simples aplicativo Java usando o Quarkus e implant\u00e1-lo como um aplicativo serverless no 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=\"Por que no hosting comum a administra\u00e7\u00e3o do PrestaShop \u00e9 lenta, e no seu n\u00e3o \u00e9?\" 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: codifique com prazer<\/h4>\n<p>\nAutor: Edson Yanaga<br \/>\nGuia em v\u00eddeo para criar seu primeiro projeto Quarkus, permitindo entender por que o Quarkus est\u00e1 conquistando os cora\u00e7\u00f5es dos desenvolvedores.<\/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=\"Por que no hosting comum a administra\u00e7\u00e3o do PrestaShop \u00e9 lenta, e no seu n\u00e3o \u00e9?\" 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 e containers \u2013 qual ser\u00e1 seu futuro em conjunto<\/h4>\n<p>\nAutor: Mark Little<br \/>\nEsta apresenta\u00e7\u00e3o apresenta a hist\u00f3ria do Java e explica por que o Quarkus \u00e9 o futuro do 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=\"Por que no hosting comum a administra\u00e7\u00e3o do PrestaShop \u00e9 lenta, e no seu n\u00e3o \u00e9?\" loading=\"lazy\" width=\"480\" height=\"360\" style=\"width:100%;height:auto;\">\r\n        <div class=\"play-button\"><\/div>\r\n    <\/div><\/center><\/p>\n<h4>7. Quarkus: Java subat\u00f4mica super-r\u00e1pida<\/h4>\n<p>\nAutor: Dimitris Andreadis<br \/>\nVis\u00e3o geral das vantagens do Quarkus, que foram reconhecidas pelos desenvolvedores: simplicidade, alt\u00edssimas velocidades, melhores bibliotecas e padr\u00f5es.<\/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=\"Por que no hosting comum a administra\u00e7\u00e3o do PrestaShop \u00e9 lenta, e no seu n\u00e3o \u00e9?\" 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 e sistemas reativos subat\u00f4micos<\/h4>\n<p>\nAutor: Clement Escoffier<br \/>\nGra\u00e7as \u00e0 integra\u00e7\u00e3o com o GraalVM, o Quarkus proporciona uma experi\u00eancia de desenvolvimento super-r\u00e1pida e um ambiente de execu\u00e7\u00e3o subat\u00f4mico. O autor fala sobre o lado reativo do Quarkus e como us\u00e1-lo ao criar aplicativos reativos e aplicativos com streaming de dados.<\/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=\"Por que no hosting comum a administra\u00e7\u00e3o do PrestaShop \u00e9 lenta, e no seu n\u00e3o \u00e9?\" 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 e desenvolvimento r\u00e1pido de aplicativos no Eclipse MicroProfile<\/h4>\n<p>\nAutor: John Clingan<br \/>\nCombinando Eclipse MicroProfile e Quarkus, os desenvolvedores podem criar aplicativos MicroProfile em cont\u00eaineres totalmente funcionais que s\u00e3o iniciados em apenas algumas dezenas de milissegundos. O v\u00eddeo detalha como codificar um aplicativo MicroProfile para ser implantado na plataforma 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=\"Por que no hosting comum a administra\u00e7\u00e3o do PrestaShop \u00e9 lenta, e no seu n\u00e3o \u00e9?\" 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, vers\u00e3o \"Turbo\"<\/h4>\n<p>\nAutor: Marcus Biel<br \/>\nO autor mostra como usar Quarkus para criar cont\u00eaineres Java super pequenos e super r\u00e1pidos, permitindo uma verdadeira revolu\u00e7\u00e3o, especialmente em ambientes 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=\"Por que no hosting comum a administra\u00e7\u00e3o do PrestaShop \u00e9 lenta, e no seu n\u00e3o \u00e9?\" 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 \/>Fonte: <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\/pt\/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=\"pt_PT\" \/>\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\/pt\/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\udd47Como o Quarkus combina programa\u00e7\u00e3o imperativa e reativa | ProHoster","description":"Este ano, planejamos desenvolver seriamente os temas de cont\u00eaineres, Java Cloud-Native e","canonical_url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/kak-quarkus-obedinyaet-imperativnoe-i-reaktivnoe-programmirovanie","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pt_PT","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\/pt\/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\/pt\/wp-json\/wp\/v2\/posts\/74795","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/comments?post=74795"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/74795\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media\/74796"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media?parent=74795"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/categories?post=74795"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/tags?post=74795"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}