<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: TeixeiraJr</title>
    <description>The latest articles on DEV Community by TeixeiraJr (@teixeirajr).</description>
    <link>https://dev.to/teixeirajr</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F870194%2F7de2cdf3-2830-4aab-88c0-5798a0702448.jpg</url>
      <title>DEV Community: TeixeiraJr</title>
      <link>https://dev.to/teixeirajr</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/teixeirajr"/>
    <language>en</language>
    <item>
      <title>Os 12 fatores para um projeto web de excelência</title>
      <dc:creator>TeixeiraJr</dc:creator>
      <pubDate>Sat, 11 Jun 2022 02:41:51 +0000</pubDate>
      <link>https://dev.to/teixeirajr/os-12-fatores-para-um-projeto-web-de-excelencia-59ai</link>
      <guid>https://dev.to/teixeirajr/os-12-fatores-para-um-projeto-web-de-excelencia-59ai</guid>
      <description>&lt;h2&gt;
  
  
  O que são os 12 fatores para um projeto web de excelência
&lt;/h2&gt;

&lt;p&gt;Em projetos web, é comum um desenvolvedor novato (ou até mesmo experiente) acabe tendo dúvidas a respeito de como planejar a arquitetura de um software, muitas vezes por não conhecer todos os processos disponíveis como também por vícios de aprendizado que o acompanham na sua experiência profissional. Os &lt;em&gt;12 fatores&lt;/em&gt; trata dos requisitos mínimos necessários para que uma aplicação web seja compatível com escalonamento horizontal. Isto é, caso um sistema cumpra tais fatores, ele está minimamente compatível com um escalonamento eficiente, e caso não esteja, dificilmente será compativel com tal atividade de maneira funcional. Os &lt;em&gt;12 fatores&lt;/em&gt; foi proposto por &lt;a href="https://adamwiggins.com/"&gt;Adam Wiggins&lt;/a&gt;, cofundador do &lt;a href="https://www.heroku.com/"&gt;Heroku&lt;/a&gt; e seu artigo a respeito dos &lt;a href="https://12factor.net/"&gt;12 fatores&lt;/a&gt; (&lt;em&gt;referência direta para a criação deste artigo&lt;/em&gt;) necessários em aplicações web é bem difundido e serve muito bem como referência e base de estudos para os interessados no processo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Vantagens da metodologia
&lt;/h2&gt;

&lt;p&gt;Tal metodologia pode ser aplicada para qualquer sistema web, em qualquer linguagem e utilizando qualquer framework. Os principais motivos para se aplicar os 12 fatores em uma aplicação web são:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Automatizar a configuração inicial do projeto, facilitando o ingresso de novos desenvolvedores nos projetos;&lt;/li&gt;
&lt;li&gt;Garantir a portabilidade do software em diversos sistemas operacionais, isto é, gerenciar todas as dependências de forma que não dependa diretamente de nenhum SO;&lt;/li&gt;
&lt;li&gt;Minimizar o esforço de implementação e manutenção de sistemas hospedados em serviços em nuvem, reduzindo o custo de administração dos sistemas;&lt;/li&gt;
&lt;li&gt;Promover o deploy contínuo da aplicação, evitando o acumulo de modificações e a necessidade de atualizações fora de expediente. Todo o processo de deploy ocorre de tal maneira que pode ser executado continuamente e sem prejudicar o ambiente de produção;&lt;/li&gt;
&lt;li&gt;Garantir a escalabilidade eficiente do sistema, sem perda de dados, e sem necessitar de modificações na arquitetura do sistema.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Os doze fatores
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Base de código
&lt;/h3&gt;

