<?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: Leonardo Melo Santos</title>
    <description>The latest articles on DEV Community by Leonardo Melo Santos (@leonardomelosantos).</description>
    <link>https://dev.to/leonardomelosantos</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%2F1490498%2F50405d17-0320-4ad3-ac3c-b8fedc3e7c0c.jpg</url>
      <title>DEV Community: Leonardo Melo Santos</title>
      <link>https://dev.to/leonardomelosantos</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/leonardomelosantos"/>
    <language>en</language>
    <item>
      <title>Usando o Nginx como API gateway no Linux</title>
      <dc:creator>Leonardo Melo Santos</dc:creator>
      <pubDate>Tue, 29 Apr 2025 21:52:16 +0000</pubDate>
      <link>https://dev.to/leonardomelosantos/usando-o-nginx-como-api-gateway-no-linux-h9c</link>
      <guid>https://dev.to/leonardomelosantos/usando-o-nginx-como-api-gateway-no-linux-h9c</guid>
      <description>&lt;p&gt;Está precisando usar o Nginx como ferramenta de API Gateway e não sabe o passo a passo para testar este cenário?&lt;/p&gt;

&lt;p&gt;Este artigo tem o objetivo de compartilhar um passo a passo, onde você poderá instalar o Nginx no seu Linux e simular API Gateway:&lt;/p&gt;

&lt;p&gt;Seguem os passos:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1) Instale as dependências necessárias&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Antes de compilar o Nginx, você precisará instalar algumas ferramentas e bibliotecas. Para isso, execute os dois comandos abaixo:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sudo apt update&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sudo apt install -y build-essential libpcre3 libpcre3-dev zlib1g zlib1g-dev libssl-dev wget&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2) Baixe o código-fonte do Nginx&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Acesse ao endereço &lt;a href="https://nginx.org/en/download.html" rel="noopener noreferrer"&gt;https://nginx.org/en/download.html&lt;/a&gt; e baixe a versão mais estável do NGINX. Em seguida, descompacte o arquivo baixado.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3) Compile o Nginx&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Para compilar o Nginx, execute os três comandos abaixo:&lt;/p&gt;

&lt;p&gt;Configure o processo de compilação:&lt;br&gt;
&lt;code&gt;./configure --sbin-path=/usr/local/nginx/nginx --conf-path=/usr/local/nginx/nginx.conf --pid-path=/usr/local/nginx/nginx.pid&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Compile o código-fonte:&lt;br&gt;
&lt;code&gt;make&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Instale o Nginx:&lt;br&gt;
&lt;code&gt;sudo make install&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4) Levante suas aplicações que serão usadas no Gateway&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No exemplo deste cenário, foram levantadas duas aplicações:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://localhost:3001" rel="noopener noreferrer"&gt;http://localhost:3001&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://localhost:3002" rel="noopener noreferrer"&gt;http://localhost:3002&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;5) Configue da forma como deseja&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Edite o arquivo &lt;strong&gt;"/usr/local/nginx/nginx.conf"&lt;/strong&gt;. No exemplo abaixo foram configurados:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Porta do Nginx é a 8081, portanto será digitado no navegador o endereço "&lt;a href="http://localhost:8081" rel="noopener noreferrer"&gt;http://localhost:8081&lt;/a&gt;"&lt;/li&gt;
&lt;li&gt;Dois endpoints "myapp1" e "myapp2", em que cada um deles será endereçado para aplicações/endereços diferentes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqwe70g1hgflqcslyc1c6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqwe70g1hgflqcslyc1c6.png" alt="Image description" width="667" height="745"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6) Inicie o Nginx&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sudo /usr/local/nginx/nginx&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Obs.: Quando quiser parar o Nginx, execute o comando abaixo:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sudo kill -QUIT $(cat /usr/local/nginx/nginx.pid)&lt;/code&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Internal Developer Platform (IDP)</title>
      <dc:creator>Leonardo Melo Santos</dc:creator>
      <pubDate>Thu, 24 Apr 2025 11:50:41 +0000</pubDate>
      <link>https://dev.to/leonardomelosantos/internal-developer-platform-idp-1b73</link>
      <guid>https://dev.to/leonardomelosantos/internal-developer-platform-idp-1b73</guid>
      <description>&lt;p&gt;Já pensou em usar alguma ferramenta que pudesse ajudar na produtividade do seu time, centralizando templates, padronizações e documentações? Então chegou a hora de pensar em implantar uma ferramenta de IDP.&lt;/p&gt;

