Avaliação técnica de uma API de Cadastro de Pedidos, desenvolvido em Java com Spring-Boot.
- API RESTful
- Validation
- Service Registry
- Service Discovery
- Message Queue
- MockMVC
- Clean Code
- Java JDK 21
- Apache Maven >= 3.9.8
- PostgreSql 16
- Zookeeper 3.8.0
- Kafka 3.3.2
- Docker (Opcional)
- Java
- JPA
- Hibernate
- Maven
- Spring
- Lombok
- Jakarta
- JSON
- PostgreSql
- JUnit
- Zookeeper
- Kafka
- Docker
git clone https://github.com/danilomeneghel/prova-ambev.git
cd prova-ambev
Abra seu PostgreSql e crie as 2 bases de dados:
order_db
product_db
Caso não tenha o PostgreSql 16 instalado, execute o seguinte comando Docker:
docker network create app_network
sudo docker run \
--name postgres_ambev \
--network app_network \
-p 5432:5432 \
-v /postgres/files/postgres-data:/var/lib/postgresql/data \
-e POSTGRES_USER=root \
-e POSTGRES_PASSWORD=secret \
-e POSTGRES_DB=order_db \
-d postgres:16
until docker exec -it postgres_ambev pg_isready -U root; do sleep 2; done
docker exec -it postgres_ambev psql -U root -d postgres -qAt -c "SELECT 1 FROM pg_database WHERE datname = 'product_db';" | grep -q 1 || \
docker exec -it postgres_ambev psql -U root -d postgres -c "CREATE DATABASE product_db;"
Rode o Zookeeper.
Caso não tenha o Zookeeper instalado, execute o seguinte comando Docker:
docker run -d \
--name zookeeper_ambev \
--network app_network \
-p 2181:2181 \
-e ALLOW_ANONYMOUS_LOGIN=yes \
bitnami/zookeeper:3.8.0
Para verificar os serviços registrados dentro do container Zookeeper, utilize o comando:
docker exec -it zookeeper_ambev /bin/bash
zkCli.sh
ls /services
Para ver se o serviço product-service foi registrado corretamente, utilize o comando:
ls /services/product-service
Após isso ele mostrará um ID único, onde com esse ID poderá ver todos os dados salvo desse serviço:
get /services/product-service/25626c1b-8678-4cfd-a3a8-d5538976b1cd
Rode o Kafka.
Caso não tenha o Kafka instalado, execute o seguinte comando Docker:
docker run -d \
--name kafka_ambev \
--network app_network \
-p 9092:9092 \
-e KAFKA_BROKER_ID=1 \
-e KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper_ambev:2181 \
-e KAFKA_CFG_LISTENERS=PLAINTEXT://0.0.0.0:9092 \
-e KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://localhost:9092 \
-e ALLOW_PLAINTEXT_LISTENER=yes \
bitnami/kafka:3.3.2
Para carregar o projeto, digite no terminal:
cd order-service
mvn clean spring-boot:run -Dspring-boot.run.profiles=dev
Aguarde carregar todo o serviço web.
Após concluído, digite o endereço abaixo em seu navegador:
cd product-service
mvn clean spring-boot:run -Dspring-boot.run.profiles=dev
Aguarde carregar todo o serviço web.
Após concluído, digite o endereço abaixo em seu navegador:
Para listar os endpoints habilitados, acesse o seguinte endereço:
http://localhost:8080/actuator
Para verificar o status da aplicação, acesse o endereço:
http://localhost:8080/actuator/health
Para verificar as informações do ambiente, acesse o endereço:
http://localhost:8080/actuator/env
Para rodar o projeto via Docker, bastar executar o seguinte comando:
docker compose up
Aguarde baixar as dependências e carregar todo o projeto, esse processo é demorado.
Caso conclua e não rode pela primeira vez, tente novamente executando o mesmo comando.
Para encerrar tudo digite:
docker compose down
Documentação da API RESTful:
http://localhost:8080/swagger-ui.html
Para realizar os testes, execute o seguinte comando no terminal:
cd order-service
mvn test
Ao utilizar o Apache Kafka para lidar com alta disponibilidade e alto volume de dados, a melhor opção geralmente é priorizar o envio dos dados para o Kafka antes de persistir no banco de dados. Essa abordagem aproveita as características do Kafka para garantir a resiliência e a escalabilidade do sistema.
Vantagens de Enviar para o Kafka Primeiro:
-
Alta Disponibilidade e Tolerância a Falhas
O Kafka é projetado para ser altamente distribuído e tolerante a falhas.
Ao replicar dados entre brokers, ele garante que os dados não sejam perdidos, mesmo se um ou mais brokers falharem.
Isso é crucial em cenários de alto volume, onde a perda de dados pode ter impactos significativos. -
Escalabilidade
O Kafka permite escalar horizontalmente, adicionando mais brokers ao cluster conforme necessário.
Isso o torna ideal para lidar com volumes crescentes de dados.
Essa escalabilidade garante que o sistema possa manter o desempenho mesmo sob cargas pesadas. -
Desacoplamento e Processamento Assíncrono
O Kafka desacopla os produtores de dados dos consumidores, permitindo que os dados sejam processados de forma assíncrona.
Isso melhora o desempenho geral do sistema, pois os produtores não precisam esperar que os dados sejam persistidos no banco de dados antes de continuar. -
Retenção de Dados
O Kafka armazena os dados por um período configurável, permitindo que os consumidores processem os dados em seu próprio ritmo e até mesmo reprocessem os dados se necessário.
Projeto licenciado sob The MIT License (MIT).
Desenvolvido por
Danilo Meneghel
danilo.meneghel@gmail.com
http://danilomeneghel.github.io/