&lt;p&gt;Todo o código fonte de uma aplicação &lt;strong&gt;DEVE&lt;/strong&gt; estar em uma ferramenta de versionamento de código, o que na prática nos tempos modernos convergem para a tecnologia mais eficiente, o &lt;strong&gt;GIT&lt;/strong&gt;. Seja no github, ou gitlab, azure devops ou qualquer outra ferramenta que utilize o git, o sistema deve estar disponível sempre em um &lt;em&gt;repo&lt;/em&gt; externo. Seja em um único repositório com todo o sistema ou em vários (neste caso, um sistema distribuído), o importante é que todos os desenvolvedores tenham uma cópia dessa aplicação e que façam deploy frequentemente na mesma, de modo que os outros desenvolvedores tenham acesso a aquilo que foi feito. Também não se deve ter 2 aplicações utilizando a mesma base de código, nesse caso, deve-se disponibilizar &lt;em&gt;libs&lt;/em&gt; para que ambos os sistemas possam utilizá-la por meio de gerenciamento de dependências.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--KybMkxmt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://upload.wikimedia.org/wikipedia/commons/e/e0/Git-logo.svg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KybMkxmt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://upload.wikimedia.org/wikipedia/commons/e/e0/Git-logo.svg" alt="git" width="272" height="114"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Dependências
&lt;/h3&gt;

&lt;p&gt;Uma aplicação não deve confiar na existência implícita de pacotes no sistema, isto é, toda e qualquer dependência do sistema deve estar no seu &lt;em&gt;manifesto de dependências&lt;/em&gt;. Um bom exemplo de tal arquivo seria o &lt;em&gt;package.json&lt;/em&gt; do Nodejs, onde o mesmo deve conter todas as dependências do sistema, de forma que quando um novo desenvolvedor deve ser capaz de configurar todo o sistema apenas com o arquivo de manifesto com um &lt;em&gt;npm install&lt;/em&gt; no diretório do mesmo. Isso garante também que o sistema poderá ser executado nos mais diversos sistemas operacionais.&lt;/p&gt;

&lt;h3&gt;
  
  
  Configuração
&lt;/h3&gt;

&lt;p&gt;Na configuração, é comum (e esperado) que os mais diversos ambientes (desenvolvimento, homologação, produção, entre outros) tenham diferentes &lt;em&gt;configurações&lt;/em&gt;, como nomes de host, credenciais de acesso, configurações dos bancos de dados, etc. Deve-se garantir a &lt;strong&gt;separação de código e configuração&lt;/strong&gt;. Um bom exemplo de tal prática são os arquivos &lt;strong&gt;.env&lt;/strong&gt;, que armazenam as variáveis de ambientes e permitem a correta conexão dos ambientes de dev, homolog e pro, além das credenciais do banco de dados, sem que nada esteja diretamente escrito no código. Uma boa prova de fogo de tal conceito é validar se o código poderia ser exposto ao público sem comprometer nenhuma variável sensível. Os arquivos que armazenam &lt;em&gt;env vars&lt;/em&gt; devem ser ignorados pelo versionamento do git.&lt;/p&gt;

&lt;h3&gt;
  
  
  Serviço de apoio
&lt;/h3&gt;

&lt;p&gt;Todos os serviços de apoio da aplicação (bancos de dados como MYSQL ou MONGODB), serviços de mensageria como RabbitMQ, entre outros, devem ser consumidos como se fossem aplicações externas, acessados por meio de URLs ou outra forma de localização e credenciamento. Deve-se ser possível trocar de um banco de dados próprio por um serviço de terceiros (como o RDS da amazon) sem que qualquer alteração de código seja feita, apenas trocando as credenciais de acesso dos mesmos. Um bom método para identificar o cumprimento desse passo é transformar todos os elementos da aplicação em containers, já que os mesmos devem se comunicar como serviços externos. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--F4jjxUP0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fiuxt0bwvme20gesk87e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--F4jjxUP0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fiuxt0bwvme20gesk87e.png" alt="External services" width="880" height="481"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Build, release, run
&lt;/h3&gt;

&lt;p&gt;Um deploy em uma aplicação se dá em 3 estágios:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Build&lt;/strong&gt;, que é onde o repositório é convertido em uma imagem (semelhante ao que o Docker faz ao criar imagens), onde o mesmo obtêm todas as dependências do projeto;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Release&lt;/strong&gt;, que é onde o build é enviado a um servidor e é obtido todas as configurações necessárias para a execução;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Run&lt;/strong&gt;, que é a inicialização de todos os processos para a disponibilização dos serviços para os usuários.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--VmMwB2z_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://12factor.net/images/release.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VmMwB2z_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://12factor.net/images/release.png" alt="build release run" width="560" height="233"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A metodologia de 12 fatores dita que tais estágios devem ser totalmente separados, impedindo a alteração de códigos em produção, já que seria impossível propagar tais mudanças aos estágios anteriores de build e release. Toda alteração deve ser feita inicialmente no repositório para por fim ter seu processo de build, release e run. A maioria das ferramentas de deploy oferecem mecanismos para gestão de lançamentos, bem como para retorno a &lt;em&gt;builds&lt;/em&gt; anteriores estáveis em caso de problemas em produção&lt;/p&gt;

