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.
A arquitetura é dividida nos seguintes microsserviços:
-
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.
- Eureka Server: Responsável pelo registro e descoberta de serviços (
-
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
.
- Expõe um endpoint
-
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.
- Expõe um endpoint
- 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.
- Criação da Tarefa: Um usuário envia uma requisição
POST
parahttp://localhost:8081/tasks
com os detalhes da tarefa (título, e-mail, prazo). - Persistência: O
service-tasks
recebe a requisição, cria umaTaskEntity
e a salva no banco de dados H2. - Agendamento: A cada minuto, o
TaskNotificationSchedule
dentro doservice-tasks
é acionado. - 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.
- Comunicação Inter-serviços: Para cada tarefa encontrada, o
service-tasks
utiliza seu cliente OpenFeign (NotificationClient
) para fazer uma chamadaPOST
para o endpoint/notification
doservice-notification
. - Envio da Notificação: O
service-notification
recebe a chamada e imprime a mensagem de notificação no seu log, simulando o envio. - Atualização de Status: O
service-tasks
marca a tarefa como notificada (notified = true
) para evitar o reenvio de notificações.
Certifique-se de ter os seguintes pré-requisitos instalados em sua máquina:
- Git
- Java 21 (ou superior)
- Maven
- Docker
- Docker Compose
-
Clone o repositório:
git clone <URL_DO_SEU_REPOSITORIO> cd <NOME_DO_DIRETORIO>
-
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: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
. -
Verifique se os serviços estão de pé:
- Painel do Eureka Server: Acesse
http://localhost:8888
em seu navegador. Você deverá verSERVICE-TASKS
eSERVICE-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.
- Painel do Eureka Server: Acesse
- Eureka Dashboard:
http://localhost:8888
- Config Server (para
service-tasks
):http://localhost:8888/config/service-tasks/default
- Criar uma nova tarefa:
POST http://localhost:8081/tasks
- Exemplo de Body (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)
- JDBC URL:
- 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, como3600000
(1 hora).