An open API service indexing awesome lists of open source software.

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

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

![Screenshots](screenshots/screenshot01.png)

Modelagem ER

![Screenshots](screenshots/screenshot02.png)

Testes Unitários

![Screenshots](screenshots/screenshot03.png)

Aplicação Spring Boot

![Screenshots](screenshots/screenshot04.png)

## Licença

Projeto licenciado sob The MIT License (MIT).

Desenvolvido por

Danilo Meneghel

danilo.meneghel@gmail.com

http://danilomeneghel.github.io/