&lt;h3&gt;
  
  
  Processos
&lt;/h3&gt;

&lt;p&gt;A aplicação web deve obrigatoriamente ser &lt;strong&gt;stateless&lt;/strong&gt;, isto é, sem estado. A mesma não deve armazenar nenhum dado que precise ser persistente na aplicação. Na prática, todo dado que trafega na mesma deve ser tratado como um &lt;em&gt;cache&lt;/em&gt; temporário. Um bom exeplo disto seria uma aplicação rodando em um container Docker que armazena seus uploads em uma pasta dentro do próprio sistema chamada &lt;em&gt;uplodas&lt;/em&gt;, onde basta o container ter qualquer problema e ser desativado que todos os uploads feitos na aplicação serão perdidos. Tais dados deveriam estar armazenadosem algum serviço de cloud de armazenamento de arquivos (AWS S3, Google Cloud Storage) ou até mesmo em um &lt;em&gt;volume persistente&lt;/em&gt;, desde que fora do container, ou no caso de dados em algum banco de dados (MYSQL, MONGODB, entre outros),  O container acessa qualquer destes serviços sem armazená-lo em sua build, garantindo que o mesmo será &lt;em&gt;read only&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RRumlVhz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://docs.docker.com/storage/images/types-of-mounts.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RRumlVhz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://docs.docker.com/storage/images/types-of-mounts.png" alt="persistent volume" width="501" height="255"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Vínculo de portas
&lt;/h3&gt;

&lt;p&gt;Como regra, toda aplicação web deve exportar o HTTP como um serviço através de uma porta, e escutar as requisições que chegam na mesma. Tal aplicação terá poder de servir outro app ou receber requisições por meio dessas portas sem a necessidade de um serviço como o NGINX ou o Apache, apesar da utilização dos mesmos nos sistemas para a configuração de &lt;em&gt;virtual hosts&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Concorrência
&lt;/h3&gt;

&lt;p&gt;A aplicação deve ser compatível com escalonamento horizontal. Como consequência dos fatores anteriores, a aplicação web deve ser independente de qualquer estado do sistema operacional e é organizado como builds, é possível escalar o sistema de forma que mais de uma aplicação em paralelo possa receber processos e dividir o trabalho executado, geralmente por meio de um &lt;em&gt;load balancer&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--yEbQ7LcH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.cloud4u.com/upload/medialibrary/5a6/0_CCK15OF3DizmOITk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--yEbQ7LcH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://www.cloud4u.com/upload/medialibrary/5a6/0_CCK15OF3DizmOITk.png" alt="load balancer" width="880" height="431"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Descartabilidade
&lt;/h3&gt;

&lt;p&gt;Para facilitar o escalonamento, aumentar a velocidade de deploy e mudanças nas &lt;em&gt;configurações&lt;/em&gt; e dar maior solidez no sistema, aplicações web devem ser &lt;strong&gt;descartáveis&lt;/strong&gt;, isto é, possa ser parada ou reiniciada a qualquer momento sem qualquer perda de dados ou problema com dependências. Isso garante que o processo de deploy de uma nova release, rollback para imagens anteriores, ou a criação de novos container em caso de escalabilidade horizontal seja feita de maneira simples e prática, sem a necessidade de intervenções manuais.&lt;/p&gt;

&lt;h3&gt;
  
  
  Paridade entre desenvolvimento e produção
&lt;/h3&gt;

