{"id":45436444,"url":"https://github.com/endrigogustavo/kafka-spring","last_synced_at":"2026-02-27T08:01:12.037Z","repository":{"id":339780207,"uuid":"1162773108","full_name":"Endrigogustavo/Kafka-Spring","owner":"Endrigogustavo","description":"Sistema desenvolvido com o objetivo de aprimorar técnicas avançadas de modelagem de dados, aplicando boas práticas de normalização, definição de entidades e relacionamentos, e organização estratégica de estruturas para garantir escalabilidade e performance.","archived":false,"fork":false,"pushed_at":"2026-02-22T02:11:07.000Z","size":110,"stargazers_count":4,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"producao","last_synced_at":"2026-02-24T09:23:09.376Z","etag":null,"topics":["event-driven","grafana","h2-database","java","kafka","loki","prometheus","spring-boot"],"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/Endrigogustavo.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":"2026-02-20T17:16:45.000Z","updated_at":"2026-02-23T12:04:35.000Z","dependencies_parsed_at":"2026-02-23T04:01:55.529Z","dependency_job_id":null,"html_url":"https://github.com/Endrigogustavo/Kafka-Spring","commit_stats":null,"previous_names":["endrigogustavo/kafka-spring"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/Endrigogustavo/Kafka-Spring","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Endrigogustavo%2FKafka-Spring","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Endrigogustavo%2FKafka-Spring/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Endrigogustavo%2FKafka-Spring/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Endrigogustavo%2FKafka-Spring/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Endrigogustavo","download_url":"https://codeload.github.com/Endrigogustavo/Kafka-Spring/tar.gz/refs/heads/producao","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Endrigogustavo%2FKafka-Spring/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29811860,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-25T05:36:42.804Z","status":"ssl_error","status_checked_at":"2026-02-25T05:36:31.934Z","response_time":61,"last_error":"SSL_read: 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":["event-driven","grafana","h2-database","java","kafka","loki","prometheus","spring-boot"],"created_at":"2026-02-22T03:09:10.335Z","updated_at":"2026-02-27T08:01:11.989Z","avatar_url":"https://github.com/Endrigogustavo.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Kafka Integrador (Spring Boot + Kafka)\n\nIntegrador event-driven com arquitetura limpa para processamento de **Pedidos**, **Notas Fiscais** e **Eventos Genéricos**, com trilhas de **retry** e **DLQ**, além de observabilidade com Prometheus, Grafana e Loki.\n\n## Stack\n\n- Java 21\n- Spring Boot 3.3.4\n- Spring Kafka\n- Spring Data JPA + H2 (in-memory)\n- Resilience4j (CircuitBreaker, Retry, Bulkhead, RateLimiter)\n- Actuator + Micrometer + Prometheus\n- Grafana + Loki\n- Docker Compose\n\n## Arquitetura (atual)\n\nEstrutura principal por camadas:\n\n- `adapter`\n  - Controllers REST e DTOs de entrada/saída.\n- `application`\n  - Use cases, gateways (ports), serviços de aplicação e métricas.\n- `domain`\n  - Modelos e entidades de negócio.\n- `frameworkDrivers`\n  - Kafka (consumers/producers), configurações e detalhes de infraestrutura.\n\n### Fluxo resumido\n\n1. API recebe pedido/nota.\n2. Use case publica evento no tópico `integrador.\u003crecurso\u003e.recebido`.\n3. Consumer processa, persiste e publica em `integrador.\u003crecurso\u003e.processado`.\n4. Em falha técnica no processamento inicial: `DefaultErrorHandler` envia para `integrador.\u003crecurso\u003e.retry`.\n5. Em falha durante reprocessamento (ou erro de validação): mensagem segue para `integrador.\u003crecurso\u003e.dlq`.\n6. Falhas de pedido/nota ficam registradas em memória e podem ser reprocessadas/descartadas via API.\n\n## Convenção de tópicos\n\nPadrão: `integrador.\u003crecurso\u003e.\u003cestado\u003e`\n\n- Domínio: `integrador`\n- Recursos: `evento`, `pedido`, `nota`\n- Estados: `recebido`, `processado`, `retry`, `dlq`\n\n### Tópicos usados no projeto\n\n| Recurso | Recebido | Processado | Retry | DLQ |\n|---|---|---|---|---|\n| evento | `integrador.evento.recebido` | `integrador.evento.processado` | `integrador.evento.retry` | `integrador.evento.dlq` |\n| pedido | `integrador.pedido.recebido` | `integrador.pedido.processado` | `integrador.pedido.retry` | `integrador.pedido.dlq` |\n| nota | `integrador.nota.recebido` | `integrador.nota.processado` | `integrador.nota.retry` | `integrador.nota.dlq` |\n\n## Endereços e portas\n\nCom `docker compose up -d`:\n\n- Kafka: `localhost:9092`\n- Kafka UI: `http://localhost:8090`\n- Prometheus: `http://localhost:9090`\n- Grafana: `http://localhost:3000` (admin/admin)\n- Loki: `http://localhost:3100`\n\nAplicação Spring Boot:\n\n- API: `http://localhost:8082`\n- Swagger UI: `http://localhost:8082/swagger-ui.html`\n- OpenAPI JSON: `http://localhost:8082/v3/api-docs`\n- Actuator Health: `http://localhost:8082/actuator/health`\n- Actuator Prometheus: `http://localhost:8082/actuator/prometheus`\n\n## Como executar\n\n### 1) Subir infraestrutura\n\n```bash\ndocker compose up -d\n```\n\n### 2) Rodar aplicação\n\nWindows (PowerShell):\n\n```powershell\n.\\mvnw.cmd spring-boot:run\n```\n\nLinux/Mac:\n\n```bash\n./mvnw spring-boot:run\n```\n\n### 3) Rodar testes\n\nWindows:\n\n```powershell\n.\\mvnw.cmd test\n```\n\nLinux/Mac:\n\n```bash\n./mvnw test\n```\n\n## Rotas da API (100% atualizadas)\n\n### Pedidos (`/api/pedidos`)\n\n- `POST /api/pedidos`\n  - Cria pedido e publica em `integrador.pedido.recebido`.\n- `POST /api/pedidos/teste-carga?quantidade=1000`\n  - Dispara carga sintética de pedidos e retorna métricas.\n- `GET /api/pedidos/consumidos?limite=50`\n  - Lista pedidos processados mantidos em memória.\n- `GET /api/pedidos/h2/find-all`\n  - Lista pedidos persistidos no H2.\n\nPayload (`POST /api/pedidos`):\n\n```json\n{\n  \"numeroPedido\": \"PED-12345\",\n  \"cliente\": \"Cliente A\",\n  \"produto\": \"Notebook\",\n  \"quantidade\": 1,\n  \"valorTotal\": \"3500.00\"\n}\n```\n\n### Notas Fiscais (`/api/notas`)\n\n- `POST /api/notas`\n  - Cria nota fiscal e publica em `integrador.nota.recebido`.\n- `GET /api/notas/consumidas?limite=50`\n  - Lista notas fiscais processadas mantidas em memória.\n- `GET /api/notas/h2/find-all`\n  - Lista notas fiscais persistidas no H2.\n\nPayload (`POST /api/notas`):\n\n```json\n{\n  \"numeroNota\": \"NF-12345\",\n  \"cliente\": \"Cliente A\",\n  \"produto\": \"Notebook\",\n  \"quantidade\": 1,\n  \"valorTotal\": \"3500.00\"\n}\n```\n\n### Reprocessamento (`/api/reprocessamento`)\n\n- `GET /api/reprocessamento/falhas?tipo=PEDIDO|NOTA\u0026status=PENDENTE_REPROCESSAMENTO\u0026limite=100`\n  - Lista falhas registradas para análise.\n- `POST /api/reprocessamento/falhas/{id}/reprocessar`\n  - Republica evento para tópico de entrada (`recebido`) e atualiza status.\n- `POST /api/reprocessamento/falhas/{id}/descartar`\n  - Marca falha como descartada (não reprocessar).\n\nStatus possíveis de falha:\n\n- `PENDENTE_REPROCESSAMENTO`\n- `REPROCESSADO`\n- `ESGOTADO`\n- `DESCARTADO`\n\n## Teste rápido de fluxo Kafka\n\nEntrar no container Kafka:\n\n```bash\ndocker exec -it kafka bash\n```\n\nProduzir evento genérico:\n\n```bash\nkafka-console-producer \\\n  --bootstrap-server localhost:9092 \\\n  --topic integrador.evento.recebido\n```\n\nConsumir saída processada:\n\n```bash\nkafka-console-consumer \\\n  --bootstrap-server localhost:9092 \\\n  --topic integrador.evento.processado \\\n  --from-beginning\n```\n\nConsumir retry:\n\n```bash\nkafka-console-consumer \\\n  --bootstrap-server localhost:9092 \\\n  --topic integrador.evento.retry \\\n  --from-beginning\n```\n\nConsumir DLQ:\n\n```bash\nkafka-console-consumer \\\n  --bootstrap-server localhost:9092 \\\n  --topic integrador.evento.dlq \\\n  --from-beginning\n```\n\n## Configurações importantes\n\nArquivo: `src/main/resources/application.yaml`\n\n- `server.port: 8082`\n- `spring.kafka.listener.ack-mode: manual_immediate`\n- `integrador.topico.*`: nomes dos tópicos\n- `integrador.reprocessamento.max-tentativas: 5`\n- `integrador.reprocessamento.intervalo-segundos: 60`\n- `integrador.historico.falhas.limite: 2000`\n\n## Observabilidade\n\n- Métricas: `/actuator/metrics` e `/actuator/prometheus`\n- Circuit breakers: `/actuator/circuitbreakers`\n- Retries: `/actuator/retries`\n- Logs centralizados: Loki (`LOKI_URL`)\n- Dashboard: import automático em Grafana via `docker/grafana/provisioning`\n\n## Produção (profile `prod`)\n\nVariáveis principais:\n\n- `SPRING_PROFILES_ACTIVE=prod`\n- `KAFKA_BROKERS=\u003cbrokers\u003e`\n- `APP_ENV=prod`\n- `LOKI_URL=http://loki:3100/loki/api/v1/push`\n\nNo profile `prod`, `show-details` do health é reduzido para não expor detalhes internos.\n\n## Estrutura de diretórios (resumo)\n\n```text\nsrc/main/java/com/integracao/kafka/\n  adapter/\n    controller/\n    dto/\n  application/\n    gateway/\n    metrics/\n    service/\n    useCase/\n  domain/\n    entity/\n    model/\n  frameworkDrivers/\n    config/\n    kafka/\n      consumer/\n      producer/\n```\n\n## Próximos incrementos recomendados\n\n- Persistir histórico de falhas em banco (hoje está em memória).\n- Implementar Outbox Pattern no fallback do producer.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fendrigogustavo%2Fkafka-spring","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fendrigogustavo%2Fkafka-spring","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fendrigogustavo%2Fkafka-spring/lists"}