https://github.com/ddouglss/microservice-spring-cloud
Arquitetura de microsserviços utilizando o ecossistema Spring Cloud. O projeto é composto por três serviços principais que são orquestrados e containerizados com Dockerfile e Docker Compose.
https://github.com/ddouglss/microservice-spring-cloud
docker docker-compose h2-database java-21 lombok maven postman spring-boot spring-cloud spring-cloud-config spring-cloud-eureka spring-cloud-netflix springdata-jpa
Last synced: 16 days ago
JSON representation
Arquitetura de microsserviços utilizando o ecossistema Spring Cloud. O projeto é composto por três serviços principais que são orquestrados e containerizados com Dockerfile e Docker Compose.
- Host: GitHub
- URL: https://github.com/ddouglss/microservice-spring-cloud
- Owner: ddouglss
- Created: 2025-09-23T04:00:34.000Z (17 days ago)
- Default Branch: main
- Last Pushed: 2025-09-23T04:19:15.000Z (17 days ago)
- Last Synced: 2025-09-23T06:15:41.396Z (17 days ago)
- Topics: docker, docker-compose, h2-database, java-21, lombok, maven, postman, spring-boot, spring-cloud, spring-cloud-config, spring-cloud-eureka, spring-cloud-netflix, springdata-jpa
- Language: Java
- Homepage:
- Size: 17.6 KB
- Stars: 0
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Projeto de Microsserviços com Spring Cloud e Docker
Este é um projeto de demonstração que implementa uma arquitetura de microsserviços utilizando o ecossistema Spring Cloud. O objetivo é simular um sistema de gerenciamento de tarefas que notifica os usuários sobre prazos iminentes.
O projeto é composto por três serviços principais que são orquestrados e containerizados com Docker e Docker Compose.
---
## 🏛️ Arquitetura
A arquitetura é dividida nos seguintes microsserviços:
1. **`service-main` (Porta: 8888)**
- **Função:** Atua como o pilar de infraestrutura da arquitetura.
- **Componentes:**
- **Eureka Server:** Responsável pelo registro e descoberta de serviços (`Service Discovery`). Todos os outros microsserviços se registram no Eureka para que possam se comunicar uns com os outros usando os nomes dos serviços em vez de IPs e portas fixas.
- **Spring Cloud Config Server:** Centraliza a configuração de todos os microsserviços. As configurações são carregadas a partir de um repositório Git externo, permitindo a alteração de propriedades sem a necessidade de reconstruir as aplicações.2. **`service-tasks` (Porta: 8081)**
- **Função:** Serviço principal de negócio, responsável por gerenciar as tarefas.
- **Funcionalidades:**
- Expõe um endpoint `POST /tasks` para criar novas tarefas.
- Utiliza um banco de dados em memória (H2) para persistir as tarefas.
- Possui um agendador (`@Scheduled`) que verifica periodicamente as tarefas com prazo próximo.
- Usa **OpenFeign** para se comunicar de forma declarativa com o `service-notification`.3. **`service-notification` (Porta: 8082)**
- **Função:** Serviço simples responsável por processar e enviar notificações.
- **Funcionalidades:**
- Expõe um endpoint `POST /notification` que recebe os detalhes da notificação.
- Na implementação atual, ele apenas exibe a mensagem de notificação no console do contêiner.---
## 🛠️ Tecnologias Utilizadas
- **Linguagem/Framework:** Java 21, Spring Boot 3.5.5
- **Ecossistema Spring Cloud:**
- **`Spring Cloud Netflix Eureka`**: Para Service Discovery.
- **`Spring Cloud Config`**: Para gerenciamento centralizado de configurações.
- **`Spring Cloud OpenFeign`**: Para comunicação síncrona e declarativa entre serviços.
- **Banco de Dados:** H2 Database (In-Memory)
- **Containerização:** Docker e Docker Compose
- **Build Tool:** Maven
- **Outros:** Spring Data JPA, Lombok.---
## 🌊 Fluxo de Execução Principal
1. **Criação da Tarefa:** Um usuário envia uma requisição `POST` para `http://localhost:8081/tasks` com os detalhes da tarefa (título, e-mail, prazo).
2. **Persistência:** O `service-tasks` recebe a requisição, cria uma `TaskEntity` e a salva no banco de dados H2.
3. **Agendamento:** A cada minuto, o `TaskNotificationSchedule` dentro do `service-tasks` é acionado.
4. **Verificação de Prazos:** O agendador consulta o banco de dados em busca de tarefas que estão próximas do vencimento e que ainda não foram notificadas.
5. **Comunicação Inter-serviços:** Para cada tarefa encontrada, o `service-tasks` utiliza seu cliente OpenFeign (`NotificationClient`) para fazer uma chamada `POST` para o endpoint `/notification` do `service-notification`.
6. **Envio da Notificação:** O `service-notification` recebe a chamada e imprime a mensagem de notificação no seu log, simulando o envio.
7. **Atualização de Status:** O `service-tasks` marca a tarefa como notificada (`notified = true`) para evitar o reenvio de notificações.---
## 🚀 Como Executar o Projeto
Certifique-se de ter os seguintes pré-requisitos instalados em sua máquina:
- Git
- Java 21 (ou superior)
- Maven
- Docker
- Docker Compose### Passos para Execução
1. **Clone o repositório:**
```bash
git clone
cd
```2. **Suba os contêineres com Docker Compose:**
Navegue até o diretório raiz do projeto (onde o arquivo `docker-compose.yml` está localizado) e execute o seguinte comando:
```bash
docker-compose up --build
```
Este comando irá construir as imagens Docker para cada serviço e iniciar os contêineres na ordem correta, respeitando as dependências definidas no `docker-compose.yml`.3. **Verifique se os serviços estão de pé:**
- **Painel do Eureka Server:** Acesse `http://localhost:8888` em seu navegador. Você deverá ver `SERVICE-TASKS` e `SERVICE-NOTIFICATION` registrados na lista de instâncias.
- **Logs dos Contêineres:** Você pode acompanhar os logs de cada serviço no terminal onde o `docker-compose` está rodando.---
## 📡 Endpoints da API
### Service Main
- **Eureka Dashboard:** `http://localhost:8888`
- **Config Server (para `service-tasks`):** `http://localhost:8888/config/service-tasks/default`### Service Tasks
- **Criar uma nova tarefa:**
- `POST http://localhost:8081/tasks`
- **Exemplo de Body (JSON):**
```json
{
"title": "Finalizar o relatório trimestral",
"email": "usuario@exemplo.com",
"dueDate": "2025-09-24T10:00:00",
"notified": false
}
```
- **Console do Banco H2:** `http://localhost:8081/h2-console`
- **JDBC URL:** `jdbc:h2:mem:testdb`
- **User Name:** `sa`
- **Password:** (deixe em branco)---
## 💡 Pontos de Melhoria
- **API Gateway:** Adicionar um **Spring Cloud Gateway** como ponto de entrada único para o sistema, gerenciando rotas, segurança e rate limiting.
- **Banco de Dados Persistente:** Substituir o H2 por um banco de dados como PostgreSQL ou MySQL para persistir os dados.
- **Sistema de Notificação Real:** Implementar uma lógica de envio de e-mails (usando JavaMailSender) ou mensagens (integrando com RabbitMQ/Kafka) no `service-notification`.
- **Segurança:** Implementar autenticação e autorização usando Spring Security com OAuth2/JWT.
- **Configuração do Agendador:** O `fixedRate` no `@Scheduled` está configurado para um valor muito baixo (60 milissegundos). Para um cenário real, o ideal seria um valor maior, como `3600000` (1 hora).