&lt;p&gt;Sistemas ineficientes geralmente detém de diferenças consideráveis entre seus ambientes, como por exemplo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Demoras semanais para o código do desenvolvedor chegar a produção;&lt;/li&gt;
&lt;li&gt;Desenvolvedores commitam o código e gerentes de projeto fazem o deploy dele;&lt;/li&gt;
&lt;li&gt;Diferença entre bancos de dados, sistemas operacionais entre outros fatores do ambiente de desenvolvimento para o de homologação e produção.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Em tese, deve-se manter os ambientes de desenvolvimento, homologação e produção o mais similares possível, garantindo a rapidez e eficiência e permitindo a utilização de &lt;em&gt;continuos deployment&lt;/em&gt;, diminuindo muito a lacuna entre os ambientes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--tnvY_6lA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gj8p8022mr136p455fd7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tnvY_6lA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gj8p8022mr136p455fd7.png" alt="Tabela comparativa" width="867" height="187"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Utilizando &lt;em&gt;continuos deployment&lt;/em&gt;, evita-se de ter a espera muitas vezes mensal ou semanal para fechar-se releases, para aí sim enviar para homologação ou produção. Tal metodologia permite que, ao ser enviado um commit ao repositório, o ambiente automaticamente realize uma série de testes automáticos (caso implementado), garantindo a solidez do sistema, e permitindo a configuração automática do envio de tais alterações para ambientes de homologação, que podem ser validados ou não de forma manual para serem enviados à produção.&lt;/p&gt;

&lt;h3&gt;
  
  
  Logs
&lt;/h3&gt;

&lt;p&gt;Logs são, em essência, um formato de texto com um evento por linha (&lt;em&gt;alguns podem ocupar mais que isso&lt;/em&gt;), onde temos um fluxo de eventos sendo apresentados continuamente durante a execução de uma aplicação. Os 12 fatores dita que todos os logs de uma aplicação devem ser enviados para o &lt;strong&gt;stdout&lt;/strong&gt;, onde os mesmos podem ser capturados e apresentados utilizando ferramentas externas via &lt;strong&gt;tail&lt;/strong&gt;. Um bom exemplo de tal fenômeno seria uma aplicação rodando em Docker cujo qual seja possível acessar os logs do mesmo via algum serviço como o &lt;em&gt;Papertrail&lt;/em&gt; e ser visualizado sem a necessidade de consumí-los diretamente do container.&lt;/p&gt;

&lt;h3&gt;
  
  
  Processos Administrativos
&lt;/h3&gt;

&lt;p&gt;Em aplicações web, é comum a necessidade da execução de algumas tarefas administrativas, como por exemplo rodar uma &lt;em&gt;migration&lt;/em&gt; de um banco de dados, rodar scripts para execuções de tarefas rotineiras, entre outros. Em uma aplicação 12 fatores, deve-se criar um ambiente idêntico ao da aplicação, onde ao rodar os comandos necessários, as devidas alterações sejam executadas sem a necessidade das mesmas concorrerem com as requisições dos usuários comum. Tal procedimento pode ser automatizado, já que existem ferramentas para quase todos os tipos de tarefas administrativas. Um bom exemplo seria uma aplicação rodando em docker onde fosse necessáŕia alguma intervenção. Neste caso, criamos outro container docker idêntico ao original (onde o mesmo não recebe requisições, ou seja, fora do &lt;em&gt;load balancer&lt;/em&gt;), executamos as devidas tarefas e após isso excluimos o mesmo, não comprometendo o funcionamento do outro Docker em produção. Eventualmente se necessário, criamos outra imagem docker com as alterações e excluimos a antiga, garantindo a continuidade do deploy e do funcionamento da aplicação.&lt;/p&gt;

&lt;p&gt;Por fim, conclui-se que uma aplicação que atenda os 12 fatores terá uma excelente qualidade de construção, facilidade para escalar horizontalmente e simplicidade para se executar deploys. Associado a testes automatizados bem escritos, integração contínua associada a uma ferramenta baseada em git que permita builds automatizados e a execução de tais testes, com certeza tem-se um software com ótima qualidade de escrita.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>beginners</category>
      <category>webdev</category>
      <category>devops</category>
    </item>
    <item>
      <title>Principais tipos de arquitetura de software - Monólitos, serviços e microsserviços</title>
      <dc:creator>TeixeiraJr</dc:creator>
      <pubDate>Thu, 09 Jun 2022 02:24:23 +0000</pubDate>
      <link>https://dev.to/teixeirajr/principais-tipos-de-arquitetura-de-software-monolitos-servicos-e-microsservicos-5751</link>
      <guid>https://dev.to/teixeirajr/principais-tipos-de-arquitetura-de-software-monolitos-servicos-e-microsservicos-5751</guid>
      <description>&lt;h2&gt;
  
  
  Arquitetura de software