&lt;p&gt;Em linhas gerais: Uma IDP é um conjunto de ferramentas, práticas e serviços mantidos por uma equipe de engenharia de plataforma para abstrair complexidades e aumentar a produtividade dos times de desenvolvimento. É como criar uma "plataforma como produto", mas para os desenvolvedores internos da empresa.&lt;/p&gt;

&lt;p&gt;Essas plataformas geralmente incluem:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Catálogo de aplicações (boilerplates, templates)&lt;/li&gt;
&lt;li&gt;Self-service para provisionamento de ambientes&lt;/li&gt;
&lt;li&gt;Pipelines de CI/CD padronizados&lt;/li&gt;
&lt;li&gt;Observabilidade e monitoramento integrados&lt;/li&gt;
&lt;li&gt;Gestão de permissões e segurança&lt;/li&gt;
&lt;li&gt;Documentação centralizada&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Exemplos de Ferramentas e Plataformas que ajudam a construir uma IDP:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Backstage&lt;/strong&gt; (by Spotify) – Um portal de desenvolvedor open-source que serve como front-end da sua IDP.&lt;/li&gt;
&lt;li&gt;Port – Plataforma para criar portais de desenvolvimento self-service.&lt;/li&gt;
&lt;li&gt;Humanitec – Uma das soluções mais completas para criar IDPs.&lt;/li&gt;
&lt;li&gt;Kraken (da Zup) – Focado em automação de deploys e ambientes.&lt;/li&gt;
&lt;li&gt;Qovery, Pluto, Cortex, entre outros.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Benefícios&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Redução do acoplamento entre times de plataforma e desenvolvimento&lt;/li&gt;
&lt;li&gt;Redução de tempo para criar e operar aplicações&lt;/li&gt;
&lt;li&gt;Aumento de segurança e governança&lt;/li&gt;
&lt;li&gt;Padronização das boas práticas DevOps/SRE&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Exemplo de uso na prática&lt;/strong&gt;&lt;br&gt;
Imagine que um dev quer criar um novo microserviço. Em vez de clonar manualmente templates e configurar CI/CD, ele entra no portal (como o Backstage), preenche um formulário com o nome do serviço e a stack desejada, e a plataforma cria tudo: repositório, pipelines, infraestrutura, monitoramento e deploy automático no ambiente desejado.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Domain Model e as entidades persistíveis</title>
      <dc:creator>Leonardo Melo Santos</dc:creator>
      <pubDate>Wed, 16 Apr 2025 02:24:45 +0000</pubDate>
      <link>https://dev.to/leonardomelosantos/domain-model-e-as-entidades-persistiveis-2i04</link>
      <guid>https://dev.to/leonardomelosantos/domain-model-e-as-entidades-persistiveis-2i04</guid>
      <description>&lt;p&gt;Pergunta: Quando adotou o Domain Model Pattern, ao invés da abordagem de Transaction Script Pattern, você criou em seu projeto tanto as entidades de domínio quanto as entidades correlatas de persistência? Às vezes nos perguntamos se o Domain Model Pattern traz consigo essa obrigatoriedade das entidades persistíveis.&lt;/p&gt;

&lt;p&gt;Primeiramente, vamos clarear algumas ideias, trazendo algumas definições/premissas:&lt;/p&gt;

&lt;p&gt;Sobre as &lt;strong&gt;Entidades de domínio&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No Domain Model, as entidades de domínio são fundamentais. Elas representam os conceitos principais do domínio da aplicação (por exemplo: Cliente, Pedido, Produto).&lt;/li&gt;
&lt;li&gt;Essas entidades encapsulam o estado (atributos) e o comportamento (métodos e regras de negócio relacionadas ao conceito) de forma coesa.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sobre as &lt;strong&gt;Entidades persistíveis&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Em um sistema bem projetado com Domain Model, as entidades de domínio podem ser persistidas, mas o foco principal delas não é a persistência, e sim o modelamento do domínio.&lt;/li&gt;
&lt;li&gt;A persistência é geralmente tratada por meio de técnicas como mapeamento objeto-relacional (ORM) (ex.: Hibernate, JPA) ou repositórios, que fazem a ponte entre o modelo de domínio e a infraestrutura de persistência (banco de dados).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A grande questão dessa postagem é: A separação é necessária?&lt;br&gt;
Nem sempre é necessário criar uma distinção explícita entre entidades de domínio e entidades persistíveis. Em muitos casos, as entidades de domínio são diretamente persistíveis, desde que a infraestrutura permita isso sem comprometer o design do domínio.&lt;/p&gt;

