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 /taskspara 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 /notificationque 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
POSTparahttp://localhost:8081/taskscom os detalhes da tarefa (título, e-mail, prazo). - Persistência: O
service-tasksrecebe a requisição, cria umaTaskEntitye a salva no banco de dados H2. - Agendamento: A cada minuto, o
TaskNotificationScheduledentro 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-tasksutiliza seu cliente OpenFeign (NotificationClient) para fazer uma chamadaPOSTpara o endpoint/notificationdoservice-notification. - Envio da Notificação: O
service-notificationrecebe a chamada e imprime a mensagem de notificação no seu log, simulando o envio. - Atualização de Status: O
service-tasksmarca 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.ymlestá 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:8888em seu navegador. Você deverá verSERVICE-TASKSeSERVICE-NOTIFICATIONregistrados na lista de instâncias. - Logs dos Contêineres: Você pode acompanhar os logs de cada serviço no terminal onde o
docker-composeestá 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
fixedRateno@Scheduledestá configurado para um valor muito baixo (60 milissegundos). Para um cenário real, o ideal seria um valor maior, como3600000(1 hora).