&lt;/h2&gt;

&lt;p&gt;Quando iniciamos em qualquer carreira na área de tecnologia, principalmente como desenvolvedor web, é comum se deparar com diversos sistemas construídos de maneiras distintas que pode confundir quem está iniciando. Por ser uma área em que a todo momentos novas tecnologias e métodos são desenvolvidos e aprimorados, é importante conhecer ao menos as principais arquiteturas que dão origem a maior parte dos softwares em funcionamento.&lt;/p&gt;

&lt;p&gt;Dentre as principais metodologias utilizadas, 3 delas se destacam, que seriam os sistemas &lt;strong&gt;monolíticos&lt;/strong&gt;, sistemas em &lt;strong&gt;camadas&lt;/strong&gt; ou &lt;strong&gt;MVC&lt;/strong&gt; e sistemas em &lt;strong&gt;microsserviços&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sistemas monolíticos
&lt;/h2&gt;

&lt;p&gt;Geralmente utilizado em tecnologias mais antigas, os sistemas monolíticos trazem todas as suas funcionalidades centralizadas em uma grande aplicação (&lt;em&gt;perceba que o termo 'monolítico' se refere a um elemento construído em um só bloco&lt;/em&gt;), isto é, todas as camadas da solução se encontram em apenas um código fonte em que o mesmo detém de uma alta dependência interna. Geralmente o mesmo é responsável por a parte visual na tela do usuário (&lt;strong&gt;frontend&lt;/strong&gt;), na manipulação, lógica e processamento das informações (&lt;strong&gt;backend&lt;/strong&gt;) e inserção e leitura dos dados na base de dados.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--VfY5OBzn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/poalmzdgniegch3spoz2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VfY5OBzn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/poalmzdgniegch3spoz2.png" alt="monolithic" width="880" height="253"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dentre as principais vantagens de se utilizar sistemas monolíticos, estão:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Facilidade inicial no desenvolvimento do sistema, enquanto o nível de complexidade do sistema for baixo;&lt;/li&gt;
&lt;li&gt;Facilidade de entender o código, já que o mesmo se encontra todo em um só lugar;&lt;/li&gt;
&lt;li&gt;Eficiente para validação inicial de idéias, onde não se está bem definidos como o software vai funcionar, evitando integrações complexas em fase experimental;&lt;/li&gt;
&lt;li&gt;Baixa integração, onde não será necessário integrar módulos distintos, já que tudo se integra internamente.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dentre as principais desvantagens de tal arquitetura, temos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ao aumentar a complexidade do sistema, torna-se bem mais complexo a manutenção do mesmo, onde ao mexer em uma parte do sistema, pode-se instabilizar todo o sistema;&lt;/li&gt;
&lt;li&gt;Difícil escalabilidade, onde caso seja necessário o incremento de recursos (&lt;em&gt;processamento, memória, etc&lt;/em&gt;), é necessário disponibilizar máquina para todo o sistema elevando desnecessariamente o custo, onde quase sempre o gargalo de performance ocorre apenas em alguns trechos de código;&lt;/li&gt;
&lt;li&gt;Emprego de uma única linguagem, pois ao ser definido a linguagem inicial, torna-se necessário o emprego da mesma em todo o sistema, inclusive em trechos cujo qual a mesma não tem performance adequadas;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Portanto, a arquitetura monolítica se mostra vantajosa em sistemas de baixa complexidade e sem perspectivas de implementações de features complexas no futuro, ou até mesmo como forma de validar como um sistema irá funcionar sem a necessidade de no momento inicial de validação da idéia seja necessário a implementação de arquiteturas complexas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sistemas MVC
&lt;/h2&gt;

