Dead-letter Topico com Spring Kafka e formato de dados Avro.
- JDK 11
- Apache Maven 3.6+
- Docker 19+
- Acesso ao repositório https://repo.maven.apache.org/maven2/ ou uma
alternativa com acesso às dependências presentes no
pom.xml
- Schema Registry
- Kafka
- Testcontainers
- Lombok
- Commons Lang3
Não se preocupe, pois apesar de existirem atalhos pelas variávies de ambiente, você pode utilizar tranquilamente aquilo que o Spring Boot oferece. Então veja todos as propriedades no application.properties
No caso do Kafka, utilizamos Spring Kafka, então você utilizar o modo Spring para configurações.
-
APP_KAFKA_CONSUMER_TOPICS
: tópicos para consumir, ou expressão. -
KAFKA_CLIENT_ID
: nome do cliente Kafka, usado pelos brokers para logs e métricas. Utilize um nome clean, não genérico.spring.kafka.producer.client-id
,spring.kafka.consumer.client-id
-
KAFKA_CONSUMER_GROUP
: nome do grupo de consumo que esta aplicação pertencespring.kafka.consumer.group-id
-
KAFKA_BOOTSTRAP_SERVERS
: lista de brokers para o cluster Kafkaspring.kafka.bootstrap-servers
-
SCHEMA_REGISTRY_URL
: url para o registro de esquemas Avrospring.kafka.properties.schema.registry.url
-
KAFKA_FAIL_WHEN_MISSING_TOPICS
(true
|false
): configuretrue
em ambientes restritos, onde a criação automática de tópicos é bloqueada. Assim a aplicação só iniciará se eles existirem.spring.kafka.listener.missing-topics-fatal
-
APP_LOG_LEVEL
(opcional): nível de registro para logs. Padrão éINFO
Tabela com os níveis de registro e sua hierarquia:
APP_LOG_LEVEL |
TRACE | DEBUG | INFO | WARN | ERROR |
---|---|---|---|---|---|
TRACE | sim | não | não | não | não |
DEBUG | sim | sim | não | não | não |
INFO | sim | sim | sim | não | não |
WARN | sim | sim | sim | sim | não |
ERROR | sim | sim | sim | sim | sim |
-
APP_LOG_PATTERN
(opcional): padrão do registro de logs. Esse padrão segue o formato documentado aqui, porém, veja um exemplo na configuração logback.groovy -
APP_LOG_LOGGERS
(opcional): para configurar níveis de log de loggers presentes nas dependências da aplicação.
# logger_1:LEVEL,logger_2:LEVEL,...
APP_LOG_LOGGERS='io.netty:ERROR,org.springframework:ERROR'
Depois de utilizar uma das duas formas para build & run, a documentação swagger estará disponível em:
Para montar o fatjar, execute o comando:
mvn clean package
Para rodar e iniciar a aplicação na porta 38002
:
Utilize o docker-compose e inicie todos os serviços para testes
O exemplo abaixo também está disponível no script run.sh.
# Exemplo de execução
APP_KAFKA_CONSUMER_TOPICS='some-event-t' \
KAFKA_CLIENT_ID='spring-kafka-dlt-ex' \
KAFKA_CONSUMER_GROUP='spring-kafka-dlt-ex' \
KAFKA_BOOTSTRAP_SERVERS='localhost:9092' \
SCHEMA_REGISTRY_URL='http://localhost:8081' \
KAFKA_FAIL_WHEN_MISSING_TOPICS='false' \
java -Dserver.port='38002' -jar target/app-spring-boot.jar
A definição Dockerfile desta aplicação emprega multi-stage builds. Isso significa que nela acontece o build da aplicação e a criação da imagem.
Se for necessário somente a criar a imagem, pode-se utilizar a definição Dockerfile-image. Mas antes é necessário montar o fatjar através do maven.
Para build do fatjar e montar a imagem, execute o comando:
docker build . -t spring-kafka-dlt-ex:1.0
Para montar apenas a imagem (antes é necessário o build do maven):
docker build -f Dockerfile-image . -t spring-kafka-dlt-ex:1.0
Para rodar o container:
Utilize o docker-compose e inicie todos os serviços para testes
docker run -p 8080:8080 \
-i --rm \
-e APP_KAFKA_CONSUMER_TOPICS='some-event-t' \
-e KAFKA_CLIENT_ID='spring-kafka-dlt-ex' \
-e KAFKA_CONSUMER_GROUP='spring-kafka-dlt-ex' \
-e KAFKA_BOOTSTRAP_SERVERS='localhost:9092' \
-e SCHEMA_REGISTRY_URL='http://localhost:8081' \
-e KAFKA_FAIL_WHEN_MISSING_TOPICS='false' \
spring-kafka-dlt-ex:1.0
- Executar os testes
mvn clean test
- Acessar o relatório:
target/site/jacoco/index.html
Health Checks
Essas são configurações comuns quando a implantação do aplicação é feita em container, especificamente no Kubernetes.
-
/actuator/info
-
/actuator/health
Neste repositório existe o arquivo docker-compose.yaml, que inicia todas as partes móveis que a aplicação depende.
Iniciar a stack:
docker-compose up
Serviços presentes na stack
- Kafka:
localhost:9092
- Jaeger UI:
http://localhost:16686