Build a Docker‑Based Kafka Cluster and Integrate It with Spring Boot
This guide walks you through creating a three‑node Kafka cluster with Zookeeper using Docker‑Compose, configuring the necessary YAML, launching the containers, and then integrating the cluster into a Spring Boot application by adding dependencies, setting Kafka properties, defining message, sender, and receiver classes, and testing the message flow.
Versions
JDK 14, Zookeeper, Kafka
Install Zookeeper and Kafka
Kafka depends on Zookeeper, so set up a Docker‑Compose file and replace the host address 192.168.1.100 with your own.
version: "3"
services:
zookeeper:
image: zookeeper
container_name: zookeeper
ports:
- "2181:2181"
volumes:
- ./data/zookeeper/data:/data
- ./data/zookeeper/datalog:/datalog
- ./data/zookeeper/logs:/logs
restart: always
kafka_node_0:
depends_on:
- zookeeper
container_name: kafka-node-0
image: wurstmeister/kafka
environment:
KAFKA_BROKER_ID: 0
KAFKA_ZOOKEEPER_CONNECT: 192.168.1.100:2181
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://192.168.1.100:9092
KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092
KAFKA_NUM_PARTITIONS: 3
KAFKA_DEFAULT_REPLICATION_FACTOR: 2
ports:
- "9092:9092"
volumes:
- ./data/kafka/node_0:/kafka
restart: unless-stopped
kafka_node_1:
depends_on:
- kafka_node_0
container_name: kafka-node-1
image: wurstmeister/kafka
environment:
KAFKA_BROKER_ID: 1
KAFKA_ZOOKEEPER_CONNECT: 192.168.1.100:2181
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://192.168.1.100:9093
KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9093
KAFKA_NUM_PARTITIONS: 3
KAFKA_DEFAULT_REPLICATION_FACTOR: 2
ports:
- "9093:9093"
volumes:
- ./data/kafka/node_1:/kafka
restart: unless-stopped
kafka_node_2:
depends_on:
- kafka_node_1
container_name: kafka-node_2
image: wurstmeister/kafka
environment:
KAFKA_BROKER_ID: 2
KAFKA_ZOOKEEPER_CONNECT: 192.168.1.100:2181
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://192.168.1.100:9094
KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9094
KAFKA_NUM_PARTITIONS: 3
KAFKA_DEFAULT_REPLICATION_FACTOR: 2
ports:
- "9094:9094"
volumes:
- ./data/kafka/node_2:/kafka
restart: unless-stoppedRun docker-compose up -d and wait until the containers start successfully.
Spring Boot Integration
Add the required dependencies to build.gradle:
dependencies {
// other dependencies …
implementation 'org.springframework.kafka:spring-kafka:2.5.2.RELEASE'
implementation 'com.alibaba:fastjson:1.2.71'
}Configure Kafka properties in application.properties:
spring.kafka.bootstrap-servers=192.168.1.100:9092,192.168.1.100:9093,192.168.1.100:9094
spring.kafka.producer.retries=0
spring.kafka.producer.batch-size=16384
spring.kafka.producer.buffer-memory=33554432
spring.kafka.producer.key-serializer=org.apache.kafka.common.serialization.StringSerializer
spring.kafka.producer.value-serializer=org.apache.kafka.common.serialization.StringSerializer
spring.kafka.consumer.auto-offset-reset=latest
spring.kafka.consumer.enable-auto-commit=true
spring.kafka.consumer.auto-commit-interval=100Create a message POJO:
public class Message {
private Long id;
private String message;
private Date sendAt;
}Implement a sender component:
public class Sender {
@Autowired
private KafkaTemplate<String, String> kafkaTemplate;
public void send() {
Message message = new Message();
message.setId(System.currentTimeMillis());
message.setMessage(UUID.randomUUID().toString());
message.setSendAt(new Date());
log.info("message = {}", JSON.toJSONString(message));
kafkaTemplate.send("test", JSON.toJSONString(message));
}
}Implement a receiver component:
public class Receiver {
@KafkaListener(topics = {"test"}, groupId = "test")
public void listen(ConsumerRecord<?, ?> record) {
Optional<?> message = Optional.ofNullable(record.value());
if (message.isPresent()) {
log.info("receiver record = " + record);
log.info("receiver message = " + message.get());
}
}
}Expose a test endpoint to send messages:
public class QueueController {
@Autowired
private Sender sender;
@PostMapping("/test")
public void testQueue() {
sender.send();
sender.send();
sender.send();
}
}After invoking the endpoint, you should see log entries confirming successful message production and consumption.
Thus a pseudo‑Kafka cluster is built with Docker and fully integrated into a Spring Boot application.
Signed-in readers can open the original source through BestHub's protected redirect.
This article has been distilled and summarized from source material, then republished for learning and reference. If you believe it infringes your rights, please contactand we will review it promptly.
Open Source Linux
Focused on sharing Linux/Unix content, covering fundamentals, system development, network programming, automation/operations, cloud computing, and related professional knowledge.
How this landed with the community
Was this worth your time?
0 Comments
Thoughtful readers leave field notes, pushback, and hard-won operational detail here.