&lt;p&gt;Sistemas utilizando a arquitetura MVC tem por principal vantagem separar o software em camadas, onde cada uma destas se torna responsável por executar tarefas específicas relativas a um sistema. Na arquitetura &lt;strong&gt;MVC&lt;/strong&gt;, temos a camada &lt;strong&gt;model&lt;/strong&gt;, responsável por toda a lógica interna do sistema cujo qual resolve os problemas propostos pela aplicação e controla o comportamento dos dados por meio de funções. a camada &lt;strong&gt;view&lt;/strong&gt; é responsável por apresentar toda a interface do lado do cliente, renderizando botões, quadros, tabelas, gráficos, imagens e qualquer recurso em que seja necessário que o usuário interaja, ou seja, é o responsável por renderizar a página. Por fim, temos a &lt;strong&gt;controller&lt;/strong&gt;, cujo qual tem o papel de mediar as requisições feitas na &lt;em&gt;view&lt;/em&gt;, entregá-las à &lt;em&gt;model&lt;/em&gt; e devolver a resposta ao usuário, padronizando tal comunicação de maneira eficiente para que ambos os serviços funcionem corretamente.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--8EH265mq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/j3czvlja4peex97bdi7r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8EH265mq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/j3czvlja4peex97bdi7r.png" alt="mvc" width="496" height="343"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dentre as principais vantagens do padrão MVC, temos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Separação do sistema em parte lógica e visual, onde é possível que mais de um desenvolvedor trabalhe de forma independente em cada uma das áreas (&lt;em&gt;backend e frontend&lt;/em&gt;), sem que um frontend precise lidar com o backend e vice e versa;&lt;/li&gt;
&lt;li&gt;Permite uma melhor apresentação dos dados, já que um valor que vem do backend pode ser apresentado de diversas formas no frontend, sem comprometer o dado em si;&lt;/li&gt;
&lt;li&gt;Código mais organizado, onde cada camada faz sua função de maneira independente, tornando bem mais fácil entender como o software foi construído e testá-lo de maneira mais eficaz;&lt;/li&gt;
&lt;li&gt;Aumento da segurança do sistema, já que a camada &lt;em&gt;controller&lt;/em&gt; trata todos os dados antes dos mesmos chegarem na &lt;em&gt;model&lt;/em&gt;, diminuindo muito a possibilidade de problemas por conta de dados incorretos ou ausentes, podendo até mesmo utilizar-se de &lt;strong&gt;middlewares&lt;/strong&gt; para tais validações.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;já entre as principais desvantagens, temos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Demanda um tempo relativamente maior para o desenvolvimento, em relação a um sistema monolítico;&lt;/li&gt;
&lt;li&gt;Necessita de profissionais de frontend e backend para seu correto funcionamento, aumentando a demanda por desenvolvedores especializados;&lt;/li&gt;
&lt;li&gt;Necessita de uma infraestrutura maior em relação a sistemas monolíticos, tratando-se de aplicações simples&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;É muito fácil ignorar as desvantagens de tal arquitetura em relação as outras disponíveis, já que existem frameworks que facilitam muito o desenvolvimento web, tornando muito vantajoso a utilização de tal modelo na grande maioria dos casos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Microsserviços
&lt;/h2&gt;

