<?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: Erick Andrade</title>
    <description>The latest articles on DEV Community by Erick Andrade (@erickac).</description>
    <link>https://dev.to/erickac</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%2F965360%2F2ac9eb08-5c43-41e9-a88b-73a671061ae7.jpeg</url>
      <title>DEV Community: Erick Andrade</title>
      <link>https://dev.to/erickac</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/erickac"/>
    <language>en</language>
    <item>
      <title>Execução de múltiplos contêiners com Docker Compose</title>
      <dc:creator>Erick Andrade</dc:creator>
      <pubDate>Mon, 10 Mar 2025 23:04:52 +0000</pubDate>
      <link>https://dev.to/erickac/execucao-de-multiplos-conteiners-com-docker-compose-2bjp</link>
      <guid>https://dev.to/erickac/execucao-de-multiplos-conteiners-com-docker-compose-2bjp</guid>
      <description>&lt;p&gt;Qual desenvolvedor nunca teve que subir uma aplicação em uma máquina virtual e teve que instalar algum banco de dados ou algum java da vida pra executar a aplicação.&lt;br&gt;
Para evitar essas dores de cabeça geralmente é utilizado o Docker para iniciar um contêiner contendo um banco de dados ou algum servidor exemplo Tomcat.&lt;br&gt;
Nesse artigo irei explicar como o Docker Compose pode facilitar sua vida e inicialização vários contêiners com algumas configurações bem simples.&lt;/p&gt;
&lt;h2&gt;
  
  
  O que é Docker Compose
&lt;/h2&gt;

&lt;p&gt;Basicamente um ferramenta para gerenciar vários conteiners Docker, informando os serviços, dependências, volumes e etc.&lt;br&gt;
Nesse tutorial vamos falar do simples, se é uma ferramenta que é pra facilitar, pra que complicar?&lt;/p&gt;
&lt;h2&gt;
  
  
  Configurações necessárias
&lt;/h2&gt;

&lt;p&gt;Para isso é necessário ter o Docker Engine instalado na sua máquina, agora copie o código abaixo em um arquivo chamado &lt;code&gt;docker-compose.yaml&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Nosso código:
&lt;/h3&gt;


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

services:
  web:
    image: nginx
    volumes:
      - ./templates:/etc/nginx/templates/default.conf
    ports:
      - "8080:80"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Definimos o version que é a versão do formato do nosso código.&lt;br&gt;
Definimos o services que são os conteiners que desejamos utilizar e dentro deles temos alguma configurações, como:&lt;br&gt;
A imagem que está no DockerHub, volumes para persistir os dados do conteiner e ports para definir como iremos acessar aquele recurso.&lt;/p&gt;

&lt;p&gt;Agora ao executar o comando &lt;code&gt;docker compose up&lt;/code&gt; iremos baixar as imagens e iniciar os contêiners, agora se quisermos dar o mesmo comando e execucar em segundo plano fazemos assim &lt;code&gt;docker compose up -d&lt;/code&gt;, para parar a execução no nosso terminal só dar um Ctrl+C ou quando executar em segundo plano &lt;code&gt;docker compose stop&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Adicionando um banco de dados
&lt;/h2&gt;

&lt;p&gt;Agora iremos adicionar um Postgres em nosso projeto pra isso copie o código:&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'

services:
  web:
    image: nginx
    volumes:
      - ./templates:/etc/nginx/templates/default.conf
    ports:
      - "8080:80"
  db:
    image: postgres:latest
    restart: always
    environment:
      - POSTGRES_PASSWORD=123
    ports:
      - "5433:5432"

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

&lt;/div&gt;



&lt;p&gt;Com isso iremos iniciar um servidor nginx e um banco de dados em somente uma configuração, sem precisar ter instalado nada em nossas máquinas, apenas com a dockerização usando o Docker.&lt;/p&gt;

&lt;h3&gt;
  
  
  Imagem personalizadas
&lt;/h3&gt;

