Projeto de uma loja virtual com controle de estoque de produtos físicos. A aplicação conta com arquitetura de microsserviços e comunicação em mensageria.
API de Produtos
: Informa a lista de produtos e gerencia a disponibilidade deles de acordo com a demanda de pedidosAPI de Pedidos
: Cria e gerencia requisições de pedidos, estabelecendo comunicação com os demais serviçosAPI de Pagamentos
: Em construção
- Java [v.17]
- RabbitMQ [v.3.11]
- Spring (JPA, REST, Cloud-Netflix, AMQP) [v.2.7.6]
- MariaDB [v.10.6.11]
- Postman
- Docker [v.2.10.21]
- Maven [v.4.0.0]
- Swagger
Para encontrar a documentação gerada automaticamente pelo Swagger, acesse o endpoint /apiprodutos/swagger-ui.html
ou /apipedidos/swagger-ui.html
A URI principal onde estão reunidos todos os endpoints é http://localhost:8082/
POST
"/" : Cria um pedido | JSON - Body Parameter:
{
"listaDeProdutos":[
{
"idDeEstoque":1,
"quantidade":1
},
{
"idDeEstoque":2,
"quantidade":3
}
]
}
o id de estoque representa o número do ID do produto contido no banco de dados da API de Produtos
GET
"/" : Lista todos os produtos do estoquePOST
"/cadastrarproduto" : Cadastra um novo produto no estoque | JSON - Body Parameter:
{
"titulo":"PS4",
"descricao":"PS4 + 2 Controles",
"valorUnitario":2500.00,
"estoqueDisponivel":5,
"estoqueReservado":2,
"estoqueVendido":0
}
DELETE
"/deletarproduto/{id}" : Deleta um produto no estoque pelo ID | Path Variable
Para rodar este projeto, é necessário instalar o Docker e o banco de dados MariaDB via terminal.
Feito isso, inicializaremos uma instância do RabbitMQ via Docker. Assim, as API's poderão comunicar entre si. Digite o seguinte comando no terminal e deixe rodando, sem fechá-lo:
sudo docker run -it --rm --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3.11-management
Referência: https://www.rabbitmq.com/download.html
Abra um novo terminal e inicie o banco de dados através do comando:
sudo service mysql start
É importante ressaltar que o código está configurado para um usuário chamado "root" e senha "root", na porta 3306
Por fim, rode as aplicações nesta ordem:
1º
Server2º
Gateway3º
API Produtos4º
API Pedidos
A principal funcionalidade da loja virtual é a de criar pedidos e solicitá-los ao gerenciamento de estoque. Para criar um pedido, é necessário mandar uma requisição para a API Pedidos
, passando um ID da compra e uma lista de produtos. Cada produto da lista deve conter, obrigatoriamente, a quantidade solicitada de cada produto e o ID do produto que está cadastrado no banco de dados da API Produtos
. Durante a implementação do front-end, seria necessário fazer uma requisição GET
para a API Produtos
, solicitando a lista de produtos com os respectivos ID's de estoque.
A requisição inicial terá os demais valores nulos (exceto os obrigatórios), pois é função do estoque repassar informações detalhadas dos produtos, como por exemplo: valor unitário, título, descrição etc. Com a chegada da requisição para o estoque, é feita uma verificação se os produtos passados existem e se há quantidades suficiente para suprir o pedido. Caso esteja tudo OK, os produtos são reservados. O mecanismo de reserva funciona através da mudança dos valores da coluna "pedidos_disponiveis" para a coluna "pedidos_reservados" no banco de dados. Feito isso, é retornado para a API Pedidos
, os dados do pedido detalhado e o ID de indentificação do pedido,. Em caso de erro durante a verificação, é retornado o ID do pedido seguido de uma lista nula de produtos.
Por fim, ao ouvir a mensagem de retorno do pedido, a API Pedidos
armazena no seu banco de dados os detalhes do pedido e muda o status de PROCESSANDO para AGUARDANDO_CONFIRMACAO_DE_PAGAMENTO. Em caso nulo, o status é alterado para RECUSADO. Para prosseguir o fluxo da loja virtual, já foi criada a fila "estoque.aguardandopagamento" para possibilitar que a API Pagamentos
faça os devidos procedimentos, em sua implementação futuramente.