{"id":2707,"date":"2021-07-11T22:16:23","date_gmt":"2021-07-12T01:16:23","guid":{"rendered":"https:\/\/elemarjr.com\/arquiteturadesoftware\/?p=2707"},"modified":"2024-01-11T18:07:38","modified_gmt":"2024-01-11T21:07:38","slug":"projetando-sistemas-com-microsservicos-capitulo-14-v-1-0","status":"publish","type":"volume-1","link":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/projetando-sistemas-com-microsservicos-capitulo-14-v-1-0\/","title":{"rendered":"Projetando sistemas com microsservi\u00e7os \/ Cap\u00edtulo 14 v 1.0"},"content":{"rendered":"<p><strong>Acoplamento \u00e9 a causa raiz de boa parte dos problemas relacionados a disponibilidade,\u00a0 manutenabilidade, performance e resili\u00eancia<\/strong>. Acoplamento n\u00e3o tratado \u00e9 fonte de custo tanto para o desenvolvimento quanto para a sustenta\u00e7\u00e3o de solu\u00e7\u00f5es.<\/p>\n<p><strong>Conforme Conway, software com componentes acoplados \u00e9 resultado do trabalho de times acoplados. N\u00e3o raro, esses times tem &#8220;pontos de falha&#8221; e &#8220;gargalos&#8221; bem conhecidos<\/strong>. A correta organiza\u00e7\u00e3o dos times, permitindo que esses operem de maneira independente, inclusive disponibilizando seus produtos de maneira independente \u00e9 a ess\u00eancia para combater o acoplamento.<\/p>\n<p>H\u00e1 mais de uma d\u00e9cada, arquiteturas baseadas em microsservi\u00e7os tem permitido o estabelecimento de times com mais autonomia para entregar mais valor para o neg\u00f3cio. Tamb\u00e9m h\u00e1 mais de uma d\u00e9cada, implementa\u00e7\u00f5es infelizes desse estilo arquitetural tem destru\u00eddo valor.<\/p>\nMicrosservi\u00e7os n\u00e3o \u00e9 uma solu\u00e7\u00e3o &#8220;bala de prata&#8221;. Afinal, esse tipo de solu\u00e7\u00e3o n\u00e3o existe. Entretanto, tem m\u00e9ritos e dem\u00e9ritos que, se bem ponderados, tem poder de transformar organiza\u00e7\u00f5es para melhor.\n<h2>Conceito fundamental<\/h2>\n<p>Microsservi\u00e7os \u00e9 um estilo arquitetural que preconiza o desenvolvimento de aplica\u00e7\u00f5es a partir de servi\u00e7os pequenos, cada um rodando em seu pr\u00f3prio processo, que se comunicam atrav\u00e9s de mecanismos leves.<\/p>\n<div class=\"card-insight\" style=\"background-color: #f0f0f0; width: 100%; padding: 35px 30px 30px 35px; border-radius: 5px 5px 5px 5px; margin-top: 30px; margin-bottom: 35px; font-size: 16px; box-shadow: 0px 4px 0px 0px #dddddd;\">\r\n<p style=\"font-size: 24px; font-weight:bold; line-height: 28px; font-family: Montserrat;\">REST (HTTP resource API) ou gRPC<\/p>\r\n<\/p>\n<p>Comunica\u00e7\u00e3o intensiva entre servi\u00e7os utilizando a combina\u00e7\u00e3o HTTP\/1.1 e JSON \u00e9 um &#8220;pedido&#8221; para problemas de performance. Seja pelas limita\u00e7\u00f5es do protocolo de comunica\u00e7\u00e3o ou pela &#8220;verbosidade&#8221; do formato JSON.<\/p>\n<p>Recentemente, t\u00eam ganho destaque a utiliza\u00e7\u00e3o de gRPC (que opera sobre HTTP\/2) combinada <em>protocol buffers<\/em>.<\/p>\n<p><\/div>\n<p>Estrategicamente, microsservi\u00e7os precisam ser constru\u00eddos para suportar\u00a0<em>capabilities\u00a0<\/em>de neg\u00f3cio. Essa caracter\u00edstica \u00e9 essencial para que sejam desenvolvidos e tenham\u00a0<em>deploys <\/em>independentes.<\/p>\n<p><img fetchpriority=\"high\" decoding=\"async\" class=\"wp-image-2712 aligncenter\" src=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/wp-content\/uploads\/2021\/07\/organizacao.png\" alt=\"\" width=\"709\" height=\"425\" srcset=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/07\/organizacao.png 1528w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/07\/organizacao-300x180.png 300w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/07\/organizacao-1024x614.png 1024w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/07\/organizacao-768x460.png 768w\" sizes=\"(max-width: 709px) 100vw, 709px\" \/><\/p>\n<p>Importante destacar que esse estilo arquitetural habilita tamanha independ\u00eancia autorizando, inclusive, que cada microsservi\u00e7o seja escrito em uma linguagem de programa\u00e7\u00e3o diferente com tecnologias de persist\u00eancia exclusivas.<\/p>\n<div class=\"card-insight\" style=\"background-color: #f0f0f0; width: 100%; padding: 35px 30px 30px 35px; border-radius: 5px 5px 5px 5px; margin-top: 30px; margin-bottom: 35px; font-size: 16px; box-shadow: 0px 4px 0px 0px #dddddd;\">\r\n<p style=\"font-size: 24px; font-weight:bold; line-height: 28px; font-family: Montserrat;\">API Layer<\/p>\r\n<\/p>\n<p>A maioria das arquiteturas baseadas em microsservi\u00e7os implementa alguma forma de &#8220;camada de API&#8221;, muitas vezes implementadas por um API Gateway, conectando usu\u00e1rios externos (interfaces ou sistemas de terceiros) aos microsservi\u00e7os. Trata-se de uma abordagem opcional, mas recomendada.<\/p>\n<p>Essa estrat\u00e9gia permite a cria\u00e7\u00e3o facilitada de APIs externas, facilitando a ado\u00e7\u00e3o, al\u00e9m de poder implementar\u00a0<em>shared concerns\u00a0<\/em>como autentica\u00e7\u00e3o e localiza\u00e7\u00e3o. Entretanto, \u00e9 importante destacar que n\u00e3o devem ser atribu\u00eddas a essa camada responsabilidades de orquestra\u00e7\u00e3o.<\/p>\n<p><\/div>\n<h2>Rela\u00e7\u00e3o com <em>Squads<\/em><\/h2>\nN\u00e3o \u00e9 recomend\u00e1vel formar <em>squads\u00a0<\/em>em uma organiza\u00e7\u00e3o, sem revisar a arquitetura do software que ela produz. Tampouco \u00e9 respons\u00e1vel iniciar um projeto baseado em (micros)servi\u00e7os sem, antes, fazer uma revis\u00e3o da estrutura organizacional.\n<hr \/>\n<p>A\u00a0<a href=\"https:\/\/www.eximia.co\/pt\/2019\/08\/21\/conways-law\/\">lei de Conway \u00e9 categ\u00f3rica<\/a>\u00a0e suas implica\u00e7\u00f5es s\u00e3o \u00f3bvias:\u00a0<strong>Uma organiza\u00e7\u00e3o monol\u00edtica n\u00e3o consegue produzir microsservi\u00e7os. Empresas que produzem softwares monol\u00edticos n\u00e3o deveriam ter \u201csquads\u201d.<\/strong><\/p>\n<em>Squads<\/em> s\u00e3o times multifuncionais, que conseguem desempenhar atividades organizacionais de ponta-a-ponta, com\u00a0<a href=\"https:\/\/www.eximia.co\/pt\/2019\/07\/31\/o-que-considerar-antes-de-adotar-squads-em-sua-organizacao\/\">autonomia e alinhamento<\/a>.\u00a0\u00a0<strong>Eles reduzem a burocracia da organiza\u00e7\u00e3o pois reduzem a necessidade de\u00a0<a href=\"https:\/\/www.eximia.co\/pt\/2019\/07\/12\/quando-nao-ha-confianca-emerge-a-burocracia\/\">documentos que nascem da falta de confian\u00e7a<\/a>.\u00a0<\/strong>Afinal, pessoas de um mesmo time costumam confiar mais umas nas outras.\n<hr \/>\n<p>Para ter autonomia, as \u201centregas\u201d de um <em>squad\u00a0<\/em>devem ocorrer de forma independente.\u00a0Se as entregas de um\u00a0<em>squad\u00a0<\/em>precisarem ser feitas com as de outros, acordos s\u00e3o necess\u00e1rios e a burocracia-para-confian\u00e7a emerge.<\/p>\n<p><strong>Apenas times realmente aut\u00f4nomos conseguem produzir (micros)servi\u00e7os com baixo acoplamento.\u00a0<\/strong>Microsservi\u00e7os com alto acoplamento n\u00e3o se justificam pois s\u00e3o, apenas, um pesadelo para a opera\u00e7\u00e3o.<\/p>\n<p><strong>S\u00e3o necess\u00e1rios times realmente independentes para produzir (micros)servi\u00e7os que n\u00e3o compartilham banco de dados.<\/strong><\/p>\nA comunica\u00e7\u00e3o entre (micros)servi\u00e7os ser\u00e1 naturalmente ass\u00edncrona, se a comunica\u00e7\u00e3o entre os times que os produzem tamb\u00e9m for.\u00a0<strong>Comunica\u00e7\u00e3o s\u00edncrona entre (micros)servi\u00e7os revela, mais que poss\u00edvel falha de design de software, falha de design organizacional.<\/strong>\n<hr \/>\n<h2>Implica\u00e7\u00f5es para a reutiliza\u00e7\u00e3o<\/h2>\n<p>Uma das &#8220;fontes inocentes&#8221; para acoplamento \u00e9 a insist\u00eancia por alternativas para reutiliza\u00e7\u00e3o.<\/p>\n<p style=\"padding-left: 40px;\"><em>O trade-off negativo da reutiliza\u00e7\u00e3o \u00e9 o acoplamento. Quando um arquiteto projeta um sistema favorecendo o reuso, ele tamb\u00e9m favorece ao acoplamento para permitir esse reuso, seja por heran\u00e7a ou composi\u00e7\u00e3o. (Neal Ford)<\/em><\/p>\n<p>Toda alternativa de reutiliza\u00e7\u00e3o faz emergir um componente com acoplamento aferente elevado que, mais cedo ou mais tarde, se converte em &#8220;gargalo&#8221; para o desenvolvimento.<\/p>\nSegundo Conway, componentes &#8220;gargalo&#8221; se traduzem em times gargalo, caso se d\u00ea atribui\u00e7\u00e3o de &#8220;propriedade&#8221; a algum, ou em pontos cr\u00edticos de falha devido a alta difus\u00e3o de responsabilidade.\n<hr \/>\n<p>A emerg\u00eancia por alternativas para a gest\u00e3o de componentes deu origem a iniciativas de <em>inner sourcing.<\/em><\/p>\n<h4>Reutiliza\u00e7\u00e3o de recursos operacionais<\/h4>\n<p>A op\u00e7\u00e3o por duplica\u00e7\u00e3o frente a reutiliza\u00e7\u00e3o \u00e9 v\u00e1lida para artefatos funcionais, mas n\u00e3o para recursos operacionais (tais como\u00a0<em>logging\u00a0<\/em>e monitoramento).\u00a0A abordagem comum \u00e9 manter recursos funcionais &#8220;dentro&#8221; dos microsservi\u00e7os, duplicados sempre que necess\u00e1rio, e recursos operacionais &#8220;fora&#8221;, em\u00a0<em>sidecars.<\/em><\/p>\n<p><img decoding=\"async\" class=\"wp-image-2717 aligncenter\" src=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/wp-content\/uploads\/2021\/07\/sidecar.png\" alt=\"\" width=\"160\" height=\"346\" srcset=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/07\/sidecar.png 308w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/07\/sidecar-139x300.png 139w\" sizes=\"(max-width: 160px) 100vw, 160px\" \/><\/p>\n<p>A &#8220;padroniza\u00e7\u00e3o&#8221; de um \u00fanico <em>sidecar\u00a0<\/em>em dois ou mais microsservi\u00e7os permite a inclus\u00e3o de componentes para administra\u00e7\u00e3o.<\/p>\n<p><img decoding=\"async\" class=\" wp-image-2718 aligncenter\" src=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/wp-content\/uploads\/2021\/07\/service_plane.png\" alt=\"\" width=\"380\" height=\"362\" srcset=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/07\/service_plane.png 790w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/07\/service_plane-300x286.png 300w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/07\/service_plane-768x731.png 768w\" sizes=\"(max-width: 380px) 100vw, 380px\" \/><\/p>\n<p>A &#8220;predomin\u00e2ncia&#8221; de um \u00fanico <em>sidecar <\/em>habilita a forma\u00e7\u00e3o de <em>service meshs<\/em>.<\/p>\n<div class=\"card-insight\" style=\"background-color: #f0f0f0; width: 100%; padding: 35px 30px 30px 35px; border-radius: 5px 5px 5px 5px; margin-top: 30px; margin-bottom: 35px; font-size: 16px; box-shadow: 0px 4px 0px 0px #dddddd;\">\r\n<p style=\"font-size: 24px; font-weight:bold; line-height: 28px; font-family: Montserrat;\">Istio<\/p>\r\n<\/p>\n<p>Uma das plataformas mais utilizadas para ado\u00e7\u00e3o de <em>Service Mesh<\/em> \u00e9 o Istio.\u00a0 Ele estende o Kubernetes para estabelecer uma rede program\u00e1vel, usando o <em>proxy<\/em> de servi\u00e7o Envoy. Ele oferece gerenciamento de tr\u00e1fego universal, telemetria e seguran\u00e7a para implanta\u00e7\u00f5es complexas.<\/p>\n<p><\/div>\n<h2>Arquitetura naturalmente distribu\u00edda<\/h2>\n<p>Em produ\u00e7\u00e3o, microsservi\u00e7os operam em forma naturalmente distribu\u00edda. Afinal, cada servi\u00e7o &#8220;roda&#8221; em um processo independente, originalmente, em um computador dedicado, mas, atualmente, em m\u00e1quinas virtuais ou cont\u00eaineres.<\/p>\n<p>Quando muitos servi\u00e7os compartilham recursos computacionais em demasia, rodando em uma \u00fanica plataforma operacional, t\u00eam-se, inicialmente, melhor aproveitamento da largura de banda da rede, mem\u00f3ria, discos, etc. Entretanto, na medida em que as demandas de cada servi\u00e7o crescem, ocorrem restri\u00e7\u00f5es que podem levar a problemas de disponibilidade e aumentam a import\u00e2ncia de adotar t\u00e1ticas de resili\u00eancia.<\/p>\n<p>Sem o devido cuidado, aplica\u00e7\u00f5es baseadas em microsservi\u00e7os podem ter, devido a natureza distribu\u00edda, problemas de performance. Afinal de contas, chamadas na rede s\u00e3o muito mais custosas que chamadas a m\u00e9todos, al\u00e9m de todo o <em>overhead\u00a0<\/em>de seguran\u00e7a e governan\u00e7a.<\/p>\n<div class=\"card-insight\" style=\"background-color: #f0f0f0; width: 100%; padding: 35px 30px 30px 35px; border-radius: 5px 5px 5px 5px; margin-top: 30px; margin-bottom: 35px; font-size: 16px; box-shadow: 0px 4px 0px 0px #dddddd;\">\r\n<p style=\"font-size: 24px; font-weight:bold; line-height: 28px; font-family: Montserrat;\">Oito fal\u00e1cias da computa\u00e7\u00e3o distribu\u00edda<\/p>\r\n<\/p>\n<p>Em 1994, Peter Deutsch, que trabalhou na Sun Microsystems, consolidou uma lista de 7 fal\u00e1cias frequentemente associadas a sistemas distribu\u00eddos. Mais tarde, em 1997, James Gosling adicionou um item a essa lista, criando a comumente conhecida rela\u00e7\u00e3o das oito fal\u00e1cias da computa\u00e7\u00e3o distribu\u00edda. S\u00e3o elas:<\/p>\n<ul>\n<li>A rede \u00e9 confi\u00e1vel<\/li>\n<li>A lat\u00eancia \u00e9 zero<\/li>\n<li>A largura de banda \u00e9 infinita<\/li>\n<li>A rede \u00e9 segura<\/li>\n<li>A topologia da rede nunca muda<\/li>\n<li>Existe um administrador<\/li>\n<li>Custo de transfer\u00eancia de dados \u00e9 zero<\/li>\n<li>A rede \u00e9 homog\u00eanea<\/li>\n<\/ul>\n<p><\/div>\nPela &#8220;sensibilidade&#8221; dos sistemas distribu\u00eddos, \u00e9 fator chave estruturar as solu\u00e7\u00f5es minimizando transa\u00e7\u00f5es que extrapolem os limites dos servi\u00e7os, impactando na granularidade.\n<h2>Rela\u00e7\u00e3o com Domain-driven Design<\/h2>\nA decomposi\u00e7\u00e3o de um sistema em microsservi\u00e7os implica em tolerar duplica\u00e7\u00e3o como ant\u00eddoto para o acoplamento. Al\u00e9m disso, devido aos problemas comuns \u00e0 sistemas distribu\u00eddos, implica em organizar componentes de forma a minimizar a quantidade de transa\u00e7\u00f5es envolvendo servi\u00e7os. Da\u00ed a import\u00e2ncia de utilizar estrat\u00e9gias cuidadosas para definir n\u00edveis de granularidade e crit\u00e9rios de decomposi\u00e7\u00e3o.\n<hr \/>\n<p>Uma abordagem que tem ganho em popularidade \u00e9 a utiliza\u00e7\u00e3o de\u00a0<em>Domain-driven Design,\u00a0<\/em>fazendo com que microsservi\u00e7os implementem total ou parcialmente elementos de um contexto delimitado (<em>bounded context<\/em>).<\/p>\n<p><span style=\"vertical-align: inherit;\"><span style=\"vertical-align: inherit;\">Em um mon\u00f3lito, \u00e9 comum que os desenvolvedores compartilhem classes comuns, com baixo valor sem\u00e2ntico, entre partes distintas do aplicativo. <\/span><span style=\"vertical-align: inherit;\">No entanto, em sistemas baseados microsservi\u00e7os, com vistas a evitar o acoplamento, a duplica\u00e7\u00e3o \u00e9 prefer\u00edvel.<\/span><\/span><\/p>\n<div class=\"card-insight\" style=\"background-color: #f0f0f0; width: 100%; padding: 35px 30px 30px 35px; border-radius: 5px 5px 5px 5px; margin-top: 30px; margin-bottom: 35px; font-size: 16px; box-shadow: 0px 4px 0px 0px #dddddd;\">\r\n<p style=\"font-size: 24px; font-weight:bold; line-height: 28px; font-family: Montserrat;\">Origem do termo monol\u00edtico<\/p>\r\n<\/p>\n<p>O termo &#8220;monol\u00edtico&#8221;, bastante utilizado para designar sistemas projetados em oposi\u00e7\u00e3o aos conceitos relacionados a microsservi\u00e7os, foi inicialmente utilizado por Eric Raymond no cl\u00e1ssico &#8220;<em>The Art of Unix Programming<\/em>&#8220;.<\/p>\n<p><\/div>\n<h2>Implica\u00e7\u00f5es para governan\u00e7a<\/h2>\n<p><strong>A natureza distribu\u00edda, do software e dos times, estabelece uma tend\u00eancia a n\u00e3o-padroniza\u00e7\u00e3o das tecnologias adotadas.<\/strong> Por um lado, isso \u00e9 uma coisa boa, afinal, fica mais f\u00e1cil utilizar a tecnologia certa para cada problema. Por outro, pode acender &#8220;resist\u00eancias&#8221; em empresas com culturas passionais ou burocr\u00e1ticas.<\/p>\nNo lugar de &#8220;regras escritas em pedra&#8221;, ou melhor, em algum peda\u00e7o de papel ou em um documento digital, o caminho mais eficiente tem sido a &#8220;poliniza\u00e7\u00e3o&#8221; de tecnologias e ferramentas, com pr\u00e1ticas de governan\u00e7a mais leves, como por exemplo, a elabora\u00e7\u00e3o de radares mos moldes propostos pela ThoughtWorks.\n<hr \/>\n<div class=\"card-insight\" style=\"background-color: #f0f0f0; width: 100%; padding: 35px 30px 30px 35px; border-radius: 5px 5px 5px 5px; margin-top: 30px; margin-bottom: 35px; font-size: 16px; box-shadow: 0px 4px 0px 0px #dddddd;\">\r\n<p style=\"font-size: 24px; font-weight:bold; line-height: 28px; font-family: Montserrat;\">O radar de tecnologia<\/p>\r\n<\/p>\n<p>Um radar de tecnologia \u00e9 um guia com opini\u00f5es sobre tecnologias e tend\u00eancias que impactam a ind\u00fastria. O m\u00e9todo foi criado pela ThoughtWorks e t\u00eam edi\u00e7\u00f5es fornecidos pela consultoria. Entretanto, \u00e9 livre para confec\u00e7\u00e3o dentro de cada empresa indicando t\u00e9cnicas, ferramentas, plataformas, linguagens &amp; <em>frameworks<\/em>.<\/p>\n<p><\/div>\n<h2>Rela\u00e7\u00e3o com\u00a0<em>Cloud Native Computing<\/em><\/h2>\n<p><strong>Uma solu\u00e7\u00e3o\u00a0<em>cloud native\u00a0<\/em>utiliza\u00a0<em>stacks\u00a0<\/em>de tecnologia <em>open source\u00a0<\/em>para distribuir aplica\u00e7\u00f5es, como microsservi\u00e7os, colocando suas partes em cont\u00eaineres apropriados, dinamicamente orquestrados como forma de otimizar a utiliza\u00e7\u00e3o de recursos.<\/strong> N\u00e3o se trata de como s\u00e3o organizados servidores (que est\u00e3o &#8220;na nuvem&#8221;), mas, sim, como s\u00e3o organizados os servi\u00e7os.<\/p>\n<p>Pr\u00e1ticas\u00a0<em>cloud native\u00a0<\/em>s\u00e3o mais f\u00e1ceis de implementar em aplica\u00e7\u00f5es desenvolvidas com microsservi\u00e7os. Ali\u00e1s, h\u00e1 quem considere princ\u00edpio essencial junto como ado\u00e7\u00e3o de plataformas, cont\u00eaineres, orquestradores e automa\u00e7\u00e3o.<\/p>\n<h2>Evoluindo solu\u00e7\u00f5es baseadas em SOA com ESBs<\/h2>\n<h4>Ponto de partida<\/h4>\n<p>Embora se confronte muito a ideia de arquiteturas baseadas em microsservi\u00e7os com aplica\u00e7\u00f5es monol\u00edticas, este n\u00e3o \u00e9 o debate mais comum na maioria das organiza\u00e7\u00f5es de maior porte. Estas, com frequ\u00eancia, t\u00eam hist\u00f3rico de implanta\u00e7\u00e3o de alguma variante de arquitetura baseada em servi\u00e7os (SOA).<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-2729 aligncenter\" src=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/wp-content\/uploads\/2021\/07\/soa.jpeg\" alt=\"\" width=\"740\" height=\"450\" srcset=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/07\/soa.jpeg 1031w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/07\/soa-300x182.jpeg 300w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/07\/soa-1024x623.jpeg 1024w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/07\/soa-768x467.jpeg 768w\" sizes=\"(max-width: 740px) 100vw, 740px\" \/><\/p>\n<p>Embora existam pequenas varia\u00e7\u00f5es, as implementa\u00e7\u00f5es legadas geralmente est\u00e3o associadas as seguintes caracer\u00edsticas:<\/p>\n<ul>\n<li>Um conjunto de\u00a0<strong>sistemas<\/strong>, geralmente em tecnologia legada, junto com sistemas mais novos, alguns at\u00e9 rodando na nuvem, suportam o neg\u00f3cio da organiza\u00e7\u00e3o.<\/li>\n<li>Sobre o conjunto de aplica\u00e7\u00f5es legadas, um conjunto de\u00a0<strong>servi\u00e7os<\/strong>\u00a0apresentam interfaces de neg\u00f3cio para suportar processos, inicialmente de integra\u00e7\u00e3o, que \u201cexp\u00f5e\u201d os sistemas de base com algum n\u00edvel de governan\u00e7a<\/li>\n<li>A comunica\u00e7\u00e3o entre os diversos sistemas legados \u00e9 viabilizado por um\u00a0<strong>ESB<\/strong>\u00a0(geralmente corporativo, bem \u201ccaro\u201d, e de um fornecedor de grande nome). Esse \u201cESB\u201d entrega um conjunto de\u00a0<em>features\u00a0<\/em>incluindo, al\u00e9m de mensageria, pol\u00edticas de governan\u00e7a, transforma\u00e7\u00e3o de dados, seguran\u00e7a (autentica\u00e7\u00e3o e autoriza\u00e7\u00e3o), etc.<\/li>\n<li>Um conjunto de <strong>aplica\u00e7\u00f5es clientes<\/strong>\u00a0se comunica com os servi\u00e7os, geralmente atrav\u00e9s da ESB.<\/li>\n<\/ul>\n<hr \/>\n<p>Cada um dos\u00a0<strong>sistemas\u00a0<\/strong>da empresa e, muitas vezes, muitos dos\u00a0<strong>servi\u00e7os<\/strong>\u00a0s\u00e3o mantidos como monol\u00edticos locais, cada um com seu banco de dados.<\/p>\n<p>N\u00e3o \u00e9 raro que os\u00a0<strong>sistemas\u00a0<\/strong>sejam desenvolvidos em tecnologias legadas (MUMPS, COBOL, etc.) Os <strong>servi\u00e7os<\/strong> geralmente est\u00e3o implantados usando protocolos pesados, como <a href=\"https:\/\/pt.wikipedia.org\/wiki\/SOAP\">SOAP<\/a>.<\/p>\n<p>Recentemente, as press\u00f5es da Transforma\u00e7\u00e3o Digital tem levado as empresas a adicionarem uma camada extra a arquitetura indicada acima. <strong>Na tentativa de se tornarem mais \u201cabertas\u201d, conectadas e digitais, as empresas est\u00e3o fornecendo APIs para facilitar a conex\u00e3o com seus clientes.<\/strong><\/p>\n<h4><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-2730 aligncenter\" src=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/wp-content\/uploads\/2021\/07\/api_gateway.png\" alt=\"\" width=\"740\" height=\"638\" srcset=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/07\/api_gateway.png 1031w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/07\/api_gateway-300x259.png 300w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/07\/api_gateway-1024x883.png 1024w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/07\/api_gateway-768x662.png 768w\" sizes=\"(max-width: 740px) 100vw, 740px\" \/>Problemas a superar<\/h4>\n<p><strong>Considerando que a lei de Conway seja v\u00e1lida, \u00e9 bem dif\u00edcil suportar uma organiza\u00e7\u00e3o para manter a arquitetura descrita acima.<\/strong><\/p>\n<p><strong>Invariavelmente, os sistemas legados, cedo ou tarde, se convertem em gargalos<\/strong>\u00a0e acabam sendo mantidos por \u201csilos\u201d, as vezes bem intencionados, com gente que se esfor\u00e7a para suportar o ritmo de modifica\u00e7\u00e3o de dados demandado pelas \u201cnovas APIs\u201d. Entretanto,<strong>\u00a0n\u00e3o \u00e9 raro que recursos de \u201ccontingenciamento\u201d precisem ser implantados de forma que os modifica\u00e7\u00f5es fiquem represadas por mais tempo que o ideal para o neg\u00f3cio.<\/strong><\/p>\n<p>Tamb\u00e9m n\u00e3o \u00e9 incomum que o ESB acabe assumindo muito mais tarefas do que deveria (sobretudo aplica\u00e7\u00e3o de regra de neg\u00f3cio).<\/p>\n<h4 id=\"por-que-microsservicos-sao-recomendados-nesse-cenario-5dd7cf8637cb6\"><span id=\"Por_que_microsservicos_sao_recomendados_nesse_cenario\">Por que microsservi\u00e7os s\u00e3o recomendados nesse cen\u00e1rio?<\/span><\/h4>\n<p><strong>Para cen\u00e1rios descritos acima, microsservi\u00e7os parecem fazer sentido<\/strong>,\u00a0<a href=\"https:\/\/www.eximia.co\/pt\/2019\/09\/12\/relacao-entre-squads-e-microsservicos\/\">primeiro pelo aspecto organizacional (autorizando a ideia de eliminar silos de TI).<\/a><\/p>\n<p>Outro ponto importante e que n\u00e3o pode ser ignorado \u00e9 que a arquitetura descrita acima \u00e9 cara para manter e, sobretudo, para atualizar. N\u00e3o \u00e9 incomum encontrarmos\u00a0<a href=\"https:\/\/www.eximia.co\/pt\/2019\/09\/10\/empresa-que-nao-aprende-a-mudar-rapido-morre\/\">empresas onde o \u201cneg\u00f3cio\u201d deseja acelerar o ritmo das mudan\u00e7as (o que \u00e9 um imperativo)<\/a>\u00a0mas n\u00e3o conseguem em fun\u00e7\u00e3o do \u201cpeso\u201d da tecnologia.<\/p>\n<h4><span id=\"Abaixo_a_ESB\">Abaixo a ESB!<\/span><\/h4>\n<p><strong>Boa parte da complexidade vista at\u00e9 aqui reside no fato de termos \u201cdois mundos\u201d (APIs e \u201csistemas pesados\u201d) separados por uma fronteira bem demarcada (a ESB e os servi\u00e7os).<\/strong><\/p>\n<p>Em uma an\u00e1lise simples, essa separa\u00e7\u00e3o em \u201cdois mundos\u201d deixa os sistemas dif\u00edceis de manter. Geralmente, altera\u00e7\u00f5es de neg\u00f3cio come\u00e7am nas aplica\u00e7\u00f5es \u201cconsumidoras\u201d e s\u00e3o desencadeadas \u201cAPI\u201d abaixo, geralmente travando nos \u201csistemas pesados\u201d que s\u00e3o \u201cmicro-monolitos\u201d.<\/p>\n<p><strong>Por todo o exposto, parece l\u00f3gico que, para acabar com a \u201csepara\u00e7\u00e3o dos mundos\u201d ou, pelo menos, reduzir as barreiras, o primeiro passo seja derrubar a fronteira! Ou seja, colocar fim no ESB.<\/strong><\/p>\n<p>As ESBs, ao longo do tempo, foram acumulando \u201cintelig\u00eancia demais\u201d, ficando respons\u00e1veis por estrat\u00e9gias de roteamento, transforma\u00e7\u00e3o (enriquecimento e mudan\u00e7a de formato) e at\u00e9 mesmo a aplica\u00e7\u00e3o de l\u00f3gica de neg\u00f3cio.<\/p>\n<p>O bom design de microsservi\u00e7os faz com que eles n\u00e3o utilizem mais a ESB como estrat\u00e9gia de comunica\u00e7\u00e3o. Toda a l\u00f3gica de neg\u00f3cio e t\u00e9cnicas de transforma\u00e7\u00e3o que, tradicionalmente, residem na ESB s\u00e3o transferidas para microsservi\u00e7os.<\/p>\n<h4><span id=\"Smart_endpoints_Dumb_Pipes\">Adotando &#8220;Smart endpoints &amp; Dumb Pipes&#8221;<\/span><\/h4>\n<p>A vis\u00e3o de \u201cderrubar\u201d o ESB usando microsservi\u00e7os, n\u00e3o \u00e9 nova, nem original. <a href=\"https:\/\/martinfowler.com\/articles\/microservices.html#SmartEndpointsAndDumbPipes\">Martin Fowler j\u00e1 descreveu essa estrat\u00e9gia anos atr\u00e1s<\/a>.<\/p>\n<p>Em uma arquitetura baseada em microsservi\u00e7os, a comunica\u00e7\u00e3o ocorre sempre por meio de protocolos leves ou por mecanismos mais \u201cpuros\u201d de mensageria (<em>dumb pipes<\/em>). Enquanto isso,\u00a0<em>routing\u00a0<\/em>e transforma\u00e7\u00e3o de mensagens acontecem atrav\u00e9s de microsservi\u00e7os (<em>smart endpoints<\/em>).<\/p>\n<p>Logo, o primeiro passo para \u201caliviar\u201d a estrutura seja substituir o combinado de ESB + servi\u00e7os por uma camada de microsservi\u00e7os.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-2733 aligncenter\" src=\"https:\/\/elemarjr.com\/arquiteturadesoftware\/wp-content\/uploads\/2021\/07\/goodbye_esb.png\" alt=\"\" width=\"740\" height=\"529\" srcset=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/07\/goodbye_esb.png 1037w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/07\/goodbye_esb-300x214.png 300w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/07\/goodbye_esb-1024x732.png 1024w, https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/07\/goodbye_esb-768x549.png 768w\" sizes=\"(max-width: 740px) 100vw, 740px\" \/><\/p>\n<p>Essa estrat\u00e9gia tem, obviamente, seus pr\u00f3s e contras. Sendo que o principal \u201ccontra\u201d, talvez, seja o aumento da complexidade para a governan\u00e7a. Por outro lado, a ado\u00e7\u00e3o dos microsservi\u00e7os no lugar da combina\u00e7\u00e3o ESB + Servi\u00e7os, aproxima a implementa\u00e7\u00e3o dos sistemas base das APIs e tende a reduzir o peso da infraestrutura.<\/p>\n<h4><span id=\"Fala_Conway\">Implica\u00e7\u00f5es para a organiza\u00e7\u00e3o dos times<\/span><\/h4>\n<p><strong>Toda mudan\u00e7a na estrutura de comunica\u00e7\u00e3o de um software implica em modifica\u00e7\u00f5es na estrutura de comunica\u00e7\u00e3o da empresa que o desenvolve.<\/strong> Logo, uma altera\u00e7\u00e3o como a que estamos propondo no software acaba mudando o <em>shape <\/em>da organiza\u00e7\u00e3o.<\/p>\n<p>Ter APIs, ESB+servi\u00e7os e sistemas legados leva a maior parte das organiza\u00e7\u00f5es a ter, pelo menos tr\u00eas categorias de time: 1) Desenvolvedores de API, 2) Especialistas em Integra\u00e7\u00e3o e 3) Desenvolvedores dos sistemas legados.<\/p>\n<p>A mudan\u00e7a da arquitetura proposta, substituindo ESB + servi\u00e7os, por microsservi\u00e7os tende a fundir os times de desenvolvimento de APIs com os especialistas de integra\u00e7\u00e3o simplificando as estruturas de comunica\u00e7\u00e3o da organiza\u00e7\u00e3o.<\/p>\n<h2>Transformando mon\u00f3litos em microsservi\u00e7os passo-a-passo<\/h2>\n<h4>Proxy HTTP: um primeiro passo seguro<\/h4>\n<p><strong>Um dos grandes desafios para migra\u00e7\u00e3o de sistemas monol\u00edticos para arquiteturas baseadas em microsservi\u00e7os \u00e9 o uso ampliado dos recursos de rede.\u00a0<\/strong>Por isso, em uma migra\u00e7\u00e3o gradual, um \u00f3timo primeiro passo \u00e9 assegurar que a infraestrutura utilizada pela organiza\u00e7\u00e3o n\u00e3o ser\u00e1 um empecilho.<\/p>\n<p><strong>Nesse contexto, quando um sistema monol\u00edtico exp\u00f5e funcionalidades atrav\u00e9s de APIs HTTP (ou qualquer outro protocolo formal de comunica\u00e7\u00e3o), \u00e9 recomend\u00e1vel que implementemos um\u00a0<em>proxy.\u00a0\u00a0<\/em><\/strong>Caber\u00e1 a ele interceptar todas as requisi\u00e7\u00f5es para esse servi\u00e7o, transmitindo-as para ele na sequ\u00eancia, aguardando seus retornos, para, ent\u00e3o, retornar para as aplica\u00e7\u00f5es clientes.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\" wp-image-2449 aligncenter\" src=\"https:\/\/www.eximia.co\/wp-content\/uploads\/sites\/2\/2020\/03\/api_proxy.png\" alt=\"\" width=\"345\" height=\"305\" \/><\/p>\n<p>Essa recomenda\u00e7\u00e3o, formalizada recentemente por\u00a0<a href=\"https:\/\/samnewman.io\/\">Sam Newman \u2013 uma das maiores autoridades mundiais em microsservi\u00e7os \u2013<\/a>\u00a0permite identificar muito cedo eventuais problemas de infraestrutura al\u00e9m de possuir custo m\u00ednimo, tanto t\u00e9cnico quanto para o neg\u00f3cio. Al\u00e9m disso, tem complexidade minimizada por sua alta reversibilidade.<\/p>\n<div class=\"card-insight\"><\/div>\n<p>Eventualmente, o\u00a0<em>proxy\u00a0<\/em>poder\u00e1 redirecionar requisi\u00e7\u00f5es para que sejam atendidas por um microsservi\u00e7o que implementar\u00e1 uma funcionalidade extra\u00edda do mon\u00f3lito. Tudo isso de maneira transparente tanto para as aplica\u00e7\u00f5es clientes quanto para a pr\u00f3pria aplica\u00e7\u00e3o monol\u00edtica que mant\u00e9m (por algum tempo) a implementa\u00e7\u00e3o original.<\/p>\n<div class=\"card-insight\"><\/div>\n<p>Finalmente, com o tempo, o\u00a0<em>proxy<\/em>\u00a0tamb\u00e9m poder\u00e1 evoluir e se adaptar melhor as necessidades das aplica\u00e7\u00f5es clientes, operando como uma API externa.<\/p>\n<h4 class=\"card-insight\">Segregando funcionalidades<\/h4>\nA transforma\u00e7\u00e3o de um sistema monol\u00edtico, potencialmente legado, para microsservi\u00e7os n\u00e3o \u00e9 atividade simples. Buscar uma \u201cprimeira implementa\u00e7\u00e3o perfeita\u201d poder\u00e1 atrapalhar mais do que ajudar. Al\u00e9m disso, \u00e9 grande o risco de paralisia por an\u00e1lise.\n<hr \/>\n<div class=\"card-insight\" style=\"background-color: #f0f0f0; width: 100%; padding: 35px 30px 30px 35px; border-radius: 5px 5px 5px 5px; margin-top: 30px; margin-bottom: 35px; font-size: 16px; box-shadow: 0px 4px 0px 0px #dddddd;\">\r\n<p style=\"font-size: 24px; font-weight:bold; line-height: 28px; font-family: Montserrat;\">Paralisia por an\u00e1lise<\/p>\r\n<\/p>\n<p>A paralisia de an\u00e1lise (ou paralisia por an\u00e1lise) descreve um processo individual ou de grupo quando a an\u00e1lise excessiva ou o pensamento excessivo de uma situa\u00e7\u00e3o podem fazer com que o movimento para a frente ou a tomada de decis\u00e3o se tornem &#8220;paralisados&#8221;, significando que nenhuma solu\u00e7\u00e3o ou curso de a\u00e7\u00e3o \u00e9 decidido. <strong>Uma situa\u00e7\u00e3o pode ser considerada muito complicada e uma decis\u00e3o nunca \u00e9 tomada, devido ao medo de que um problema potencialmente maior possa surgir. <\/strong><\/p>\n<p>Uma pessoa pode desejar uma solu\u00e7\u00e3o perfeita, mas pode temer tomar uma decis\u00e3o que possa resultar em erro, enquanto est\u00e1 no caminho para uma solu\u00e7\u00e3o melhor.<\/p>\n<p><\/div>\n<p><strong>Uma vez que se constate que a ado\u00e7\u00e3o de microsservi\u00e7os se justifica, quanto antes houver algo que se assemelhe a um microsservi\u00e7o em produ\u00e7\u00e3o, melhor.<\/strong>\u00a0Afinal, antes ser\u00e3o discutidos aspectos relacionados com a opera\u00e7\u00e3o, fazendo com que pr\u00e1ticas de\u00a0<em>DevOps<\/em>\u00a0aconte\u00e7am por necessidade e n\u00e3o por imposi\u00e7\u00e3o.<\/p>\n<p><img decoding=\"async\" class=\" wp-image-2457 aligncenter\" src=\"https:\/\/www.eximia.co\/wp-content\/uploads\/sites\/2\/2020\/03\/primeiro_microsservico.png\" alt=\"\" width=\"521\" \/><\/p>\n<p><strong><a href=\"https:\/\/samnewman.io\/\">Sam Newman<\/a>\u00a0indica que a primeira implementa\u00e7\u00e3o de um microsservi\u00e7o, em um processo de migra\u00e7\u00e3o, pode ser uma extra\u00e7\u00e3o simples de l\u00f3gica da aplica\u00e7\u00e3o monol\u00edtica, ainda compartilhando a mesma base de dados.\u00a0\u00a0<\/strong>Essa \u201cpreserva\u00e7\u00e3o\u201d do esquema original, ali\u00e1s, facilita a separa\u00e7\u00e3o dos processos de\u00a0<em>deploy\u00a0<\/em>e\u00a0<em>release\u00a0<\/em>permitindo que o microsservi\u00e7o seja \u201cdesligado\u201d com preju\u00edzos m\u00ednimos\u00a0<del>quando<\/del> se algo der errado.<\/p>\n<p><strong>Em um cen\u00e1rio ideal, o acionamento do microsservi\u00e7o ser\u00e1 responsabilidade de um\u00a0<em>proxy http\u00a0<\/em>que esteja interceptando todas as requisi\u00e7\u00f5es para o sistema.<\/strong>\u00a0Esse\u00a0<em>proxy<\/em>, por sua vez, dever\u00e1 condicionar a utiliza\u00e7\u00e3o do microsservi\u00e7o a uma ou mais\u00a0<em>feature toogles.\u00a0<\/em><\/p>\n<div class=\"card-insight\"><\/div>\n<p><strong>Por algum tempo, atividades de consulta sem modifica\u00e7\u00e3o de estado podem, inclusive, ocorrer simultaneamente no microsservi\u00e7o e no mon\u00f3lito. Dessa forma, ser\u00e1 poss\u00edvel verificar no\u00a0<em>proxy<\/em>\u00a0se a nova implementa\u00e7\u00e3o est\u00e1 em conformidade com a antiga.<\/strong><\/p>\n<blockquote><p>Voc\u00ea n\u00e3o apreciar\u00e1 o verdadeiro horror, dor e sofrimento dos microsservi\u00e7os at\u00e9 que esteja executando-os em produ\u00e7\u00e3o &#8211; Sam Newman<\/p><\/blockquote>\n<p>O esfor\u00e7o para colocar um microsservi\u00e7o em produ\u00e7\u00e3o antecipa e explicita as debilidades do sistema monol\u00edtico que se est\u00e1 evoluindo, sobretudo os pontos de acoplamento.<\/p>\n<h4 class=\"card-insight\">Isolando o banco de dados<\/h4>\n<p>\u00c9 plenamente razo\u00e1vel que uma primeira implementa\u00e7\u00e3o ainda acesse diretamente, por exemplo, a base de dados do sistema monol\u00edtico. Al\u00e9m disso, \u00e9 muito importante que o acesso ao microsservi\u00e7o aconte\u00e7a atrav\u00e9s de um <em>proxy http\u00a0<\/em>que possa redirecionar a carga em caso de problemas.<\/p>\n<div class=\"card-insight\">\n<p>O sucesso no cumprimento dessas recomenda\u00e7\u00f5es indica que j\u00e1 foram identificados e resolvidos eventuais limita\u00e7\u00f5es do ambiente, sobretudo na rede. Al\u00e9m disso, \u00e9 indicativo de que a organiza\u00e7\u00e3o j\u00e1 acumulou volume de experi\u00eancia para operar em sistemas cada vez mais distribu\u00eddos.<\/p>\n<\/div>\n<p>Essa estrat\u00e9gia, entretanto, tem como principal ponto negativo o grande acoplamento entre o mon\u00f3lito e o microsservi\u00e7o em fun\u00e7\u00e3o do acesso direto do banco de dados. Afinal, nenhum dos times (mon\u00f3lito e microsservi\u00e7o) poder\u00e1, por exemplo, fazer ajustes no\u00a0<em>schema\u00a0<\/em>das bases sem causar um problema em potencial para o outro.<\/p>\n<p><strong>O pr\u00f3ximo passo l\u00f3gico passa a ser, ent\u00e3o, \u201ctrocar d\u00edvidas t\u00e9cnicas caras por outras mais baratas\u201d. Come\u00e7ando por restringir acesso a base de dados do sistema monol\u00edtico!<\/strong>\u00a0Para que isso ocorra rapidamente, como se tempo e dinheiro fossem importantes,\u00a0 o time que mant\u00e9m o mon\u00f3lito dever\u00e1 fornecer uma API de consulta especificamente para atender as demandas do novo microsservi\u00e7o.<\/p>\n<p><img decoding=\"async\" class=\" wp-image-2601 aligncenter\" src=\"https:\/\/www.eximia.co\/wp-content\/uploads\/sites\/2\/2020\/03\/separando_bancos_de_dados.jpg\" alt=\"\" width=\"521\" \/><\/p>\n<p>Com o microsservi\u00e7o acessando dados exclusivamente atrav\u00e9s de uma API, sem ir diretamente ao banco de dados, o time que mant\u00e9m o mon\u00f3lito recupera a liberdade de promover modifica\u00e7\u00f5es de\u00a0<em>schema<\/em>\u00a0com chances menores de quebras. Eventualmente, o microsservi\u00e7o pode adotar, do seu lado, alguma estrat\u00e9gia de\u00a0<em>caching<\/em>\u00a0come\u00e7ando a materializar o que poder\u00e1 vir a ser, em futuro pr\u00f3ximo, seu pr\u00f3prio banco de dados.<\/p>\n<p>\u00c9 recomend\u00e1vel, que esse \u201cdirecionamento a API\u201d seja controlado, no microsservi\u00e7o, por uma\u00a0<em>feature toggle<\/em>. Ou seja, o microsservi\u00e7o deve poder redirecionar seu consumo novamente para a base de dados em casos de instabilidade.<\/p>\n<div class=\"card-insight\">\n<p>A partir da modelagem da API fornecida pelo mon\u00f3lito ser\u00e1 poss\u00edvel identificar 1) dados consumidos exclusivamente no mon\u00f3lito; 2) dados consumidos exclusivamente pelo novo microsservi\u00e7o e 3) Dados usados tanto no mon\u00f3lito quanto no microsservi\u00e7o. Em nossa experi\u00eancia, esse \u00e9 um exerc\u00edcio muito \u00fatil para identificar falhas evidentes de segrega\u00e7\u00e3o de responsabilidades.<\/p>\n<\/div>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-2611 aligncenter\" src=\"https:\/\/www.eximia.co\/wp-content\/uploads\/sites\/2\/2020\/03\/dados_monolito_microsservico.png\" alt=\"\" width=\"417\" height=\"321\" \/><\/p>\n<p><strong>Importante destacar que o que estamos recomendando aqui \u00e9 a troca uma d\u00edvida t\u00e9cnica mais cara (o acesso direto do microsservi\u00e7o ao banco de dados do mon\u00f3lito) por uma mais barata (aumento da rede).<\/strong>\u00a0Entretanto, esse \u00e9 um\u00a0<u>passo intermedi\u00e1rio<\/u>\u00a0importante, tanto para valida\u00e7\u00e3o da modelagem, como para confirmar a \u201csa\u00fade\u201d da infraestrutura.<\/p>\n<h4 class=\"card-insight\">Removendo implementa\u00e7\u00f5es em duplicidade<\/h4>\n<p>Uma vez que um time, transformando um mon\u00f3lito em microsservi\u00e7os, tenha efetivamente, 1) adotado pr\u00e1ticas e t\u00e9cnicas para desassociar os processos de\u00a0<em>deploy<\/em>\u00a0e\u00a0<em>release<\/em>; 2) colocado um \u201cprimeiro\u201d microsservi\u00e7o\u00a0<del>imperfeito<\/del>\u00a0em produ\u00e7\u00e3o e 3) controlado acessos a base de dados; devemos garantir que todo \u201cc\u00f3digo morto\u201d no mon\u00f3lito seja eliminado e garantir que os times t\u00e9cnicos estejam devidamente estruturados para suportar a evolu\u00e7\u00e3o.<\/p>\n<p>Na pr\u00e1tica,\u00a0<em>features\u00a0<\/em>originalmente providas pelo mon\u00f3lito, agora s\u00e3o providas pelo novo microsservi\u00e7o e devem ser removidas do sistema original o quanto antes. O momento ideal \u00e9 quando j\u00e1 houverem evid\u00eancias de que a nova implementa\u00e7\u00e3o j\u00e1 \u00e9 confi\u00e1vel o suficiente.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\" wp-image-2679 aligncenter\" src=\"https:\/\/www.eximia.co\/wp-content\/uploads\/sites\/2\/2020\/03\/extracting_microsservices-1.png\" alt=\"\" width=\"498\" height=\"386\" \/><\/p>\n<p>Para reduzir a chance de \u201cquebras\u201d em outros sistemas, entretanto, \u00e9 aconselh\u00e1vel n\u00e3o remover imediatamente o acesso \u00e0s\u00a0<em>features\u00a0<\/em>fornecido pelas APIs internas do mon\u00f3lito. No lugar disso, \u00e9 coerente modificar essas APIs para que consumam o novo microsservi\u00e7o.<\/p>\n<div class=\"card-insight\">\n<p>Importante indicar que todas as medidas adotadas at\u00e9 aqui aumentam consideravelmente a press\u00e3o sobre a rede. Entretanto, sistematicamente, est\u00e3o sendo superadas etapas de transforma\u00e7\u00e3o e a condi\u00e7\u00e3o atual \u00e9 intermedi\u00e1ria. Daqui para frente, as medidas t\u00e9cnicas v\u00e3o na dire\u00e7\u00e3o de reduzir essa press\u00e3o.<strong>\u00a0O processo de transforma\u00e7\u00e3o de um mon\u00f3lito em microsservi\u00e7os consiste na troca, cont\u00ednua e sistem\u00e1tica, de d\u00edvidas t\u00e9cnicas mais caras por outras mais baratas.<\/strong><\/p>\n<\/div>\n<p><strong>A press\u00e3o sobre a infraestrutura \u201cgrita\u201d pela ado\u00e7\u00e3o de pr\u00e1ticas efetivas de DevOps. N\u00e3o consideramos vi\u00e1vel, nem mesmo respons\u00e1vel, adotar microsservi\u00e7os sem reduzir as dist\u00e2ncias entre desenvolvimento e opera\u00e7\u00e3o.<\/strong><\/p>\n<p>Em termos organizacionais, a evolu\u00e7\u00e3o da arquitetura deve impactar na \u201cforma\u201d da \u00e1rea t\u00e9cnica. A mesma segmenta\u00e7\u00e3o que for aplicada nos sistemas deve estar sendo replicada naturalmente nos times que precisam buscar operar da maneira mais independente poss\u00edvel. Geralmente, a parte do time que mantinha o c\u00f3digo eliminado do mon\u00f3lito, agora deve se concentrar em manter o microsservi\u00e7o da forma mais independente poss\u00edvel.\u00a0<strong>\u00c9 fundamental que seja compreendido que se a estrutura de comunica\u00e7\u00e3o da organiza\u00e7\u00e3o n\u00e3o refletir, da forma mais direta poss\u00edvel, a estrutura do software que ela produz, o fracasso \u00e9 uma certeza!<\/strong><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\" wp-image-2692 aligncenter\" src=\"https:\/\/www.eximia.co\/wp-content\/uploads\/sites\/2\/2020\/03\/extracting_conway.png\" alt=\"\" width=\"521\" height=\"410\" \/><\/p>\n<p>Por outro lado,\u00a0<strong>quanto maior a rela\u00e7\u00e3o entre as estruturas de comunica\u00e7\u00e3o dos times t\u00e9cnicos e a estrutura de componentes do software sendo desenvolvido, maiores as chances de sucesso.<\/strong><\/p>\n<p>Todo acoplamento que persistir entre mon\u00f3lito e o novo microsservi\u00e7o se refletir\u00e1 em dificuldades de comunica\u00e7\u00e3o entre os times e isso \u00e9 \u00f3timo! Afinal, aumentar\u00e1 a urg\u00eancia por revis\u00f5es na arquitetura para \u201creduzir a dor\u201d. Toda a\u00e7\u00e3o ir\u00e1 refletir em iniciativas para reduzir a \u201cdepend\u00eancia\u201d, sobretudo para o deploy, e o impacto sobre o\u00a0<em>velocity<\/em>\u00a0\u00e9 potencialmente brutal.<\/p>\n<div class=\"card-insight\">\n<h4 class=\"card-insight\">Implementando observabilidade<\/h4>\n<p><strong>O racional de converter um mon\u00f3lito em microsservi\u00e7os \u00e9 transferir parte da complexidade do desenvolvimento para a opera\u00e7\u00e3o.<\/strong> Afinal, microsservi\u00e7os tem menos c\u00f3digo para entender, logo, desde que pouco acoplados, individualmente, s\u00e3o mais baratos de manter. Em compensa\u00e7\u00e3o, quanto mais processos para \u201coperar\u201d, mais complexa se torna a opera\u00e7\u00e3o. Da\u00ed a emerg\u00eancia para, em contextos com microsservi\u00e7os, adotar t\u00e9cnicas modernas compat\u00edveis com DevOps.<\/p>\n<p>Em produ\u00e7\u00e3o, quando diversos microsservi\u00e7os s\u00e3o necess\u00e1rios para atender requisi\u00e7\u00f5es ou demandas de processamento concorrentes, se amplificam os desafios de entender, justificar e solucionar problemas de performance ou falhas.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-634 size-full\" src=\"https:\/\/www.eximia.co\/wp-content\/uploads\/sites\/2\/2019\/07\/distributed_concurrency.png\" alt=\"\" width=\"254\" height=\"322\" \/><\/p>\n<p><strong>A ado\u00e7\u00e3o de t\u00e9cnicas convencionais de\u00a0<em>logging\u00a0<\/em>em cada microsservi\u00e7o torna a an\u00e1lise quase imposs\u00edvel, principalmente em sistemas sob stress, gerando mais ru\u00eddo do que sinal da comunica\u00e7\u00e3o.<\/strong>\u00a0Para agravar o problema, a ado\u00e7\u00e3o de microsservi\u00e7os tem o efeito colateral, geralmente desej\u00e1vel e positivo, da reestrutura\u00e7\u00e3o dos times de desenvolvimento, em grupos menores e mais segmentados. N\u00e3o \u00e9 raro, em condi\u00e7\u00f5es de stress, onde \u201calgo n\u00e3o vai bem\u201d, brotarem acusa\u00e7\u00f5es e fugas de responsabilidade.<\/p>\n<p><img decoding=\"async\" class=\"size-full wp-image-2692 aligncenter\" src=\"https:\/\/www.eximia.co\/wp-content\/uploads\/sites\/2\/2020\/03\/extracting_conway.png\" alt=\"\" width=\"521\" \/><\/p>\n<p>A solu\u00e7\u00e3o \u00e9 substituir t\u00e9cnicas convencionais de\u00a0<em>logging\u00a0<\/em>por abordagens mais sofisticadas.<strong>\u00a0Em sistemas distribu\u00eddos, como os baseados em microsservi\u00e7os, o\u00a0<em>tracing<\/em>\u00a0precisa ser consolidado.<\/strong>\u00a0Ou seja, \u00e9 necess\u00e1rio adotar t\u00e9cnicas e tecnologias que permitam verificar a hist\u00f3ria completa de cada requisi\u00e7\u00e3o e processamento, passando por todos os microsservi\u00e7os, mostrando claramente os intervalos de tempo transcorridos entre o in\u00edcio e o fim de cada intera\u00e7\u00e3o, de forma integrada e centralizada.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-791 size-large\" src=\"https:\/\/www.eximia.co\/wp-content\/uploads\/sites\/2\/2019\/07\/1_spans-1024x551.png\" alt=\"\" width=\"1024\" height=\"551\" \/><\/p>\n<p>H\u00e1 diversas iniciativas para produzir esse tipo de an\u00e1lise. Modernamente, h\u00e1 uma tend\u00eancia consolida\u00e7\u00e3o de padr\u00f5es e protocolos abertos que devem ser seguidos e implementados, como o\u00a0<a href=\"https:\/\/opentracing.io\/\">OpenTracing<\/a>.<\/p>\n<p>Bem implementadas, essas tecnologias permitem identificar rapidamente origens de lentid\u00e3o ou de falhas de processamento.<\/p>\n<p><strong>Manter sistemas distribu\u00eddos sem uso de ferramentas eficientes para observabilidade \u00e9 como dirigir, a noite, com chuva, em uma estrada cheia de curvas, com far\u00f3is apagados.<\/strong><\/p>\n<h4>Estrat\u00e9gias para iniciar a segrega\u00e7\u00e3o de dados<\/h4>\n<div class=\"elementor-element elementor-element-d507267 elementor-widget elementor-widget-theme-post-content is-mac\" data-id=\"d507267\" data-element_type=\"widget\" data-widget_type=\"theme-post-content.default\">\n<div class=\"elementor-widget-container\">\n<p><strong>Extrair um microsservi\u00e7o de um mon\u00f3lito implica, invariavelmente, na revis\u00e3o de como os dados s\u00e3o organizados e armazenados. Entretanto, \u00e9 razo\u00e1vel postergar mudan\u00e7as mais concretas at\u00e9 o \u00faltimo momento respons\u00e1vel.<\/strong><\/p>\n<p>At\u00e9 a estabiliza\u00e7\u00e3o funcional do sistema, \u00e9 recomend\u00e1vel que nenhuma altera\u00e7\u00e3o duradoura seja feita. Isso significa que os dados devem permanecer, majoritariamente, na base de dados do mon\u00f3lito. Dessa forma, fica mais vi\u00e1vel, inclusive, desvincular os processos de\u00a0<em>deploy\u00a0<\/em>e\u00a0<em>release\u00a0<\/em>do novo microsservi\u00e7o, direcionando o tratamento das requisi\u00e7\u00f5es ao mon\u00f3lito ou ao microsservi\u00e7o, atrav\u00e9s de\u00a0<em>feature toggles.<\/em><\/p>\n<p>Inicialmente, as demandas de acesso a dados do microsservi\u00e7o podem ser atendidas com consultas diretas a base de dados original. Entretanto, assim que poss\u00edvel, o fluxo de dados deve ocorrer por uma API interna, desenvolvida para esse prop\u00f3sito. Nesse caso, estrat\u00e9gias agressivas de\u00a0<em>caching\u00a0<\/em>, se bem implementadas, reduzem o impacto na rede.<\/p>\n<div class=\"card-insight\">\n<p>Com o tempo, entretanto, assim que for poss\u00edvel remover blocos de c\u00f3digo que implementam <em>features\u00a0<\/em>do mon\u00f3lito que foram desativadas em fun\u00e7\u00e3o do novo microsservi\u00e7o, ficar\u00e1 dif\u00edcil justificar o \u201ctelefone sem fio\u201d, sobretudo em fun\u00e7\u00e3o da interdepend\u00eancia desnecess\u00e1ria entre os sistemas e, mais grave, entre os times.<\/p>\n<\/div>\n<p>Assumindo o mon\u00f3lito e o microsservi\u00e7o como dois processos distintos, h\u00e1 dados que:<\/p>\n<ol>\n<li>continuam fazendo sentido apenas para o mon\u00f3lito;<\/li>\n<li>fazem sentido apenas para o microsservi\u00e7o;<\/li>\n<li>dados que s\u00e3o de uso nos dois contextos.<\/li>\n<\/ol>\n<hr \/>\n<p>A partir dessa classifica\u00e7\u00e3o, fica um pouco mais f\u00e1cil estabelecer estrat\u00e9gias para a segrega\u00e7\u00e3o de bases, promovendo isolamento adequado.<\/p>\n<h5 id=\"tratamento-de-dados-de-uso-exclusivo-do-monolito-ou-do-microsservico-5e95b9780cb21\"><span id=\"Tratamento_de_dados_de_uso_exclusivo_do_monolito_ou_do_microsservico\">Tratamento de dados de uso exclusivo do mon\u00f3lito ou do microsservi\u00e7o<\/span><\/h5>\n<p>Idealmente, a modifica\u00e7\u00e3o de dados no sistema acontece acompanhando a execu\u00e7\u00e3o dos processos da organiza\u00e7\u00e3o. Nesses casos, as interfaces com o usu\u00e1rio s\u00e3o naturalmente desvinculadas e os dados, associados ao microsservi\u00e7o ou ao mon\u00f3lito, se estes estiverem bem modelados, s\u00e3o \u201c<em>inputados<\/em>\u201d de forma independente.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\" wp-image-2852 aligncenter\" src=\"https:\/\/www.eximia.co\/wp-content\/uploads\/sites\/2\/2020\/04\/segregando_dados_0.jpg\" alt=\"\" width=\"568\" height=\"446\" \/><\/p>\n<p>H\u00e1, entretanto, cen\u00e1rios onde as interfaces \u201cacoplam\u201d a inclus\u00e3o de dados de interesse do mon\u00f3lito e do microsservi\u00e7o a uma \u00fanica opera\u00e7\u00e3o. Isso \u00e9 especialmente comum em sistemas grandes com \u201ctelas de cadastro\u201d gigantescas. Sempre que poss\u00edvel, o ideal seria \u201credefinir\u201d a experi\u00eancia do usu\u00e1rio conforme o processo. Entretanto, a adequa\u00e7\u00e3o da interface nem sempre est\u00e1 sob comando e controle dos times internos. Em cen\u00e1rios assim, o jeito \u00e9 desenvolver uma API externa que continue oferecendo a \u201cinterface unificada\u201d para os\u00a0<em>frontends,\u00a0<\/em>enquanto o controle da \u201csaga\u201d fica a cargo de uma camada de media\u00e7\u00e3o que orquestra as APIs internas.<\/p>\n<p><img decoding=\"async\" class=\"size-full wp-image-2848 aligncenter\" src=\"https:\/\/www.eximia.co\/wp-content\/uploads\/sites\/2\/2020\/04\/segregando_dados_1.jpg\" alt=\"\" width=\"568\" \/><\/p>\n<h5 id=\"tratamento-de-dados-de-compartilhado-pelo-monolito-e-pelo-microsservico-5e95b9780cbc9\"><span id=\"Tratamento_de_dados_de_compartilhado_pelo_monolito_e_pelo_microsservico\">Tratamento de dados compartilhados pelo mon\u00f3lito e pelo microsservi\u00e7o<\/span><\/h5>\n<p>Quando um dado \u00e9 relevante tanto para o mon\u00f3lito quanto para o microsservi\u00e7o, \u00e9 necess\u00e1rio identificar em qual contexto ele \u201cnasce\u201d. Deve ser nesse contexto que, por padr\u00e3o, o dado dever\u00e1 ficar armazenado. Em caso de d\u00favidas razo\u00e1veis, recomendamos que a op\u00e7\u00e3o padr\u00e3o seja gravar os dados no mon\u00f3lito.<\/p>\n<p>A disponibiliza\u00e7\u00e3o de dados de um contexto para outro pode acontecer de diferentes formas. A mais simples, \u00e9 atrav\u00e9s do fornecimento de uma API interna para consulta combinada, se poss\u00edvel, com alguma estrat\u00e9gia agressiva de\u00a0<em>caching.<\/em><\/p>\n<p>Invariavelmente, nesses cen\u00e1rios, \u00e9 relevante considerar a implementa\u00e7\u00e3o de modelos de atualiza\u00e7\u00e3o baseados em notifica\u00e7\u00f5es por eventos.<\/p>\n<h2><span id=\"Indicacoes_e_contraindicacoes\">Indica\u00e7\u00f5es e contraindica\u00e7\u00f5es<\/span><\/h2>\n<p>O estilo Microsservi\u00e7os<em>\u00a0<\/em>\u00e9 uma abstra\u00e7\u00e3o poderosa que autoriza o desenvolvimento de sistemas robustos e distribu\u00eddos, com \u00eanfase em reduzir o acoplamento, tanto no c\u00f3digo quanto para os times. Entretanto, como \u00e9 sempre o caso, n\u00e3o \u00e9 uma solu\u00e7\u00e3o \u201cbala de prata\u201d.<\/p>\n<p>A redu\u00e7\u00e3o do acoplamento n\u00e3o acontece &#8220;de gra\u00e7a&#8221;. H\u00e1 um bocado de implica\u00e7\u00f5es na estrutura da organiza\u00e7\u00e3o que podem tornar a ado\u00e7\u00e3o do estilo proibitiva. Se times monol\u00edticos n\u00e3o implementam microsservi\u00e7os, ent\u00e3o ser\u00e1 muito dif\u00edcil que um time pequeno o consiga.<\/p>\n<p>A segrega\u00e7\u00e3o de um sistema em microsservi\u00e7os tamb\u00e9m representa um grande desafio. Se feita de forma equivocada, comprometer\u00e1, pelo menos, a performance.<\/p>\n<h2><span id=\"TODO\">\/\/ TODO<\/span><\/h2>\n<p>Antes de avan\u00e7ar para o pr\u00f3ximo cap\u00edtulo, recomendo as seguintes reflex\u00f5es:<\/p>\n<ul>\n<li>Acoplamento \u00e9 um problema, hoje, para sua equipe?<\/li>\n<li>Que benef\u00edcios, para o neg\u00f3cio, podem ser destacados ao se desenvolver uma aplica\u00e7\u00e3o\u00a0<em>cloud native?<\/em><\/li>\n<\/ul>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"featured_media":2742,"parent":0,"comment_status":"open","ping_status":"closed","template":"","url":[],"sessoes":[59],"apendices":[],"capitulos":[47],"class_list":["post-2707","volume-1","type-volume-1","status-publish","has-post-thumbnail","hentry","sessoes-secao-3","capitulos-capitulo-3-6"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.6 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Projetando sistemas com microsservi\u00e7os \/ Cap\u00edtulo 14 v 1.0 - Manual do Arquiteto de Software<\/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:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/projetando-sistemas-com-microsservicos-capitulo-14-v-1-0\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Projetando sistemas com microsservi\u00e7os \/ Cap\u00edtulo 14 v 1.0 - Manual do Arquiteto de Software\" \/>\n<meta property=\"og:description\" content=\"Acoplamento \u00e9 a causa raiz de boa parte dos problemas relacionados a disponibilidade,\u00a0 manutenabilidade, performance e resili\u00eancia. Acoplamento n\u00e3o tratado \u00e9 fonte de custo tanto para o desenvolvimento quanto para a sustenta\u00e7\u00e3o de solu\u00e7\u00f5es. Conforme Conway, software com componentes acoplados \u00e9 resultado do trabalho de times acoplados. N\u00e3o raro, esses times tem &#8220;pontos de falha&#8221; [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/projetando-sistemas-com-microsservicos-capitulo-14-v-1-0\/\" \/>\n<meta property=\"og:site_name\" content=\"Manual do Arquiteto de Software\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/facebook.com\/eximiaco\" \/>\n<meta property=\"article:modified_time\" content=\"2024-01-11T21:07:38+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/07\/meggyn-pomerleau-lTuG-edPomA-unsplash.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1024\" \/>\n\t<meta property=\"og:image:height\" content=\"719\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:site\" content=\"@eximiaco\" \/>\n<meta name=\"twitter:label1\" content=\"Est. tempo de leitura\" \/>\n\t<meta name=\"twitter:data1\" content=\"27 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/projetando-sistemas-com-microsservicos-capitulo-14-v-1-0\/\",\"url\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/projetando-sistemas-com-microsservicos-capitulo-14-v-1-0\/\",\"name\":\"Projetando sistemas com microsservi\u00e7os \/ Cap\u00edtulo 14 v 1.0 - Manual do Arquiteto de Software\",\"isPartOf\":{\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/projetando-sistemas-com-microsservicos-capitulo-14-v-1-0\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/projetando-sistemas-com-microsservicos-capitulo-14-v-1-0\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/07\/meggyn-pomerleau-lTuG-edPomA-unsplash.jpg\",\"datePublished\":\"2021-07-12T01:16:23+00:00\",\"dateModified\":\"2024-01-11T21:07:38+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/projetando-sistemas-com-microsservicos-capitulo-14-v-1-0\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/projetando-sistemas-com-microsservicos-capitulo-14-v-1-0\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/projetando-sistemas-com-microsservicos-capitulo-14-v-1-0\/#primaryimage\",\"url\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/07\/meggyn-pomerleau-lTuG-edPomA-unsplash.jpg\",\"contentUrl\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/07\/meggyn-pomerleau-lTuG-edPomA-unsplash.jpg\",\"width\":1024,\"height\":719},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/projetando-sistemas-com-microsservicos-capitulo-14-v-1-0\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Volume 1\",\"item\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Projetando sistemas com microsservi\u00e7os \/ Cap\u00edtulo 14 v 1.0\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#website\",\"url\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/\",\"name\":\"Manual do Arquiteto de Software\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#organization\",\"name\":\"EximiaCo\",\"url\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/simbolo-eximiaco.jpg\",\"contentUrl\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/simbolo-eximiaco.jpg\",\"width\":150,\"height\":150,\"caption\":\"EximiaCo\"},\"image\":{\"@id\":\"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/facebook.com\/eximiaco\",\"https:\/\/x.com\/eximiaco\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Projetando sistemas com microsservi\u00e7os \/ Cap\u00edtulo 14 v 1.0 - Manual do Arquiteto de Software","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:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/projetando-sistemas-com-microsservicos-capitulo-14-v-1-0\/","og_locale":"pt_BR","og_type":"article","og_title":"Projetando sistemas com microsservi\u00e7os \/ Cap\u00edtulo 14 v 1.0 - Manual do Arquiteto de Software","og_description":"Acoplamento \u00e9 a causa raiz de boa parte dos problemas relacionados a disponibilidade,\u00a0 manutenabilidade, performance e resili\u00eancia. Acoplamento n\u00e3o tratado \u00e9 fonte de custo tanto para o desenvolvimento quanto para a sustenta\u00e7\u00e3o de solu\u00e7\u00f5es. Conforme Conway, software com componentes acoplados \u00e9 resultado do trabalho de times acoplados. N\u00e3o raro, esses times tem &#8220;pontos de falha&#8221; [&hellip;]","og_url":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/projetando-sistemas-com-microsservicos-capitulo-14-v-1-0\/","og_site_name":"Manual do Arquiteto de Software","article_publisher":"https:\/\/facebook.com\/eximiaco","article_modified_time":"2024-01-11T21:07:38+00:00","og_image":[{"width":1024,"height":719,"url":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/07\/meggyn-pomerleau-lTuG-edPomA-unsplash.jpg","type":"image\/jpeg"}],"twitter_card":"summary_large_image","twitter_site":"@eximiaco","twitter_misc":{"Est. tempo de leitura":"27 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/projetando-sistemas-com-microsservicos-capitulo-14-v-1-0\/","url":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/projetando-sistemas-com-microsservicos-capitulo-14-v-1-0\/","name":"Projetando sistemas com microsservi\u00e7os \/ Cap\u00edtulo 14 v 1.0 - Manual do Arquiteto de Software","isPartOf":{"@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#website"},"primaryImageOfPage":{"@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/projetando-sistemas-com-microsservicos-capitulo-14-v-1-0\/#primaryimage"},"image":{"@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/projetando-sistemas-com-microsservicos-capitulo-14-v-1-0\/#primaryimage"},"thumbnailUrl":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/07\/meggyn-pomerleau-lTuG-edPomA-unsplash.jpg","datePublished":"2021-07-12T01:16:23+00:00","dateModified":"2024-01-11T21:07:38+00:00","breadcrumb":{"@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/projetando-sistemas-com-microsservicos-capitulo-14-v-1-0\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/projetando-sistemas-com-microsservicos-capitulo-14-v-1-0\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/projetando-sistemas-com-microsservicos-capitulo-14-v-1-0\/#primaryimage","url":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/07\/meggyn-pomerleau-lTuG-edPomA-unsplash.jpg","contentUrl":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2021\/07\/meggyn-pomerleau-lTuG-edPomA-unsplash.jpg","width":1024,"height":719},{"@type":"BreadcrumbList","@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/projetando-sistemas-com-microsservicos-capitulo-14-v-1-0\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/"},{"@type":"ListItem","position":2,"name":"Volume 1","item":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/volume-1\/"},{"@type":"ListItem","position":3,"name":"Projetando sistemas com microsservi\u00e7os \/ Cap\u00edtulo 14 v 1.0"}]},{"@type":"WebSite","@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#website","url":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/","name":"Manual do Arquiteto de Software","description":"","publisher":{"@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-BR"},{"@type":"Organization","@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#organization","name":"EximiaCo","url":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/","logo":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#\/schema\/logo\/image\/","url":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/simbolo-eximiaco.jpg","contentUrl":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-content\/uploads\/2022\/04\/simbolo-eximiaco.jpg","width":150,"height":150,"caption":"EximiaCo"},"image":{"@id":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/facebook.com\/eximiaco","https:\/\/x.com\/eximiaco"]}]}},"_links":{"self":[{"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/volume-1\/2707","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/volume-1"}],"about":[{"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/types\/volume-1"}],"replies":[{"embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/comments?post=2707"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/media\/2742"}],"wp:attachment":[{"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/media?parent=2707"}],"wp:term":[{"taxonomy":"url","embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/url?post=2707"},{"taxonomy":"sessoes","embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/sessoes?post=2707"},{"taxonomy":"apendices","embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/apendices?post=2707"},{"taxonomy":"capitulos","embeddable":true,"href":"https:\/\/elemarjr.com\/livros\/arquiteturadesoftware\/wp-json\/wp\/v2\/capitulos?post=2707"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}