In Aufgabe 8 haben Sie die Kafka-Begriffe geklärt. Jetzt setzen Sie sie um: Eine Spring-Boot-Anwendung sendet Nachrichten über Kafka (Producer) und empfängt sie wieder (Consumer). Kafka läuft lokal in Docker.
flowchart LR
C["Browser / Postman"] -->|"GET /send"| R["MessageController"]
R --> P["KafkaProducer"]
P -->|"testTopic"| K[("Kafka :9092")]
K -->|"testTopic"| L["KafkaConsumer"]
Erstellen Sie eine docker-compose.yml und starten Sie
sie mit docker compose up:
services:
kafka:
image: apache/kafka:3.9.0
ports:
- "9092:9092"Das Image startet einen einzelnen Broker ohne Zookeeper
(KRaft-Modus), erreichbar auf localhost:9092. Prüfen Sie
mit docker ps, dass der Container läuft.
Erstellen Sie auf start.spring.io ein Projekt mit Spring for Apache Kafka, Spring Web und Lombok.
Konfiguration in application.properties:
spring.kafka.bootstrap-servers=localhost:9092
spring.kafka.consumer.group-id=myGroup
spring.kafka.consumer.auto-offset-reset=earliestImplementieren Sie die drei Klassen:
@Service
public class KafkaProducer {
@Autowired
private KafkaTemplate<String, String> kafkaTemplate;
public void sendMessage(String message) {
kafkaTemplate.send("testTopic", message);
}
}@Service
public class KafkaConsumer {
@KafkaListener(topics = "testTopic", groupId = "myGroup")
public void listen(String message) {
System.out.println("Received message in group myGroup: " + message);
}
}@RestController
public class MessageController {
@Autowired
private KafkaProducer producer;
@GetMapping("/send")
public String sendMessage(@RequestParam("message") String message) {
producer.sendMessage(message);
return "Message sent";
}
}Starten Sie die Anwendung und rufen Sie
http://localhost:8080/send?message=Hallo auf. Die Nachricht
muss in der Konsole erscheinen.
Statt Strings senden Sie ein Objekt als JSON.
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class CustomMessage {
private String id;
private String message;
private LocalDateTime timestamp;
}Passen Sie Producer
(KafkaTemplate<String, CustomMessage>) und Consumer
(listen(CustomMessage message)) an.
Ergänzen Sie einen neuen Endpunkt, der eine
CustomMessage mit eigener ID und aktuellem Zeitstempel
versendet.
Konfigurieren Sie die JSON-Serialisierung:
spring.kafka.producer.value-serializer=org.springframework.kafka.support.serializer.JsonSerializer
spring.kafka.consumer.value-deserializer=org.springframework.kafka.support.serializer.JsonDeserializer
spring.kafka.consumer.properties.spring.json.trusted.packages=*Erstellen Sie ein neues Projekt (nicht kopieren) mit nur einem Consumer, ohne Producer und ohne Controller. Starten Sie beide Anwendungen und senden Sie eine Nachricht.
Beobachten Sie, was passiert, wenn der zweite Consumer
group-id (myGroup) hat,group-id hat.Beantworten Sie in ein bis zwei Sätzen:
group-id? Erklären Sie den Unterschied.CustomMessage (Git-Repository oder ZIP).