{"id":31287712,"url":"https://github.com/ddouglss/microservice-spring-cloud","last_synced_at":"2026-04-14T14:31:13.940Z","repository":{"id":316175984,"uuid":"1062281930","full_name":"ddouglss/microservice-spring-cloud","owner":"ddouglss","description":"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.","archived":false,"fork":false,"pushed_at":"2025-09-23T04:19:15.000Z","size":18,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-09-23T06:15:41.396Z","etag":null,"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"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ddouglss.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-09-23T04:00:34.000Z","updated_at":"2025-09-23T04:24:41.000Z","dependencies_parsed_at":"2025-09-23T06:15:55.277Z","dependency_job_id":"25b81d2c-a4e4-4581-8c62-380d8cbb4ed3","html_url":"https://github.com/ddouglss/microservice-spring-cloud","commit_stats":null,"previous_names":["ddouglss/microservice-spring-cloud"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/ddouglss/microservice-spring-cloud","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ddouglss%2Fmicroservice-spring-cloud","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ddouglss%2Fmicroservice-spring-cloud/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ddouglss%2Fmicroservice-spring-cloud/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ddouglss%2Fmicroservice-spring-cloud/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ddouglss","download_url":"https://codeload.github.com/ddouglss/microservice-spring-cloud/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ddouglss%2Fmicroservice-spring-cloud/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31801219,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-14T11:13:53.975Z","status":"ssl_error","status_checked_at":"2026-04-14T11:13:53.299Z","response_time":153,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["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"],"created_at":"2025-09-24T11:04:00.873Z","updated_at":"2026-04-14T14:31:13.921Z","avatar_url":"https://github.com/ddouglss.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Projeto de Microsserviços com Spring Cloud e Docker\n\nEste é 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.\n\nO projeto é composto por três serviços principais que são orquestrados e containerizados com Docker e Docker Compose.\n\n---\n\n## 🏛️ Arquitetura\n\nA arquitetura é dividida nos seguintes microsserviços:\n\n1.  **`service-main` (Porta: 8888)**\n    -   **Função:** Atua como o pilar de infraestrutura da arquitetura.\n    -   **Componentes:**\n        -   **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.\n        -   **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.\n\n2.  **`service-tasks` (Porta: 8081)**\n    -   **Função:** Serviço principal de negócio, responsável por gerenciar as tarefas.\n    -   **Funcionalidades:**\n        -   Expõe um endpoint `POST /tasks` para criar novas tarefas.\n        -   Utiliza um banco de dados em memória (H2) para persistir as tarefas.\n        -   Possui um agendador (`@Scheduled`) que verifica periodicamente as tarefas com prazo próximo.\n        -   Usa **OpenFeign** para se comunicar de forma declarativa com o `service-notification`.\n\n3.  **`service-notification` (Porta: 8082)**\n    -   **Função:** Serviço simples responsável por processar e enviar notificações.\n    -   **Funcionalidades:**\n        -   Expõe um endpoint `POST /notification` que recebe os detalhes da notificação.\n        -   Na implementação atual, ele apenas exibe a mensagem de notificação no console do contêiner.\n\n---\n\n## 🛠️ Tecnologias Utilizadas\n\n-   **Linguagem/Framework:** Java 21, Spring Boot 3.5.5\n-   **Ecossistema Spring Cloud:**\n    -   **`Spring Cloud Netflix Eureka`**: Para Service Discovery.\n    -   **`Spring Cloud Config`**: Para gerenciamento centralizado de configurações.\n    -   **`Spring Cloud OpenFeign`**: Para comunicação síncrona e declarativa entre serviços.\n-   **Banco de Dados:** H2 Database (In-Memory)\n-   **Containerização:** Docker e Docker Compose\n-   **Build Tool:** Maven\n-   **Outros:** Spring Data JPA, Lombok.\n\n---\n\n## 🌊 Fluxo de Execução Principal\n\n1.  **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).\n2.  **Persistência:** O `service-tasks` recebe a requisição, cria uma `TaskEntity` e a salva no banco de dados H2.\n3.  **Agendamento:** A cada minuto, o `TaskNotificationSchedule` dentro do `service-tasks` é acionado.\n4.  **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.\n5.  **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`.\n6.  **Envio da Notificação:** O `service-notification` recebe a chamada e imprime a mensagem de notificação no seu log, simulando o envio.\n7.  **Atualização de Status:** O `service-tasks` marca a tarefa como notificada (`notified = true`) para evitar o reenvio de notificações.\n\n---\n\n## 🚀 Como Executar o Projeto\n\nCertifique-se de ter os seguintes pré-requisitos instalados em sua máquina:\n-   Git\n-   Java 21 (ou superior)\n-   Maven\n-   Docker\n-   Docker Compose\n\n### Passos para Execução\n\n1.  **Clone o repositório:**\n    ```bash\n    git clone \u003cURL_DO_SEU_REPOSITORIO\u003e\n    cd \u003cNOME_DO_DIRETORIO\u003e\n    ```\n\n2.  **Suba os contêineres com Docker Compose:**\n    Navegue até o diretório raiz do projeto (onde o arquivo `docker-compose.yml` está localizado) e execute o seguinte comando:\n    ```bash\n    docker-compose up --build\n    ```\n    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`.\n\n3.  **Verifique se os serviços estão de pé:**\n    -   **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.\n    -   **Logs dos Contêineres:** Você pode acompanhar os logs de cada serviço no terminal onde o `docker-compose` está rodando.\n\n---\n\n## 📡 Endpoints da API\n\n### Service Main\n-   **Eureka Dashboard:** `http://localhost:8888`\n-   **Config Server (para `service-tasks`):** `http://localhost:8888/config/service-tasks/default`\n\n### Service Tasks\n-   **Criar uma nova tarefa:**\n    -   `POST http://localhost:8081/tasks`\n    -   **Exemplo de Body (JSON):**\n        ```json\n        {\n          \"title\": \"Finalizar o relatório trimestral\",\n          \"email\": \"usuario@exemplo.com\",\n          \"dueDate\": \"2025-09-24T10:00:00\",\n          \"notified\": false\n        }\n        ```\n-   **Console do Banco H2:** `http://localhost:8081/h2-console`\n    -   **JDBC URL:** `jdbc:h2:mem:testdb`\n    -   **User Name:** `sa`\n    -   **Password:** (deixe em branco)\n\n---\n\n## 💡 Pontos de Melhoria\n\n-   **API Gateway:** Adicionar um **Spring Cloud Gateway** como ponto de entrada único para o sistema, gerenciando rotas, segurança e rate limiting.\n-   **Banco de Dados Persistente:** Substituir o H2 por um banco de dados como PostgreSQL ou MySQL para persistir os dados.\n-   **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`.\n-   **Segurança:** Implementar autenticação e autorização usando Spring Security com OAuth2/JWT.\n-   **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).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fddouglss%2Fmicroservice-spring-cloud","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fddouglss%2Fmicroservice-spring-cloud","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fddouglss%2Fmicroservice-spring-cloud/lists"}