Kafka in Spring Boot


1. Prerequisites

  • Java 17+ installed
  • Spring Boot 3.x
  • Kafka running locally or via Docker

If you want a quick Kafka setup using Docker:

docker run -d --name zookeeper -p 2181:2181 zookeeper:3.8
docker run -d --name kafka -p 9092:9092 --env KAFKA_ZOOKEEPER_CONNECT=host.docker.internal:2181 --env KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://localhost:9092 bitnami/kafka:latest

2. Create Spring Boot Project

Use Spring Initializr:

  • Dependencies: Spring Web, Spring for Apache Kafka

3. Add Kafka Dependencies (if not already)

<dependency>
    <groupId>org.springframework.kafka</groupId>
    <artifactId>spring-kafka</artifactId>
</dependency>

4. Configure Kafka in application.yml

spring:
  kafka:
    bootstrap-servers: localhost:9092
    consumer:
      group-id: my-group
      auto-offset-reset: earliest
      key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
      value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
    producer:
      key-serializer: org.apache.kafka.common.serialization.StringSerializer
      value-serializer: org.apache.kafka.common.serialization.StringSerializer

5. Create Kafka Producer

import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.stereotype.Service;

@Service
public class KafkaProducer {

    private final KafkaTemplate<String, String> kafkaTemplate;

    public KafkaProducer(KafkaTemplate<String, String> kafkaTemplate) {
        this.kafkaTemplate = kafkaTemplate;
    }

    public void sendMessage(String topic, String message) {
        kafkaTemplate.send(topic, message);
        System.out.println("Sent: " + message);
    }
}

6. Create Kafka Consumer

import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.stereotype.Service;

@Service
public class KafkaConsumer {

    @KafkaListener(topics = "test-topic", groupId = "my-group")
    public void listen(String message) {
        System.out.println("Received: " + message);
    }
}

7. Create a REST Controller to Send Messages

import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/kafka")
public class KafkaController {

    private final KafkaProducer producer;

    public KafkaController(KafkaProducer producer) {
        this.producer = producer;
    }

    @PostMapping("/publish")
    public String sendMessage(@RequestParam String message) {
        producer.sendMessage("test-topic", message);
        return "Message sent to Kafka: " + message;
    }
}

8. Run the Application

  1. Start Spring Boot app.
  2. Send a POST request:
curl -X POST "http://localhost:8080/kafka/publish?message=HelloKafka"

You should see:

Sent: HelloKafka
Received: HelloKafka

What this example demonstrates:

  • A Spring Boot Kafka producer sends messages to a topic.
  • A Spring Boot Kafka consumer listens to the topic and prints messages.
  • REST API triggers Kafka message production.

Leave a Reply