An open API service indexing awesome lists of open source software.

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.

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).