Este projeto implementa um sistema de gerenciamento de pedidos utilizando uma arquitetura de microsserviços, com foco em escalabilidade, resiliência e segurança. A solução incorpora um Gateway API para roteamento e segurança, um servidor de autenticação para gerenciamento de usuários e JWT, um servidor Eureka para descoberta de serviços, e microsserviços dedicados para clientes, produtos e pedidos.
Para facilitar a execução de todos os microsserviços e seus respectivos bancos de dados, este projeto inclui um arquivo docker-compose.yml. Com ele, é possível subir toda a infraestrutura com um único comando.
- Docker Desktop instalado
-
Navegue até o diretório raiz do projeto onde o arquivo
docker-compose.ymlestá localizado. -
Execute o seguinte comando para construir e iniciar todos os serviços:
docker-compose up --build
O
--buildgarante que as imagens sejam construídas a partir do código-fonte mais recente. Se as imagens já estiverem construídas e você quiser apenas iniciá-las, pode usar:docker-compose up
-
Para parar e remover os contêineres, redes e volumes criados pelo
docker-compose:docker-compose down
Este projeto está configurado com um pipeline de Integração Contínua (CI) que automatiza a construção e o push das imagens Docker para o Docker Hub. Sempre que há um push para a branch main, o workflow Docker Images CI é acionado, garantindo que as imagens mais recentes dos microsserviços estejam disponíveis no Docker Hub com a tag latest.
Você pode acessar as imagens diretamente do Docker Hub utilizando a tag latest para cada serviço:
devopmarkz/eureka-server:latestdevopmarkz/auth-server:latestdevopmarkz/gestao-pedidos-api-gateway:latestdevopmarkz/cliente-service:latestdevopmarkz/produto-service:latestdevopmarkz/pedido-service:latest
O sistema é composto pelos seguintes microsserviços:
- Eureka Server: Servidor de descoberta de serviços.
- Auth Server: Serviço de autenticação e autorização com Spring Security e JWT.
- API Gateway: Ponto de entrada unificado para os microsserviços, responsável por roteamento, segurança e balanceamento de carga. O roteamento é feito com base em prefixos de URL, como
/cliente-service/**,/produto-service/**, etc., que são mapeados para os respectivos microsserviços. Além disso, o Gateway garante que os microsserviços só possam ser acessados através dele, injetando um cabeçalho secreto (X-Secret-Access) nas requisições que encaminha, que é validado pelos microsserviços para permitir o acesso. - Cliente Service: Gerencia informações de clientes.
- Produto Service: Gerencia informações de produtos e estoque.
- Pedido Service: Gerencia o ciclo de vida dos pedidos.
Para garantir a consistência dos dados em um ambiente de microsserviços, onde transações podem envolver múltiplos serviços, este projeto utiliza o padrão SAGA. Especificamente, o Pedido Service orquestra as operações de criação de pedidos e a atualização de estoque no Produto Service. Caso ocorra uma falha em qualquer etapa da transação (por exemplo, estoque insuficiente ou cancelamento de pedido), o padrão SAGA permite a execução de transações compensatórias para reverter as operações já realizadas, garantindo a integridade dos dados.
Por exemplo, se um pedido for cancelado após a dedução do estoque, uma transação compensatória será acionada para realizar o "rollback" do estoque no Produto Service, devolvendo os itens ao inventário.
- Java 21
- Spring Boot 3.x
- Spring Cloud (Eureka, Gateway, OpenFeign)
- Spring Security
- JWT (JSON Web Tokens)
- Maven
- PostgreSQL (para Auth Service, Cliente Service, Pedido Service, Produto Service)
- Flyway (para migrações de banco de dados)
- H2 Database (para testes e desenvolvimento local em alguns serviços)
- Docker & Docker Compose
Caso prefira executar os serviços manualmente (sem Docker), siga os passos abaixo:
- Java Development Kit (JDK) 21 ou superior
- Maven 3.x ou superior
- PostgreSQL (para os bancos de dados)
Cada microsserviço que persiste dados (Auth, Cliente, Produto, Pedido) utiliza PostgreSQL. Você pode configurar as credenciais do banco de dados nos arquivos application.yaml ou application-dev.yaml de cada serviço. As migrações de banco de dados são gerenciadas pelo Flyway.
Exemplo de configuração no application.yaml:
spring:
datasource:
url: jdbc:postgresql://localhost:5432/nome_do_banco
username: seu_usuario
password: sua_senha
jpa:
hibernate:
ddl-auto: update
properties:
hibernate:
dialect: org.hibernate.dialect.PostgreSQLDialectÉ recomendável iniciar os serviços na seguinte ordem:
- Eureka Server
- Auth Server
- API Gateway
- Cliente Service
- Produto Service
- Pedido Service
Para cada serviço, navegue até o diretório raiz do microsserviço e execute o comando Maven:
mvn spring-boot:runAlternativamente, você pode importar o projeto em sua IDE (IntelliJ IDEA, Eclipse) e executar as classes principais de cada aplicação.
Todos os microsserviços são acessados exclusivamente através do API Gateway, disponível na porta 8765. Para isso, cada serviço exige um prefixo de rota, conforme exemplo abaixo:
| Serviço | Prefixo no Gateway | Exemplo de URL |
|---|---|---|
| Cliente Service | /cliente-service/** |
http://localhost:8765/cliente-service/clientes |
| Produto Service | /produto-service/** |
http://localhost:8765/produto-service/produtos |
| Pedido Service | /pedido-service/** |
http://localhost:8765/pedido-service/pedidos |
Esse padrão é configurado no gateway com .stripPrefix(1) para remover o prefixo antes de encaminhar ao serviço via Eureka (load balancer).
- Porta:
8761 - Função: Registro e descoberta de serviços.
- URL:
http://localhost:8761
- Porta:
9090 - Função: Autenticação de usuários, geração e validação de JWTs.
- Banco de Dados: PostgreSQL.
- URL Token:
http://localhost:9090/auth/login - URL Criação de Usuário:
http://localhost:9090/usuarios
- Porta:
8765 - Função: Roteamento inteligente de requisições + segurança (filtros de autenticação e autorização).
- Configuração principal:
- Prefixos:
/cliente-service,/produto-service,/pedido-service - StripPrefix: Remove o prefixo antes de encaminhar para o respectivo serviço via
lb://<service-name>
- Prefixos:
- Porta interna:
8081 - Função: CRUD de clientes.
- Banco: PostgreSQL.
- URL via Gateway:
http://localhost:8765/cliente-service/clientes
- Porta interna:
8080 - Função: CRUD de produtos e controle de estoque.
- Banco: PostgreSQL.
- URL via Gateway:
http://localhost:8765/produto-service/produtos
- Porta interna:
8082 - Função: Gerenciamento de pedidos, integrando com Cliente e Produto.
- Banco: PostgreSQL.
- URL via Gateway:
http://localhost:8765/pedido-service/pedidos
- As rotas internas não são acessíveis diretamente (ex:
localhost:8080/produtosestá bloqueado). - Toda comunicação externa deve passar pelo API Gateway, que valida autenticação, aplica políticas e redireciona para o serviço correto.
- O sistema utiliza Eureka para descoberta de serviços e balanceamento de carga.
A segurança é implementada utilizando Spring Security e JWT. O Auth Server é responsável por emitir os tokens JWT após a autenticação bem-sucedida. O API Gateway intercepta as requisições, valida os JWTs e garante que apenas usuários autorizados acessem os recursos dos microsserviços.
Contribuições são bem-vindas! Sinta-se à vontade para abrir issues e pull requests.