&lt;p&gt;Porém, em sistemas mais complexos, pode ser útil separar os dois contextos para evitar acoplamento excessivo com detalhes de persistência. Nesse caso, você pode utilizar Data Models para transporte de dados.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Diferença em relação ao Transaction Script&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No Transaction Script, as entidades geralmente são estruturas de dados simples (como tabelas ou registros), e a lógica de negócio é tratada de forma procedural em scripts ou serviços. Isso pode levar a um design mais simples, mas menos escalável e mais difícil de manter em sistemas complexos. Essa abordagem é mais direta e se concentra em scripts separados que executam operações específicas. Ele é útil em sistemas mais simples ou onde a lógica de negócios é de fácil entendimento.&lt;/li&gt;
&lt;li&gt;No Domain Model, a lógica de negócio é distribuída entre as entidades de domínio, promovendo coesão e encapsulamento, mas exige maior planejamento e cuidado no design. Essa abordagem foca em encapsular lógica de negócios complexa em objetos orientados a dados. Ele é ideal para aplicações que têm um comportamento intricado e persistente&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Conclusão&lt;/strong&gt;&lt;br&gt;
No design de Domain Model:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;As entidades de domínio são indispensáveis, pois representam os conceitos e comportamentos do domínio.&lt;/li&gt;
&lt;li&gt;A distinção entre entidades de domínio e entidades persistíveis depende da complexidade do sistema e do grau de desacoplamento desejado entre a lógica de negócio e a infraestrutura de persistência.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Vídeos no YouTube que podem ser usados como exemplos práticos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How To Start Using Domain-Driven Design: Pushing Logic Down - &lt;a href="https://www.youtube.com/watch?v=q74saF54w8I" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=q74saF54w8I&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Refactoring From Transaction Script to Domain-Driven Design - &lt;a href="https://www.youtube.com/watch?v=KTSpDZNfjhU" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=KTSpDZNfjhU&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Transaction Script vs. Domain Model, qual estratégia de design devo adotar? - &lt;a href="https://www.youtube.com/watch?v=tcZP0DlZD9U" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=tcZP0DlZD9U&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ddd</category>
      <category>programming</category>
      <category>domainmodel</category>
    </item>
    <item>
      <title>Quando usar e quando não usar DDD?</title>
      <dc:creator>Leonardo Melo Santos</dc:creator>
      <pubDate>Mon, 31 Mar 2025 01:42:50 +0000</pubDate>
      <link>https://dev.to/leonardomelosantos/quando-usar-e-quando-nao-usar-ddd-3fpg</link>
      <guid>https://dev.to/leonardomelosantos/quando-usar-e-quando-nao-usar-ddd-3fpg</guid>
      <description>&lt;p&gt;Apesar de muitas pessoas afirmarem utilizar DDD apenas por possuir uma arquitetura em camadas, isto não significa que realmente estejam usando o DDD. Existem algumas interpretações como DDD-Lite que seria uma aplicação utilizando alguns conceitos encontrados no DDD porém ignorando muitos outros.&lt;/p&gt;