&lt;p&gt;Para criar um conteiner com uma imagem personalizada é muito simples basta adicionar o atributo &lt;code&gt;build&lt;/code&gt; e pronto, pode utilizar sua imagem de um Dockerfile no Compose.&lt;/p&gt;

&lt;p&gt;Exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;services:
  app:
    build: ./
    ports:
      - "8080:8080"
    container_name: app
    depends_on:
      - db
    environment:
      - SPRING_DATASOURCE_URL=jdbc:postgresql://db:5432/database
      - SPRING_DATASOURCE_USERNAME=root
      - SPRING_DATASOURCE_PASSWORD=123
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aqui no caso estou criando uma imagem de um projeto Spring Boot que depende de outra imagem que se chama db para ser executada corretamente.&lt;br&gt;
Isso é tudo pra esse artigo, bem simples e rápido, caso deseje se aventurar no mundo do Docker Compose ou Docker acessa a documentação:&lt;br&gt;
&lt;a href="https://docs.docker.com/compose/" rel="noopener noreferrer"&gt;Documentação Docker Compose&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Até a próxima!!!
&lt;/h4&gt;

</description>
      <category>docker</category>
      <category>webdev</category>
      <category>programming</category>
      <category>devops</category>
    </item>
    <item>
      <title>Produzindo e ouvindo eventos com Spring Boot</title>
      <dc:creator>Erick Andrade</dc:creator>
      <pubDate>Tue, 04 Mar 2025 15:42:28 +0000</pubDate>
      <link>https://dev.to/erickac/produzindo-e-ouvindo-eventos-com-spring-boot-4l7o</link>
      <guid>https://dev.to/erickac/produzindo-e-ouvindo-eventos-com-spring-boot-4l7o</guid>
      <description>&lt;p&gt;Olá, nesse artigo irei mostrar uma pequena parte do mundo de arquitetura orientada a eventos, resumidamente utilizando Apache Kafka e Spring Boot.&lt;/p&gt;

&lt;h2&gt;
  
  
  Instalação do Apache Kafka
&lt;/h2&gt;

&lt;p&gt;Para começar nosso projeto precisamos de um servidor Kafka rodando em nossa máquina, para isso iremos utilizar o Docker.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Baixar imagem do Apache Kafka
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;docker pull apache/kafka:3.9.0&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Iniciar um container com a imagem
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;docker run -p 9092:9092 apache/kafka:3.9.0&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Após isso você terá um container rodando na porta 9092&lt;/p&gt;

&lt;h2&gt;
  
  
  Começar nosso projeto
&lt;/h2&gt;

&lt;p&gt;Para isso iremos criar o projeto no &lt;a href="https://start.spring.io/" rel="noopener noreferrer"&gt;https://start.spring.io/&lt;/a&gt;.&lt;br&gt;
Vamos instalar as dependências do Spring Web e Spring for Apache Kafka.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Recomendo utilizar o Offset Explorer para ver os tópicos e partições&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Configurar produtor e consumidor em nosso Projeto
&lt;/h2&gt;

&lt;p&gt;Aqui está o pulo do gato, o Spring fornece uma integração simplificada com o Apache Kafka, sem necessidade de realizar diversas configurações, claro que dependendo do cenário que você está será necessário ter algo mais personalizado.&lt;br&gt;
O código abaixo será responsável por criar um tópico e as partições do mesmo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import org.apache.kafka.clients.admin.NewTopic;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.kafka.annotation.EnableKafka;
import org.springframework.kafka.config.TopicBuilder;

@Configuration
@EnableKafka
public class KafkaConfig {

    @Bean
    public NewTopic newTopic() {
        return TopicBuilder.name("topico")
                .partitions(1)
                .build();
    }

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

&lt;/div&gt;



&lt;p&gt;Criamos apenas um tópico com o nome "topico" e que tem apenas uma partições, caso queira criar vários tópicos será necessário criar um bean pra cada tópico.&lt;br&gt;
Após isso já temos nosso tópico rodando e pronto para enviar eventos nele, agora no código abaixo iremos produzir e ouvir os eventos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;package br.com.kafka.kafka.controllers;

import br.com.kafka.kafka.models.Mensagem;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/mensagem")
public class MensagemController {