&lt;p&gt;Sistemas distribuídos em microsserviços são em essência, várias aplicações rodando de forma independentes (*&lt;em&gt;inclusive sem compartilhamento de memória&lt;/em&gt;), muitas vezes até mesmo rodando em hosts distintos, em que, ao serem integrados por meio de comunicações externas, geram funcionalidades completas. Vários módulos são separados em processos distintos, cada um executando uma parte específica de um todo, onde não há mais possibilidade de um módulo acesse qualquer recurso interno de outro módulo, sendo possível apenas a comunicação através das portas expostas dos demais. Nesse modelo, pode-se imaginar pequenas aplicações rodando em paralelo, onde uma pode requisitar outra a qualquer momento, e desde que a requisição esteja correta, tais aplicações se comunicam entre si enviando e recebendo requisições de forma a resolver o problema que o software se propõe solucionar.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--y22BREIr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jfc5yo8yg4kb6bb3wfz0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--y22BREIr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jfc5yo8yg4kb6bb3wfz0.png" alt="microsservices" width="776" height="525"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dentre as principais vantagens da arquitetura em microsserviços, temos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Como os microsserviços são independentes, a manutenção do sistema se torna mais eficiente, já que ao modificar um dos serviços, não ocorre efeitos colaterais nos demais;&lt;/li&gt;
&lt;li&gt;A possibilidade de utilização de várias tecnologias em um único sistema, pois como os microsserviços são independentes e se comunicam atráves de interfaces expostas, desde que as requisições sejam feitas corretamente, nada impede um microsserviço de login em nodeJS se comunicar com um sistema que manipula muitos dados em Python, que se comunica com um sistema de transações de alta performance em Golang. Utilizando microsserviços, pode-se extrair o melhor de cada tecnologia maximizando a performance do sistema;&lt;/li&gt;
&lt;li&gt;A diminuição da possibilidade de falhas do sistema, pois se um dos microsserviços cair, apenas as funcionalidades que dependam do mesmo serão afetadas, não comprometendo o restante do sistema. Além da possibilidade de se executar mais de um microsserviço em paralelo (&lt;em&gt;escalonamento horizontal&lt;/em&gt;) por meio de pods, onde os mesmos nem precisam estar no mesmo ambiente, garantindo que ao menos um deles estará online para suprir a demanda de solicitações.&lt;/li&gt;
&lt;li&gt;Simplicidade dos microsserviços, já que cada um deles irá resolver problemas específicos, tornando o código simples e relativamente fácil de se manter;&lt;/li&gt;
&lt;li&gt;A possibilidade de escalonamento de maneira eficiente, já que torna-se possível replicar microsserviços específicos quantas vezes forem necessárias para suprir demandas específicas por um tipo de serviço (por meio de pods em Kubernetes), sem a necessidade de escalar de maneira igualitária os outros microsserviços menos requisitados.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Porém, como desvantagem desta arquitetura, temos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A necessidade de integração em funcionalidades simples, já que ao criar um novo microsserviço o mesmo precisa ter toda uma interface de integração para se comunicar com os demais;&lt;/li&gt;
&lt;li&gt;Uma maior demanda técnica, pois é necessário um amplo conhecimento em frontend, backend e devops, sem contar a complexidade da comunicação entre os microsserviços;&lt;/li&gt;
&lt;li&gt;Alta complexidade da arquitetura, tornando-se inviável em aplicações simples e com pouca demanda, já que o gerenciamento de tal arquitetura é altamente complexo para tais situações. Geralmente se utiliza tal arquitetura quando um sistema se torna complexo a ponto de dificultar sua manutenção, ou quando se espera uma demanda muito alta em uma nova aplicação e necessita-se utilizar de escalonamento horizontal para otimizar os custos com infraestrutura.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>beginners</category>
      <category>microservices</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Como criar um banco de dados mariaDb com docker</title>
      <dc:creator>TeixeiraJr</dc:creator>
      <pubDate>Thu, 02 Jun 2022 01:02:20 +0000</pubDate>
      <link>https://dev.to/teixeirajr/como-criar-um-banco-de-dados-mysql-com-docker-1nc4</link>
      <guid>https://dev.to/teixeirajr/como-criar-um-banco-de-dados-mysql-com-docker-1nc4</guid>
      <description>&lt;h2&gt;
  
  
  Em quais situações utiliza-se Docker para banco de dados ?
&lt;/h2&gt;

&lt;p&gt;Neste post, iremos demonstrar passo a passo como criar um banco de dados mariaDb utilizando docker.&lt;br&gt;
Na grande maioria dos casos, não é recomendado a conteinerização de bancos de dados, por diversos motivos, como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Não é necessário um escalonamento automático da grande maioria dos bancos de dados,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Apesar das recentes evoluções do Docker, o mesmo ainda não lida bem com as cargas de trabalho oriundas das consultas e inserções dos bancos de dados,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Caso não seja configurado um volume em host (isto é, fora do container) e o mesmo for excluído, os dados armazenados no mesmo serão destruídos,&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Existem serviços específicos que lidam de uma forma muito melhor com banco de dados, como o RDS da AWS, diminuindo a complexidade do gerenciamento dos bancos que muitos devs sentem dificuldade.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Então, por qual motivo a criação de bancos de dados em docker seria interessante? Simples, a prática é muito boa para ambientes de &lt;strong&gt;desenvolvimento&lt;/strong&gt;. Criando um container em docker, é removida a complexidade de gerenciamento da mesma facilitando muito o processo de desenvolvimento local.&lt;/p&gt;
&lt;h2&gt;
  
  
  Como criar um banco de dados em container
