{"id":2643,"date":"2017-08-24T00:15:30","date_gmt":"2017-08-24T03:15:30","guid":{"rendered":"https:\/\/devkico.itexto.com.br\/?p=2643"},"modified":"2017-08-24T00:15:30","modified_gmt":"2017-08-24T03:15:30","slug":"groovygrails-spring-e-javascript-brasil-por-dentro-nossa-arquitetura-de-comunidades","status":"publish","type":"post","link":"https:\/\/devkico.itexto.com.br\/?p=2643","title":{"rendered":"Groovy\/Grails, Spring e JavaScript Brasil por dentro &#8211; nossa arquitetura de comunidades"},"content":{"rendered":"<p>Cinco anos atr\u00e1s escrevi <a href=\"https:\/\/devkico.itexto.com.br\/?p=1097\">este post<\/a> descrevendo como era a arquitetura do Grails Brasil (hoje Groovy e Grails Brasil). As coisas caminharam bastante desde ent\u00e3o: de um c\u00f3digo fonte que tinha como objetivo atender um \u00fanico site (Grails Brasil), pouco a pouco este evoluiu para que se tornasse uma solu\u00e7\u00e3o capaz de atender\u00a0<strong>qualquer<\/strong> comunidade.<\/p>\n<p>Ao lan\u00e7armos o <a href=\"https:\/\/devkico.itexto.com.br\/?p=2596\">Spring Brasil<\/a> demos o primeiro passo no que diz respeito a este objetivo: era essencialmente o c\u00f3digo fonte do Grails Brasil com uma s\u00e9rie de pequenas modifica\u00e7\u00f5es (essencialmente a remo\u00e7\u00e3o de tudo o que era espec\u00edfico apenas\u00a0<strong>daquele<\/strong> site). J\u00e1 no caso do JavaScript Brasil demos o passo quase derradeiro: \u00e9 o mesmo c\u00f3digo fonte do Spring Brasil:\u00a0<strong>todas as customiza\u00e7\u00f5es (especialmente visuais), entretanto, passaram a ser o resultado de mudan\u00e7as na configura\u00e7\u00e3o<\/strong>.<\/p>\n<p>Acho que \u00e9 interessante contar a hist\u00f3ria t\u00e9cnica por tr\u00e1s deste projeto (ela descrever\u00e1 sua arquitetura). Curiosamente, n\u00e3o temos um nome para este c\u00f3digo fonte: antes era &#8220;Grails Brasil&#8221;, hoje o chamamos de &#8220;<strong>K<\/strong>omunidade&#8221; ou o nome do site no qual estamos trabalhando.<\/p>\n<h2>A hist\u00f3ria<\/h2>\n<h3>O in\u00edcio em <strong>PHP<\/strong><\/h3>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2644\" src=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2017\/08\/phpbb_logo.jpg\" alt=\"\" width=\"206\" height=\"158\" \/><\/p>\n<p>A primeira vers\u00e3o do Grails Brasil veio em 2008 e era na realidade uma instala\u00e7\u00e3o do <a href=\"http:\/\/www.phpbb.com\">phpBB<\/a>. Sim, voc\u00ea leu certo: o <strong>Grails\u00a0<\/strong>Brasil era um site escrito em\u00a0<strong>PHP<\/strong>. O criei para aprender Grails e o phpBB era uma solu\u00e7\u00e3o muito interessante na \u00e9poca: f\u00e1cil de instalar (fiz isto usando um assistente da <a href=\"https:\/\/www.hostnet.com.br\/app\/como-criar-um-forum-phpbb\/\">Hostnet<\/a> na hora do almo\u00e7o) e manter. Al\u00e9m disto, era o que precis\u00e1vamos na \u00e9poca: um f\u00f3rum b\u00e1sico.<\/p>\n<p>Esta solu\u00e7\u00e3o nos atendeu bem por um ano ou dois. A hospedagem era relativamente barata, mas com o tempo foi ficando mais cara por dois motivos:<\/p>\n<ul>\n<li>A comunidade cresceu bastante e sempre est\u00e1vamos superando nosso limite de banda.<\/li>\n<li>SPAM quase nos destruindo: gastava uma boa parte do meu dia apagando SPAM do site.<\/li>\n<\/ul>\n<p>Em um primeiro momento fiz modifica\u00e7\u00f5es no c\u00f3digo do phpBB para reduzir estes problemas. N\u00e3o tive bons resultados e por um tempo pensei seriamente em matar o projeto.<\/p>\n<h3>Segunda fase: primeira vers\u00e3o em Grails<\/h3>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-337\" src=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2009\/03\/grails_grails_logo.jpg\" alt=\"\" width=\"280\" height=\"84\" \/><\/p>\n<p>L\u00e1 por 2008, 2009 tive meu primeiro contato com servidores cloud que passaram a se mostrar como uma alternativa bem mais vi\u00e1vel (plano free tier da AWS pra ser mais preciso). At\u00e9 ent\u00e3o hospedagem Java era ou muito cara (pra mim) ou muito limitada (precisava enviar um WAR para o servi\u00e7o que oferecia um Tomcat compartilhado, algo muito tosco).<\/p>\n<p>Foi a oportunidade para poder finalmente ter a primeira vers\u00e3o em Grails do site. Dois objetivos me guiaram para esta mudan\u00e7a:<\/p>\n<ul>\n<li>Meu custo com hospedagem deveria ser menor.<\/li>\n<li>O problema do SPAM deveria ser definitivamente resolvido.<\/li>\n<\/ul>\n<p>Foi escrita ent\u00e3o esta primeira vers\u00e3o do site em Grails (vers\u00e3o 1.3.7, que foi usada at\u00e9 ano passado ou retrasado se n\u00e3o me engano &#8211; hoje usamos a vers\u00e3o 3.2.8). Dado que servi\u00e7os como AWS costumam cobrar por processamento, foi o momento ideal para que eu pudesse otimizar ao m\u00e1ximo meu c\u00f3digo (o que me levou a um conhecimento bem mais profundo da linguagem Groovy e da pr\u00f3pria JVM).<\/p>\n<p>E nisto foram tomadas uma s\u00e9rie de decis\u00f5es que s\u00e3o refletidas no c\u00f3digo at\u00e9 hoje:<\/p>\n<ul>\n<li>Dado que j\u00e1 existia uma base de posts vinda do phpBB, e este usa uma sintaxe chamada <a href=\"https:\/\/pt.wikipedia.org\/wiki\/BBCode\">bbCode<\/a>\u00a0no armazenamento dos posts, a pr\u00f3xima vers\u00e3o do site deveria manter esta compatibilidade (at\u00e9 hoje usamos bbCode para escrever os posts).<\/li>\n<li>As buscas n\u00e3o deveriam tocar o banco de dados: sendo assim adotamos o <a href=\"http:\/\/lucene.apache.org\">Lucene<\/a> como nosso motor de indexa\u00e7\u00e3o usado em todas as nossas consultas (j\u00e1 notou como s\u00e3o r\u00e1pidas?).<\/li>\n<li>Dado que meu objetivo era reduzir custos, e minha inst\u00e2ncia no free tier da AWS tinha 612 Mb de RAM, neste mesmo servidor deveriam ser executados o MySQL e o Tomcat. Logo o sistema poderia consumir, no m\u00e1ximo, 300 Mb de RAM (consome isto at\u00e9 hoje).<\/li>\n<li>O site tinha de ser mais r\u00e1pido que o phpBB (consegui, \u00e9 ordens de magnitude mais r\u00e1pido). Logo o que pudesse ser feito assincronamente deveria ser feito desta maneira (por isto e-mails n\u00e3o s\u00e3o enviados na hora, mas sim esporadicamente, assim como atualiza\u00e7\u00e3o de acessos e pontua\u00e7\u00e3o dos membros).<\/li>\n<li>A esmagadora maioria dos acessos ao site s\u00e3o para simples consulta (10% se registram e menos ainda chegam a postar conte\u00fado), sendo assim SEO \u00e9 prioridade (idem a busca).<\/li>\n<\/ul>\n<p>E assim surgiu o Grails Brasil escrito em \u00a0Grails. Uma s\u00e9rie de medidas foram tomadas para atingir estes objetivos, todas elas descritas neste <a href=\"https:\/\/devkico.itexto.com.br\/?p=1097\">antigo post<\/a> (e as adotamos ainda hoje).<\/p>\n<h3>Terceira fase: Spring e JavaScript Brasil<\/h3>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2637\" src=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2017\/08\/logotipo.png\" alt=\"\" width=\"256\" height=\"256\" srcset=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2017\/08\/logotipo.png 256w, https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2017\/08\/logotipo-150x150.png 150w\" sizes=\"(max-width: 256px) 100vw, 256px\" \/><\/p>\n<p>At\u00e9 2015 o c\u00f3digo do Grails Brasil se manteve essencialmente o mesmo, apenas com pequenas corre\u00e7\u00f5es. A partir de 2016 come\u00e7aram mudan\u00e7as mais significativas.<\/p>\n<p>A primeira delas dizia respeito \u00e0 atualiza\u00e7\u00e3o do pr\u00f3prio Grails: passamos a usar a vers\u00e3o 3 e, pouco a pouco, fomos migrando at\u00e9 a vers\u00e3o 3.2.8, usada hoje. Por que levou tanto tempo para fazer este upgrade? A vers\u00e3o antiga me atendia muito bem. Uma boa decis\u00e3o tomada l\u00e1 atr\u00e1s? Ter usado pouqu\u00edssimos plug-ins, o que tornou o upgrade muito f\u00e1cil (em quest\u00e3o de horas est\u00e1vamos na vers\u00e3o 3.0 do Grails). Al\u00e9m disto estava claro que precis\u00e1vamos atualizar o c\u00f3digo fonte para termos algo <b>dur\u00e1vel<\/b> (Java 6??? Bora pro 8!).<\/p>\n<p>J\u00e1 fazia um tempo que quer\u00edamos criar novas comunidades, ent\u00e3o era tamb\u00e9m a hora de podar o c\u00f3digo fonte, removendo tudo aquilo que s\u00f3 fazia sentido\u00a0<strong>no Grails Brasil<\/strong>\u00a0do novo c\u00f3digo. Foi \u00f3timo por que conseguimos <strong>otimizar<\/strong>\u00a0<strong>ainda mais<\/strong> o que j\u00e1 t\u00ednhamos.<\/p>\n<p>(hoje como consequ\u00eancia temos duas bases de c\u00f3digo: uma para o Grails Brasil, outra que atende as outras comunidades para que pud\u00e9ssemos manter as funcionalidades para os membros atuais do site)<\/p>\n<h4>Novos objetivos arquiteturais<\/h4>\n<h5>Modifica\u00e7\u00f5es do site em tempo de execu\u00e7\u00e3o<\/h5>\n<p>Ao lan\u00e7ar novas vers\u00f5es do site sempre havia momentos nos quais me deparava com pequenos problemas de layout, conte\u00fado textual ou JavaScript nos quais detectava problemas logo ap\u00f3s ter implantado a solu\u00e7\u00e3o. A\u00ed era necess\u00e1rio gerar um novo WAR e realizar todo o processo de deploy.<\/p>\n<p>Isto ocorria por que sempre havia um ou outro ponto de configura\u00e7\u00e3o que ficava no pr\u00f3prio c\u00f3digo fonte (o pr\u00f3prio HTML gerado pelo site, por exemplo, pode ser visto desta forma). Hoje todas as configura\u00e7\u00f5es encontram-se externalizadas no banco de dados. Com isto, se queremos modificar, por exemplo, o rodap\u00e9 do site ap\u00f3s a vers\u00e3o ter ido pro ar, hoje \u00e9 poss\u00edvel.<\/p>\n<p>Erros de layout devido a problemas no CSS? Ok, podemos mudar tamb\u00e9m. Apenas a t\u00edtulo de curiosidade, o JavaScript Brasil passou por umas 20 corre\u00e7\u00f5es de layout de ontem at\u00e9 hoje (23\/8\/2017). Sabe quantos deploys foram feitos? 1.<\/p>\n<p>Al\u00e9m disto o conte\u00fado que aparece nas laterais do site, rodap\u00e9 e cabe\u00e7alho tamb\u00e9m podem ser modificados hoje com o site em execu\u00e7\u00e3o, o que nos permite trocar an\u00fancios de uma forma muito mais \u00e1gil.<\/p>\n<p>N\u00e3o s\u00f3 isto: configura\u00e7\u00f5es de tarefas agendadas, acesso \u00e0s integra\u00e7\u00f5es essenciais (e-mail, redes sociais e no futuro at\u00e9 mesmo a conex\u00e3o com o SGBD) s\u00e3o hoje trocadas a quente.<\/p>\n<h5>Cria\u00e7\u00e3o r\u00e1pida de novas comunidades com o mesmo c\u00f3digo fonte<\/h5>\n<p>O objetivo \u00e9 que o &#8220;Komunidade&#8221; seja como o WordPress. Voc\u00ea baixa a distribui\u00e7\u00e3o, configura o acesso ao banco de dados, escolhe um tema e voil\u00e1, t\u00e1 criado um novo blog ou, em nosso caso, uma nova comunidade.<\/p>\n<p>A vers\u00e3o atual \u00e9 exatamente assim. Pegamos o c\u00f3digo fonte, definimos a configura\u00e7\u00e3o de acesso ao banco de dados, geramos o WAR, criamos um tema, configuramos no banco de dados do projeto os detalhes da comunidade (seu nome, regras de conduta, quais links s\u00e3o expostos, aonde ficam nossos arquivos de template de e-mail e temas visuais e mais uma s\u00e9rie de outros detalhes), instalamos no Tomcat e pronto: uma nova comunidade surge.<\/p>\n<p>Levou algo em torno de umas 4 horas para termos uma primeira vers\u00e3o aceit\u00e1vel do JavaScript Brasil (e n\u00f3s nem sequer tocamos no c\u00f3digo fonte do projeto).<\/p>\n<h5>Tornar a abertura do c\u00f3digo fonte algo vi\u00e1vel<\/h5>\n<p>Este tem sido o objetivo j\u00e1 faz algum tempo. Infelizmente ainda h\u00e1 informa\u00e7\u00f5es no c\u00f3digo fonte atual que n\u00e3o devem ser publicadas. Este \u00e9 o principal motivo por que ainda n\u00e3o existe um reposit\u00f3rio no GitHub com o c\u00f3digo do Komunidade.<\/p>\n<p>Mas posso dizer que o \u00faltimo release n\u00e3o deu mais um passo nesta dire\u00e7\u00e3o, mas sim um salto qu\u00e2ntico. A esmagadora maioria das informa\u00e7\u00f5es que mencionei acima n\u00e3o existe mais. O objetivo agora \u00e9 tornar este c\u00f3digo fonte o mais f\u00e1cil poss\u00edvel de ser mantido E entendido por novos colaboradores.<\/p>\n<p>Mais do que tornar o c\u00f3digo fonte mais leg\u00edvel, temos de ter uma distribui\u00e7\u00e3o do &#8220;Komiunidade&#8221; que possa ser usada tamb\u00e9m por n\u00e3o programadores. Algo como o WordPress.<\/p>\n<p>(diga-se de passagem, uma pessoa que n\u00e3o sabe programar \u00e9 que fez o tema do JavaScript Brasil, absolutamente sozinha)<\/p>\n<p>Tamb\u00e9m falta melhorar a documenta\u00e7\u00e3o do projeto: c\u00f3digo Grails \u00e9 muito f\u00e1cil de ser entendido, mas n\u00e3o \u00e9 o suficiente (nunca acreditei naquele papo de &#8220;meu c\u00f3digo \u00e9 minha documenta\u00e7\u00e3o&#8221;).<\/p>\n<p>Ent\u00e3o, aos que sempre me pedem acesso ao c\u00f3digo fonte o que posso dizer neste momento \u00e9 isto: ser\u00e1 eventualmente aberto, mas de uma forma correta e em grande estilo, n\u00e3o por press\u00e3o.<\/p>\n<h2>O futuro<\/h2>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-2645\" src=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2017\/08\/1900-postcards-personal-flying-machines.jpg\" alt=\"\" width=\"605\" height=\"389\" srcset=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2017\/08\/1900-postcards-personal-flying-machines.jpg 605w, https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2017\/08\/1900-postcards-personal-flying-machines-300x193.jpg 300w\" sizes=\"(max-width: 605px) 100vw, 605px\" \/><\/p>\n<p>L\u00e1 em cima mencionei que hoje temos duas bases de c\u00f3digo: &#8220;Grails Brasil&#8221; e &#8220;Komunidade&#8221;, certo? Isto \u00e9 tempor\u00e1rio pois o objetivo \u00e9 ter apenas uma. Mas como fazer isto se no c\u00f3digo do Grails Basil h\u00e1 tanta coisa que s\u00f3 faz sentido nele?<\/p>\n<p>J\u00e1 estou trabalhando em uma arquitetura de plug-ins para este projeto (WordPress sempre \u00e9 <strong>\u00a0inspira\u00e7\u00e3o<\/strong>). Sendo assim, tudo aquilo que era espec\u00edfico do Grails Brasil ser\u00e1 transformado em um pequeno m\u00f3dulo, que possa ser instalado em uma inst\u00e2ncia do &#8220;Komunidade&#8221;.<\/p>\n<p>Com isto \u00e9 poss\u00edvel ter se\u00e7\u00f5es distintas em instala\u00e7\u00f5es separadas do Komunidade. \u00c9 poss\u00edvel, por exemplo, termos uma se\u00e7\u00e3o em uma instala\u00e7\u00e3o do site que seja na realidade um plug-in. O core ser\u00e1 bastante diminuto, e a seu redor os plug-ins orbitar\u00e3o: tal como ocorre no Eclipse, Netbeans e, claro, no WordPress tamb\u00e9m.<\/p>\n<p>No que diz respeito ao frontend, ainda temos receio a respeito de uma grande mudan\u00e7a, tal como a ado\u00e7\u00e3o de um framework JavaScript ainda tenho algum receio pois um dos nossos objetivos \u00e9 ter c\u00f3digo duradouro e, sinceramente, ainda hoje n\u00e3o vi solu\u00e7\u00f5es que tenham passado no teste do tempo (com exce\u00e7\u00e3o do jQuery talvez).<\/p>\n<p>E enquanto isto vamos evoluindo pouco a pouco o c\u00f3digo que temos. Esta \u00e9 a hist\u00f3ria do projeto at\u00e9 agora, grandes novidades vir\u00e3o em breve como sempre. Espero que tenham gostado.<\/p>\n<p>E se inscrevam no<a href=\"http:\/\/www.springbrasil.com.br\"> Spring Brasil<\/a> e <a href=\"http:\/\/www.javascriptbrasil.com.br\">JavaScript Brasil<\/a>, pois o principal objetivo por tr\u00e1s dos dois projetos \u00e9 criar discuss\u00f5es bem acaloradas sobre estes temas!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Como \u00e9 a arquitetura do sistema que mant\u00e9m as comunidades Groovy\/Grails, Spring e JavaScript Brasil e como foi evolu\u00edda no decorrer destes 7 anos.<\/p>\n","protected":false},"author":1,"featured_media":2647,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-gradient":""}},"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[36,26,67],"tags":[],"class_list":["post-2643","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-desenvolvimento-de-software","category-grails-brasil","category-itexto"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v22.8 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Groovy\/Grails, Spring e JavaScript Brasil por dentro - nossa arquitetura de comunidades - \/dev\/Kico<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/devkico.itexto.com.br\/?p=2643\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Groovy\/Grails, Spring e JavaScript Brasil por dentro - nossa arquitetura de comunidades - \/dev\/Kico\" \/>\n<meta property=\"og:description\" content=\"Como \u00e9 a arquitetura do sistema que mant\u00e9m as comunidades Groovy\/Grails, Spring e JavaScript Brasil e como foi evolu\u00edda no decorrer destes 7 anos.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/devkico.itexto.com.br\/?p=2643\" \/>\n<meta property=\"og:site_name\" content=\"\/dev\/Kico\" \/>\n<meta property=\"article:published_time\" content=\"2017-08-24T03:15:30+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2017\/08\/1900-postcards-a-quick-stroll-on-the-water.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"605\" \/>\n\t<meta property=\"og:image:height\" content=\"392\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Kico (Henrique Lobo Weissmann)\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@loboweissmann\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Kico (Henrique Lobo Weissmann)\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. tempo de leitura\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=2643\",\"url\":\"https:\/\/devkico.itexto.com.br\/?p=2643\",\"name\":\"Groovy\/Grails, Spring e JavaScript Brasil por dentro - nossa arquitetura de comunidades - \/dev\/Kico\",\"isPartOf\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=2643#primaryimage\"},\"image\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=2643#primaryimage\"},\"thumbnailUrl\":\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2017\/08\/1900-postcards-a-quick-stroll-on-the-water.jpg\",\"datePublished\":\"2017-08-24T03:15:30+00:00\",\"dateModified\":\"2017-08-24T03:15:30+00:00\",\"author\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7\"},\"breadcrumb\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=2643#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/devkico.itexto.com.br\/?p=2643\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=2643#primaryimage\",\"url\":\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2017\/08\/1900-postcards-a-quick-stroll-on-the-water.jpg\",\"contentUrl\":\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2017\/08\/1900-postcards-a-quick-stroll-on-the-water.jpg\",\"width\":605,\"height\":392},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=2643#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/devkico.itexto.com.br\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Groovy\/Grails, Spring e JavaScript Brasil por dentro &#8211; nossa arquitetura de comunidades\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/devkico.itexto.com.br\/#website\",\"url\":\"https:\/\/devkico.itexto.com.br\/\",\"name\":\"\/dev\/Kico\",\"description\":\"Desenvolvendo software\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/devkico.itexto.com.br\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7\",\"name\":\"Kico (Henrique Lobo Weissmann)\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/dd6973d86a689bc63122b2e603f25be3?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/dd6973d86a689bc63122b2e603f25be3?s=96&d=mm&r=g\",\"caption\":\"Kico (Henrique Lobo Weissmann)\"},\"sameAs\":[\"https:\/\/x.com\/loboweissmann\"],\"url\":\"https:\/\/devkico.itexto.com.br\/?author=1\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Groovy\/Grails, Spring e JavaScript Brasil por dentro - nossa arquitetura de comunidades - \/dev\/Kico","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/devkico.itexto.com.br\/?p=2643","og_locale":"pt_BR","og_type":"article","og_title":"Groovy\/Grails, Spring e JavaScript Brasil por dentro - nossa arquitetura de comunidades - \/dev\/Kico","og_description":"Como \u00e9 a arquitetura do sistema que mant\u00e9m as comunidades Groovy\/Grails, Spring e JavaScript Brasil e como foi evolu\u00edda no decorrer destes 7 anos.","og_url":"https:\/\/devkico.itexto.com.br\/?p=2643","og_site_name":"\/dev\/Kico","article_published_time":"2017-08-24T03:15:30+00:00","og_image":[{"width":605,"height":392,"url":"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2017\/08\/1900-postcards-a-quick-stroll-on-the-water.jpg","type":"image\/jpeg"}],"author":"Kico (Henrique Lobo Weissmann)","twitter_card":"summary_large_image","twitter_creator":"@loboweissmann","twitter_misc":{"Escrito por":"Kico (Henrique Lobo Weissmann)","Est. tempo de leitura":"10 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/devkico.itexto.com.br\/?p=2643","url":"https:\/\/devkico.itexto.com.br\/?p=2643","name":"Groovy\/Grails, Spring e JavaScript Brasil por dentro - nossa arquitetura de comunidades - \/dev\/Kico","isPartOf":{"@id":"https:\/\/devkico.itexto.com.br\/#website"},"primaryImageOfPage":{"@id":"https:\/\/devkico.itexto.com.br\/?p=2643#primaryimage"},"image":{"@id":"https:\/\/devkico.itexto.com.br\/?p=2643#primaryimage"},"thumbnailUrl":"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2017\/08\/1900-postcards-a-quick-stroll-on-the-water.jpg","datePublished":"2017-08-24T03:15:30+00:00","dateModified":"2017-08-24T03:15:30+00:00","author":{"@id":"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7"},"breadcrumb":{"@id":"https:\/\/devkico.itexto.com.br\/?p=2643#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/devkico.itexto.com.br\/?p=2643"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/devkico.itexto.com.br\/?p=2643#primaryimage","url":"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2017\/08\/1900-postcards-a-quick-stroll-on-the-water.jpg","contentUrl":"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2017\/08\/1900-postcards-a-quick-stroll-on-the-water.jpg","width":605,"height":392},{"@type":"BreadcrumbList","@id":"https:\/\/devkico.itexto.com.br\/?p=2643#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/devkico.itexto.com.br\/"},{"@type":"ListItem","position":2,"name":"Groovy\/Grails, Spring e JavaScript Brasil por dentro &#8211; nossa arquitetura de comunidades"}]},{"@type":"WebSite","@id":"https:\/\/devkico.itexto.com.br\/#website","url":"https:\/\/devkico.itexto.com.br\/","name":"\/dev\/Kico","description":"Desenvolvendo software","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/devkico.itexto.com.br\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"pt-BR"},{"@type":"Person","@id":"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7","name":"Kico (Henrique Lobo Weissmann)","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/dd6973d86a689bc63122b2e603f25be3?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/dd6973d86a689bc63122b2e603f25be3?s=96&d=mm&r=g","caption":"Kico (Henrique Lobo Weissmann)"},"sameAs":["https:\/\/x.com\/loboweissmann"],"url":"https:\/\/devkico.itexto.com.br\/?author=1"}]}},"jetpack_featured_media_url":"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2017\/08\/1900-postcards-a-quick-stroll-on-the-water.jpg","jetpack-related-posts":[],"jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts\/2643"}],"collection":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2643"}],"version-history":[{"count":2,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts\/2643\/revisions"}],"predecessor-version":[{"id":2648,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts\/2643\/revisions\/2648"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/media\/2647"}],"wp:attachment":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2643"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2643"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2643"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}