    @Autowired
    private KafkaTemplate&amp;lt;String, String&amp;gt; kafkaTemplate;

    @PostMapping
    public void send(@RequestBody Mensagem mensagem) {
        kafkaTemplate.send("topico", mensagem.toString());
    }

    @KafkaListener(groupId = "group-1", topics = "topico")
    public void listener(ConsumerRecord&amp;lt;String, String &amp;gt; event) throws Exception {
        System.out.println(event.value());
    }


}

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

&lt;/div&gt;



&lt;p&gt;Com isso já podemos brincar com algo, realizar integrações entre sistemas, lembrando que para manter um broker de eventos é bem custoso, mas em compensação seu sistema terá uma disponibilidade maior e caso ter algum erro o seu usuário final não ficará sabendo.&lt;br&gt;
Basicamente é isso pretendo explorar afundo em outros artigos, como criar configurações personalizadas, adicionar serialização e deserialização de JSON para facilitar o escuta de eventos.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>beginners</category>
      <category>springboot</category>
    </item>
    <item>
      <title>Realmente vale aplicar Arquitetura Limpa?</title>
      <dc:creator>Erick Andrade</dc:creator>
      <pubDate>Tue, 25 Feb 2025 22:42:13 +0000</pubDate>
      <link>https://dev.to/erickac/realmente-vale-aplicar-arquitetura-limpa-9p9</link>
      <guid>https://dev.to/erickac/realmente-vale-aplicar-arquitetura-limpa-9p9</guid>
      <description>&lt;p&gt;Alguns dias decidi realizar um projeto bem simples e já que estava estudando arquitetura limpa, implementei utilizando esse tipo de arquitetura.&lt;br&gt;
Basicamente a regra de negócio seria criar uma transferência bancaria de usuário para outro, ai que está, uma coisa simples que decidi complicar, esse tipo de sistema um simples MVC resolveria e me pouparia tempo para concluir.&lt;/p&gt;

&lt;p&gt;Vamos lá primeiro precisamos entender pra que utilizar a arquitetura limpa...&lt;/p&gt;

&lt;p&gt;Pense em um caso que você tenha uma regra de negócio utilizando JPA, clássico esquema de @Entity numa classe junto com as lógicas de regras de negócio e por acaso algum dia seu gerente diz que o cliente necessita de uma funcionalidade, por mais simples que seja você teria que mexer na classe de persistência e também na de domínio, pois ambas estão na mesma classe, a arquitetura limpa foi proposta pra contornar essas ocasiões, pois as regras de negócio não tem nenhuma ligação direta com o banco de dados pois estão a nível de aplicação, tem casos que usamos regras aplicadas ao banco de dados, mas ai que está, ambas agora estão em classes separadas sem depender de um e de outro.&lt;/p&gt;

&lt;p&gt;Foi uma explicação bem rasa, pretendo escrever mais em outro post, mas voltando ao tema do post, decidi utilizar arquitetura limpa nesse projeto e o que eu poderia ter feito em 2 horas, demorei quase 4 horas, pense numa lógica assim: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cliente faz transferência -&amp;gt; autoriza em uma api externa e a partir disso que o outro usuário recebe.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Isso em um simples serviço poderia ser feito facilmente somente utilizando uma classe com poucas funções.&lt;/p&gt;

&lt;p&gt;O que aprendi com isso?&lt;br&gt;
Antes de começar algum projeto, pense primeiro na sua arquitetura e no nível de complexidade que ele pode chegar, nesse meu caso como era uma simples task, poderia ser feito em um MVC e estaria pronto na metade do tempo.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>beginners</category>
      <category>career</category>
    </item>
  </channel>
</rss>