&lt;p&gt;Para saber se você deve ou não implementar o DDD no seu projeto, disponibilizo abaixo um DDD Score Card extraído do livro Implementing Domain Driven Design.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Se no final o somatório dos pontos for igual ou maior que 7 considere seriamente em implementar o DDD em seu projeto.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Critério 1
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Pontuação: 0 pontos&lt;/li&gt;
&lt;li&gt;Seu contexto: Se sua aplicação for completamente centrada em dados e se qualificar verdadeiramente para uma solução CRUD pura, em que cada operação é basicamente uma consulta simples de banco de dados para criar, ler, atualizar ou excluir, você não precisa do DDD. Sua equipe só precisa colocar um rosto bonito em um editor de tabelas de banco de dados. Em outras palavras, se você puder confiar no fato de que os usuários irão inserir os dados diretamente em uma tabela, atualizá-los e, às vezes, excluí-los, você nem mesmo precisará de uma interface do usuário. Isso não é realista, mas é conceitualmente relevante. Se pudesse usar uma ferramenta simples de desenvolvimento de banco de dados para criar uma solução, você não desperdiçaria o tempo e dinheiro de sua empresa no DDD.&lt;/li&gt;
&lt;li&gt;Análise: Isso parece óbvio, mas normalmente não é fácil determinar
simples versus complexo. Não é como se todas as aplicações que não são CRUD puras merecem o tempo e o esforço
do uso do DDD. Assim, talvez possamos sugerir outros indicadores para nos ajudar a traçar uma linha entre o que é complexo e o que não é …&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Critério 2
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Pontuação: 1 ponto&lt;/li&gt;
&lt;li&gt;Seu contexto: Se seu sistema exigir apenas 30 ou menos operações de negócio, ele provavelmente é bem simples. Isso significaria que a aplicação não teria um total de mais de 30 histórias de usuário ou fluxos de caso de uso, com cada um desses fluxos tendo apenas uma lógica mínima de negócio. Se você puder desenvolver rápida e facilmente esse tipo de aplicação e não se importar com a falta de poder e controle em relação à complexidade e alteração, o sistema provavelmente não precisará usar o DDD.1&lt;/li&gt;
&lt;li&gt;Análise: Para ser claro, estou falando de 25 a 30 únicos métodos de negócio, não de 25 a 30 interfaces de serviço completas, cada uma com vários métodos. O último pode ser complexo.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Critério 3
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Pontuação: 2 pontos&lt;/li&gt;
&lt;li&gt;Seu contexto: Assim, digamos que, em algum lugar no intervalo entre 30 e 40 histórias de usuário ou fluxos de caso de uso, a complexidade poderia ser pior. Seu sistema pode estar entrando no território do DDD.&lt;/li&gt;
&lt;li&gt;Análise: O risco é do comprador: Bem frequentemente a complexidade não é reconhecida rapidamente. Nós, desenvolvedores de software, somos realmente muito bons para subestimar a complexidade e o nível de esforços. Só porque talvez queiramos codificar uma aplicação em N camadas com diversos Patterns não significa que devemos. No longo prazo, essas aplicações poderiam prejudicar mais do que ajudar.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Critério 4
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Pontuação: 3 pontos&lt;/li&gt;
&lt;li&gt;Seu contexto: Mesmo que a aplicação não seja complexa agora, a complexidade dela aumentará? Você só pode saber isso ao certo depois que os usuários reais começam a trabalhar com ela, mas há um passo na coluna "Pensamentos de suporte" que pode ajudar a revelar a situação real. Tenha cuidado aqui. Se houver absolutamente qualquer indício de que a aplicação tem complexidade mesmo moderada - este é um bom momento para ser paranoico, isso pode ser uma indicação suficiente de que ela na verdade será mais do que moderadamente complexa. Incline-se em direção ao DDD.&lt;/li&gt;
&lt;li&gt;Análise: Aqui vale a pena analisar os cenários de uso mais complexos com especialistas em domínio e ver aonde eles levam.Os especialistas em domínio: #1 Já estão solicitando recursos mais complexos? Se sim, isso provavelmente é uma indicação de que a aplicação já é ou em breve se tornará excessivamente complexa para usar uma abordagem CRUD.#2 Estão entediados com os recursos ao ponto em que dificilmente vale a pena discuti-los? Provavelmente não é complexa.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Critério 5
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Pontuação: 4 pontos&lt;/li&gt;
&lt;li&gt;Seu contexto: Os recursos da aplicação serão alterados com frequência ao longo de alguns anos, e você não pode antecipar que as alterações serão simples.&lt;/li&gt;
&lt;li&gt;Análise: O DDD pode ajudá-lo a gerenciar a complexidade da refatoração de seu modelo ao longo do tempo.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Critério 6 e último
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Pontos: 5 pontos&lt;/li&gt;
&lt;li&gt;Seu contexto: Você não entende o Domínio porque ele é novo. Na medida em que você e sua equipe sabem, ninguém fez isso antes. Isso provavelmente significa que ele é complexo ou, pelo menos, merece a devida diligência com análise analítica para determinar o nível de complexidade.&lt;/li&gt;
&lt;li&gt;Análise: Você precisará trabalhar com Domain Experts e testar os modelos para fazer a coisa certa. Você certamente também pontuou em um ou mais dos critérios anteriores, portanto, use o DDD.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ao finalizar este exercício você terá mais clareza para determinar se o DDD é viável ou não para o seu projeto. Lembre-se de tomar as decisões com foco na simplicidade, entrega e manutenção. Muitas vezes sofremos da vontade incontrolável de implementar todos os conceitos de nossos estudos, porém estamos colocando em risco o dinheiro da empresa e nossa própria carreira.&lt;/p&gt;

</description>
      <category>ddd</category>
      <category>tradeoff</category>
      <category>architecture</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
