{"id":2290,"date":"2015-10-08T23:50:37","date_gmt":"2015-10-09T02:50:37","guid":{"rendered":"https:\/\/devkico.itexto.com.br\/?p=2290"},"modified":"2015-10-08T23:50:37","modified_gmt":"2015-10-09T02:50:37","slug":"minimizando-a-necessidade-do-deploy-em-aplicacoes-web-monoliticas","status":"publish","type":"post","link":"https:\/\/devkico.itexto.com.br\/?p=2290","title":{"rendered":"Minimizando a necessidade do deploy em aplica\u00e7\u00f5es web monol\u00edticas"},"content":{"rendered":"<p>O fato de termos uma aplica\u00e7\u00e3o monol\u00edtica n\u00e3o implica na necessidade de executarmos o procedimento de deploy (implanta\u00e7\u00e3o) a cada pequena altera\u00e7\u00e3o. Neste post vou expor algumas t\u00e9cnicas simples e complexas que poder\u00e3o lhe ajudar a atingir este objetivo.<\/p>\n<p>Como exemplo vou usar o Grails Brasil, pois a esmagadora maioria das t\u00e9cnicas que aqui ser\u00e3o expostas s\u00e3o aplicadas neste projeto, que recentemente tem passado por importantes mudan\u00e7as conforme evolu\u00edmos sua arquitetura.<\/p>\n<h3>HTML que pode ser externalizado deve ser externalizado<\/h3>\n<p>Em portais como o Grails Brasil \u00e9 comum termos elementos da p\u00e1gina que precisamos alterar com frequ\u00eancia, tal como exposto na imagem abaixo (me desculpem pela grosseria\u00a0gr\u00e1fica):<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-2291\" src=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2015\/10\/areas_html-219x300.png\" alt=\"areas_html\" width=\"219\" height=\"300\" srcset=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2015\/10\/areas_html-219x300.png 219w, https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2015\/10\/areas_html-748x1024.png 748w, https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2015\/10\/areas_html.png 800w\" sizes=\"(max-width: 219px) 100vw, 219px\" \/><\/p>\n<p>Al\u00e9m de \u00e1reas como estas, \u00e9 tamb\u00e9m necess\u00e1rio incluir trechos que sempre s\u00e3o alterados como, por exemplo, scripts de acompanhamento de tr\u00e1fego\u00a0como Google Analytics, propagandas, c\u00f3digos de identifica\u00e7\u00e3o do site ou mesmo trechos JavaScript que precisamos alterar com frequ\u00eancia.<\/p>\n<p>S\u00e3o pequenos conte\u00fados que tornam o procedimento de implanta\u00e7\u00e3o (por mais automatizado e lindo que seja) demasiadamente caro quando precisamos alterar apenas aqueles pontos.<\/p>\n<p>A solu\u00e7\u00e3o que adotamos consiste em externalizar estes conte\u00fados\u00a0em um reposit\u00f3rio centralizado que pode ser desde uma pasta no servidor, um bucket no servi\u00e7o S3 da AWS, uma tabela em um banco de dados ou qualquer outra tecnologia de armazenamento que nos permita alterar este conte\u00fado de forma r\u00e1pida e c\u00f4moda sem a necessidade de acionarmos o procedimento de implanta\u00e7\u00e3o.<\/p>\n<p>Claro que a solu\u00e7\u00e3o n\u00e3o termina a\u00ed. H\u00e1 casos nos quais o acesso a este reposit\u00f3rio \u00e9 lento, comprometendo o desempenho do site. Como resolver esta situa\u00e7\u00e3o? Simples:\u00a0<strong>cacheamos<\/strong> este conte\u00fado. Como mantemos o cache atualizado? Definindo uma data de expira\u00e7\u00e3o ou uma URL de limpeza que \u00e9 acionada por usu\u00e1rios autorizados\u00a0quando este conte\u00fado \u00e9 alterado.<\/p>\n<p>(o mesmo princ\u00edpio pode ser aplicado a imagens, arquivos CSS e c\u00f3digo JavaScript)<\/p>\n<h3>Links expostos no menu de navega\u00e7\u00e3o<\/h3>\n<p>\u00c9 comum termos em nossos menus de navega\u00e7\u00e3o links que apontem para outros sites. No caso do Grails Brasil ocasionalmente precisamos incluir ou remover estes links, tal como ocorre quando, por exemplo, a itexto lan\u00e7a algum treinamento.<\/p>\n<p>Novamente a mesma t\u00e9cnica se aplica: os menus s\u00e3o mais um item de configura\u00e7\u00e3o em nosso banco de dados. Conforme inclu\u00edmos ou removemos registros neste reposit\u00f3rio, menus surgem ou desaparecem do site.<\/p>\n<p>Atualmente o link que leva ao blog do Grails Brasil \u00e9 exposto usando exatamente esta funcionalidade, tal como pode ser visto na imagem abaixo:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-2292\" src=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2015\/10\/menu_grails_brasil-300x16.png\" alt=\"menu_grails_brasil\" width=\"800\" height=\"43\" srcset=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2015\/10\/menu_grails_brasil-300x16.png 300w, https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2015\/10\/menu_grails_brasil.png 916w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/p>\n<h3>Scripts (linguagens embarcadas)<\/h3>\n<p>Se sua arquitetura for bem definida, conforme o tempo passa o n\u00facleo do sistema vai se tornando cada vez mais est\u00e1vel e, com isto, a necessidade de altera\u00e7\u00e3o do mesmo diminui significativamente. \u00c9 o que ocorreu com o Grails Brasil: hoje todo o n\u00facleo do sistema, que \u00e9 essencialmente o seu mecanismo de processamento de postagens (cases, perguntas e not\u00edcias) n\u00e3o requer mais modifica\u00e7\u00f5es (a \u00faltima foi feita uns dois anos atr\u00e1s).<\/p>\n<p>No entanto ocasionalmente ocorre a necessidade de adicionar comportamentos ao redor deste n\u00facleo. Por exemplo: ao finalizar a postagem de uma not\u00edcia publicar o evento em alguma rede social. Ao inv\u00e9s de modificar o c\u00f3digo fonte do sistema hoje, o que fazemos \u00e9 disparar eventos espec\u00edficos para eventos bem definidos no sistema.<\/p>\n<p>Com isto, o evento &#8220;postar not\u00edcia&#8221; dispara o script &#8220;disparo_noticia&#8221;, que publica algo em uma rede social ou envia um e-mail para algu\u00e9m. \u00c9 necess\u00e1rio desativar o envio deste e-mail? F\u00e1cil: trocamos\u00a0o script com a aplica\u00e7\u00e3o executando\u00a0e n\u00e3o precisamos nos preocupar com uma nova implanta\u00e7\u00e3o.<\/p>\n<p>Este \u00e9 apenas um exemplo do uso de scripts. J\u00e1 falei bastante a respeito deste assunto no meu canal do YouTube conforme voc\u00ea pode ver <a href=\"https:\/\/www.youtube.com\/playlist?list=PLc2foeLQlP8-lhTI7K6iI7nw6E_iwAt-p\">nesta playlist<\/a> do meu canal.<\/p>\n<h3>Plug-ins<\/h3>\n<p>Scripts s\u00e3o uma solu\u00e7\u00e3o excelente quando queremos lidar com eventos, mas e quando precisamos trocar uma regra de neg\u00f3cio ou mesmo adicionar novos m\u00f3dulos ao sistema com ele em execu\u00e7\u00e3o?<\/p>\n<p>Uma alternativa fascinante e que estamos explorando para uma futura vers\u00e3o do Grails Brasil \u00e9 a ado\u00e7\u00e3o de\u00a0plug-ins. A ideia \u00e9 relativamente simples mas muito dif\u00edcil de ser implementada: novas funcionalidades para o seu sistema s\u00e3o encapsuladas em m\u00f3dulos carregados em tempo de execu\u00e7\u00e3o pelo seu programa, tal como ocorre o tempo inteiro com sua IDE favorita.<\/p>\n<p>Imagine que em um futuro pr\u00f3ximo seja de nosso interesse adicionar um m\u00f3dulo de cadastro de vagas no Grails Brasil (est\u00e1 planejado). H\u00e1 dois caminhos: podemos incorporar este novo c\u00f3digo \u00e0 base j\u00e1 existente ou implementar um plug-in que seria instalado no servidor. No momento em que este fosse ativado um novo link seria exposto na barra de navega\u00e7\u00e3o do site e os usu\u00e1rios teriam acesso a esta nova funcionalidade.<\/p>\n<p>Deu algum problema neste novo m\u00f3dulo (algo extremamente comum em novas funcionalidades)? F\u00e1cil: trocamos o plug-in em tempo de execu\u00e7\u00e3o. \u00c9 um dos principais ganhos que tanto se fala por a\u00ed em arquiteturas baseadas em micro-servi\u00e7os. A diferen\u00e7a \u00e9 que voc\u00ea pode ter isto hoje sem eles.<\/p>\n<p>Hoje vejo dois caminhos nesta dire\u00e7\u00e3o:<\/p>\n<ul>\n<li><a href=\"http:\/\/www.osgi.org\">OSGi <\/a>&#8211; te permite construir estes m\u00f3dulos no formato de bundles, que s\u00e3o carregados dinamicamente pela sua aplica\u00e7\u00e3o sem a necessidade desta ser reiniciada. \u00c9 uma tecnologia maravilhosa e muito madura (existe desde 1999) mas que infelizmente n\u00e3o vemos ser muito divulgada ultimamente.<\/li>\n<li>Implementar a sua pr\u00f3pria plataforma de plug-ins. \u00c9 um procedimento extremamente trabalhoso, sendo assim requer uma analise muito bem feita a respeito do custo de constru\u00e7\u00e3o e implementa\u00e7\u00e3o.<\/li>\n<\/ul>\n<p>(h\u00e1 um terceiro caminho tamb\u00e9m que seria o projeto Jigsaw, mas n\u00e3o tenho o acompanhado j\u00e1 faz algum tempo)<\/p>\n<h3>Data sources configurados via JNDI<\/h3>\n<p>Outro recurso importante e muitas vezes negligenciado. Se voc\u00ea disponibilizar \u00e0 sua aplica\u00e7\u00e3o a fonte de dados via JNDI, n\u00e3o \u00e9 necess\u00e1rio (dependendo do seu servidor de aplica\u00e7\u00e3o) reiniciar sua aplica\u00e7\u00e3o caso, por exemplo, voc\u00ea precise alterar a configura\u00e7\u00e3o do pool de conex\u00f5es ou mesmo trocar completamente de banco de dados.<\/p>\n<h3>JNDI n\u00e3o \u00e9 apenas para data sources<\/h3>\n<p>\u00c9 importante lembrar que JNDI n\u00e3o \u00e9 usado apenas para se obter um data source. Na realidade, qualquer tipo de objeto pode ser disponibilizado via JNDI. Sendo assim n\u00e3o \u00e9 dif\u00edcil imaginar\u00a0uma arquitetura na qual plug-ins que representem regras de neg\u00f3cio ou mesmo m\u00f3dulos sejam disponibilizados pelo servidor de aplica\u00e7\u00e3o atrav\u00e9s desta interface.<\/p>\n<p>Nunca fiz isto, mas j\u00e1 ouvi algumas experi\u00eancias positivas nesta dire\u00e7\u00e3o. \u00c9 um procedimento raro mas n\u00e3o invi\u00e1vel.<\/p>\n<h2>Conclus\u00f5es<\/h2>\n<p>Mostrei neste post algumas t\u00e9cnicas interessantes que possibilitam ao arquiteto projetar solu\u00e7\u00f5es nas quais a necessidade de executarmos o\u00a0procedimento de implanta\u00e7\u00e3o pode ser extremamente reduzida. V\u00e3o desde solu\u00e7\u00f5es simples como a externaliza\u00e7\u00e3o de recursos est\u00e1ticos (HTML, JavaScript, imagens, CSS), passando pela ado\u00e7\u00e3o de scripts usando linguagens embarc\u00e1veis como Groovy, chegando a solu\u00e7\u00f5es mais complexas como a implementa\u00e7\u00e3o de uma arquitetura de plug-ins e, finalmente, expondo um uso pouco conhecido do JNDI.<\/p>\n<p>Em todas as solu\u00e7\u00f5es o problema a ser solucionado \u00e9 o mesmo: componentiza\u00e7\u00e3o. Se voc\u00ea quer minimizar a necessidade de uma implanta\u00e7\u00e3o, o foco deve ser no projeto de solu\u00e7\u00f5es que tenham um modelo de componente bem definido. Tendo isto, a implanta\u00e7\u00e3o se torna um evento raro.<\/p>\n<p>(lembrando que componente pode n\u00e3o ser c\u00f3digo execut\u00e1vel, tal como exemplificado no caso dos recursos est\u00e1ticos externaliz\u00e1veis exposto neste post)<\/p>\n<p>Nosso foco atual no projeto &#8220;Grails Brasil&#8221; \u00e9 chegar ao momento em que a implanta\u00e7\u00e3o se torne algo extremamente raro. Ironicamente para chegar a este resultado temos executado implanta\u00e7\u00f5es di\u00e1rias nas quais pouco a pouco vamos incorporando nossa pr\u00f3pria arquitetura de plug-ins que queremos tornar p\u00fablica em breve. :)<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Como minimizar os procedimentos de implanta\u00e7\u00e3o em aplica\u00e7\u00f5es web monol\u00edticas usando como exemplo o c\u00f3digo fonte do Grails Brasil<\/p>\n","protected":false},"author":1,"featured_media":1758,"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],"tags":[],"class_list":["post-2290","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-desenvolvimento-de-software"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v22.8 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Minimizando a necessidade do deploy em aplica\u00e7\u00f5es web monol\u00edticas - \/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=2290\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Minimizando a necessidade do deploy em aplica\u00e7\u00f5es web monol\u00edticas - \/dev\/Kico\" \/>\n<meta property=\"og:description\" content=\"Como minimizar os procedimentos de implanta\u00e7\u00e3o em aplica\u00e7\u00f5es web monol\u00edticas usando como exemplo o c\u00f3digo fonte do Grails Brasil\" \/>\n<meta property=\"og:url\" content=\"https:\/\/devkico.itexto.com.br\/?p=2290\" \/>\n<meta property=\"og:site_name\" content=\"\/dev\/Kico\" \/>\n<meta property=\"article:published_time\" content=\"2015-10-09T02:50:37+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2014\/03\/componente.png\" \/>\n\t<meta property=\"og:image:width\" content=\"256\" \/>\n\t<meta property=\"og:image:height\" content=\"197\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\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=\"7 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=2290\",\"url\":\"https:\/\/devkico.itexto.com.br\/?p=2290\",\"name\":\"Minimizando a necessidade do deploy em aplica\u00e7\u00f5es web monol\u00edticas - \/dev\/Kico\",\"isPartOf\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=2290#primaryimage\"},\"image\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=2290#primaryimage\"},\"thumbnailUrl\":\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2014\/03\/componente.png\",\"datePublished\":\"2015-10-09T02:50:37+00:00\",\"dateModified\":\"2015-10-09T02:50:37+00:00\",\"author\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7\"},\"breadcrumb\":{\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=2290#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/devkico.itexto.com.br\/?p=2290\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=2290#primaryimage\",\"url\":\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2014\/03\/componente.png\",\"contentUrl\":\"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2014\/03\/componente.png\",\"width\":256,\"height\":197},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/devkico.itexto.com.br\/?p=2290#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/devkico.itexto.com.br\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Minimizando a necessidade do deploy em aplica\u00e7\u00f5es web monol\u00edticas\"}]},{\"@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":"Minimizando a necessidade do deploy em aplica\u00e7\u00f5es web monol\u00edticas - \/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=2290","og_locale":"pt_BR","og_type":"article","og_title":"Minimizando a necessidade do deploy em aplica\u00e7\u00f5es web monol\u00edticas - \/dev\/Kico","og_description":"Como minimizar os procedimentos de implanta\u00e7\u00e3o em aplica\u00e7\u00f5es web monol\u00edticas usando como exemplo o c\u00f3digo fonte do Grails Brasil","og_url":"https:\/\/devkico.itexto.com.br\/?p=2290","og_site_name":"\/dev\/Kico","article_published_time":"2015-10-09T02:50:37+00:00","og_image":[{"width":256,"height":197,"url":"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2014\/03\/componente.png","type":"image\/png"}],"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":"7 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/devkico.itexto.com.br\/?p=2290","url":"https:\/\/devkico.itexto.com.br\/?p=2290","name":"Minimizando a necessidade do deploy em aplica\u00e7\u00f5es web monol\u00edticas - \/dev\/Kico","isPartOf":{"@id":"https:\/\/devkico.itexto.com.br\/#website"},"primaryImageOfPage":{"@id":"https:\/\/devkico.itexto.com.br\/?p=2290#primaryimage"},"image":{"@id":"https:\/\/devkico.itexto.com.br\/?p=2290#primaryimage"},"thumbnailUrl":"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2014\/03\/componente.png","datePublished":"2015-10-09T02:50:37+00:00","dateModified":"2015-10-09T02:50:37+00:00","author":{"@id":"https:\/\/devkico.itexto.com.br\/#\/schema\/person\/502ab8892631bb005d6da2269fe5a3a7"},"breadcrumb":{"@id":"https:\/\/devkico.itexto.com.br\/?p=2290#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/devkico.itexto.com.br\/?p=2290"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/devkico.itexto.com.br\/?p=2290#primaryimage","url":"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2014\/03\/componente.png","contentUrl":"https:\/\/devkico.itexto.com.br\/wp-content\/uploads\/2014\/03\/componente.png","width":256,"height":197},{"@type":"BreadcrumbList","@id":"https:\/\/devkico.itexto.com.br\/?p=2290#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/devkico.itexto.com.br\/"},{"@type":"ListItem","position":2,"name":"Minimizando a necessidade do deploy em aplica\u00e7\u00f5es web monol\u00edticas"}]},{"@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\/2014\/03\/componente.png","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\/2290"}],"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=2290"}],"version-history":[{"count":4,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts\/2290\/revisions"}],"predecessor-version":[{"id":2296,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/posts\/2290\/revisions\/2296"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=\/wp\/v2\/media\/1758"}],"wp:attachment":[{"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2290"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2290"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devkico.itexto.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2290"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}