https://github.com/danilomeneghel/prova-ambev
Cadastro de Pedidos
https://github.com/danilomeneghel/prova-ambev
api-rest docker-compose h2-database jakarta java21 junit5 kafka lombok maven mockito mysql8 spring-boot swagger-ui zookeeper
Last synced: 2 months ago
JSON representation
Cadastro de Pedidos
- Host: GitHub
- URL: https://github.com/danilomeneghel/prova-ambev
- Owner: danilomeneghel
- License: mit
- Created: 2025-03-16T15:18:44.000Z (about 1 year ago)
- Default Branch: master
- Last Pushed: 2025-04-01T17:52:02.000Z (about 1 year ago)
- Last Synced: 2025-04-01T18:49:58.731Z (about 1 year ago)
- Topics: api-rest, docker-compose, h2-database, jakarta, java21, junit5, kafka, lombok, maven, mockito, mysql8, spring-boot, swagger-ui, zookeeper
- Language: Java
- Homepage:
- Size: 1.82 MB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Prova Ambev
Avaliação técnica de uma API de Cadastro de Pedidos, desenvolvido em Java com Spring-Boot.
## Características
- API RESTful
- Validation
- Service Registry
- Service Discovery
- Message Queue
- MockMVC
- Clean Code
## Requisitos
- Java JDK 21
- Apache Maven >= 3.9.8
- PostgreSql 16
- Zookeeper 3.8.0
- Kafka 3.3.2
- Docker (Opcional)
## Tecnologias
- Java
- JPA
- Hibernate
- Maven
- Spring
- Lombok
- Jakarta
- JSON
- PostgreSql
- JUnit
- Zookeeper
- Kafka
- Docker
## Instalação
```
git clone https://github.com/danilomeneghel/prova-ambev.git
cd prova-ambev
```
## PostgreSql
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;"
```
## Zookeeper
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
```
## Kafka
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
```
## Maven
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:
http://localhost:8080/order
```
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:
http://localhost:8081/product
## Spring Actuator
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
## Docker (Opcional)
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
```
## Swagger
Documentação da API RESTful:
http://localhost:8080/swagger-ui.html
## Testes
Para realizar os testes, execute o seguinte comando no terminal:
```
cd order-service
mvn test
```
## Uso da Messageria Kafka
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.
## Screenshots
Swagger-UI

Modelagem ER

Testes Unitários

Aplicação Spring Boot

## Licença
Projeto licenciado sob The MIT License (MIT).
Desenvolvido por
Danilo Meneghel
danilo.meneghel@gmail.com
http://danilomeneghel.github.io/