&lt;/h2&gt;

&lt;p&gt;Inicialmente, é necessário que tenhamos o docker e o docker compose instalados, caso não tenha, siga o passo a passo da &lt;a href="https://docs.docker.com/engine/install/"&gt;documentação&lt;/a&gt; de acordo com o seu sistema operacional.&lt;/p&gt;

&lt;p&gt;Com o Docker instalado, iremos criar um arquivo chamado docker-compose.yml para parametrizarmos a criação do Docker do banco facilitando a criação da imagem e do container. Segue um exemplo do arquivo yml utilizando uma imagem mariaDb:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;version: '3.4'

services:
  mariadb:
    image: mariadb:10.2
    environment:
      MYSQL_ROOT_PASSWORD: 'mypassword'
      MYSQL_DATABASE: 'mydatabasename'
      MYSQL_USER: 'mydatabaseuser'
      MYSQL_PASSWORD: 'mydatabasepassword'
    ports:
      - 3306:3306

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Com isto, temos um arquivo yml que irá criar uma instância &lt;strong&gt;Mariadb&lt;/strong&gt;, utilizando a imagem &lt;strong&gt;10.2&lt;/strong&gt;, com as credenciais configuradas no &lt;strong&gt;enviroment&lt;/strong&gt; acessado pela porta &lt;strong&gt;3306&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Após a criação do arquivo, acesse através do terminal o diretório do mesmo e rode o comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker-compose up
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Na primeira criação de imagem do Docker, o mesmo fará o download da imagem utilizada.&lt;/p&gt;

&lt;p&gt;Utilizando outro terminal (o container ficará rodando neste terminal), utilize o seguinte comando para verificar se o container está ativo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker ps
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O retorno esperado é algo similar a isso, que traz diversas informaçoes a respeito do seu container:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9jdnetLL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5h2ucsl4j029gynwzs9w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9jdnetLL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5h2ucsl4j029gynwzs9w.png" alt="Container Database" width="880" height="62"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Acessando a sua base de dados
&lt;/h2&gt;

&lt;p&gt;Agora que o container está ativo, utilizaremos alguma ferramenta de banco de dados para acessá-lo. Recomendo pessoalmente a utilização do &lt;a href="https://dbeaver.io/download/"&gt;Dbeaver&lt;/a&gt; mas fique a vontade para utilizar qualquer outro.&lt;/p&gt;

&lt;p&gt;Entrando no Dbeaver, vamos em nova conexão (canto esquerdo superior), e selecionamos MariaDb&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--MQoRPIvj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0bwkaig4luf27j6l0ju5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--MQoRPIvj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0bwkaig4luf27j6l0ju5.png" alt="Select database" width="630" height="594"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nas credenciais, preenchemos o &lt;strong&gt;host&lt;/strong&gt; como 'localhost' e &lt;strong&gt;port&lt;/strong&gt; como '3306'. Em &lt;strong&gt;Database&lt;/strong&gt;, &lt;strong&gt;Username&lt;/strong&gt; e &lt;strong&gt;Password&lt;/strong&gt;, preenchemos conforme o arquivo docker-compose.yml de configuração da base:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zkGmdHdJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jhxe4i0jh8mm37h6xuug.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zkGmdHdJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jhxe4i0jh8mm37h6xuug.png" alt="Database Credentials" width="626" height="628"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ao clicar em &lt;strong&gt;Test connection&lt;/strong&gt;, espera-se:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HUvvRQsw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/a3ml2w78qb56iin11nkq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HUvvRQsw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/a3ml2w78qb56iin11nkq.png" alt="Connection sucessfull" width="407" height="206"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Por fim, agora clicamos em &lt;strong&gt;Finish&lt;/strong&gt; e nosso banco de dados está configurado e conectado em uma ferramenta para visualização e manipulação de dados. Caso deseje conectar em alguma aplicação, utilize as credencias do arquivo compose.&lt;/p&gt;

</description>
      <category>sql</category>
      <category>docker</category>
      <category>beginners</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
