Intégrer Apache Kafka avec Java

 💡 Introduction

Dans les applications d’entreprise modernes, la communication en temps réel entre les systèmes distribués est devenue indispensable.
Apache Kafka — une plateforme de streaming d’événements distribuée — permet de créer des architectures orientées événements, hautement performantes et tolérantes aux pannes.

Dans ce guide, vous apprendrez à intégrer Kafka avec Spring Boot et le framework Spring classique, en créant un producteur et un consommateur simples.


⚙️ 1️⃣ Qu’est-ce qu’Apache Kafka ?

Apache Kafka est une plateforme de streaming d’événements distribuée conçue pour :

  • Publier et souscrire des flux de données

  • Traiter des événements en temps réel

  • Connecter des systèmes via des files de messages fiables

Kafka est souvent utilisé pour :

  • La communication entre microservices

  • La centralisation des journaux

  • L’analyse temps réel

  • Les déclencheurs de processus BPM (comme jBPM)


🧩 2️⃣ Concepts de base

ComposantDescription
Producer (Producteur)Envoie les messages vers un topic Kafka
Consumer (Consommateur)Lit les messages depuis un topic Kafka
TopicCatégorie ou canal de diffusion des messages
BrokerServeur Kafka qui stocke et sert les messages
ZookeeperService de coordination des brokers (optionnel depuis Kafka 3.x)

🏗️ 3️⃣ Configuration de Kafka (local ou Docker)

🐳 Utiliser Docker

docker run -d --name zookeeper -p 2181:2181 zookeeper docker run -d --name kafka -p 9092:9092 \ -e KAFKA_ZOOKEEPER_CONNECT=host.docker.internal:2181 \ -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://localhost:9092 \ wurstmeister/kafka

🧾 Créer un topic

kafka-topics.sh --create --topic demo-topic --bootstrap-server localhost:9092

🧠 4️⃣ Intégration de Kafka avec Spring Boot

🧱 Étape 1 : Ajouter la dépendance

Dans pom.xml :

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

⚙️ Étape 2 : Configuration de l’application

📜 application.yml

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

💬 Étape 3 : Créer le Producteur

import org.springframework.kafka.core.KafkaTemplate; import org.springframework.stereotype.Service; @Service public class MessageProducer { private final KafkaTemplate<String, String> kafkaTemplate; private static final String TOPIC = "demo-topic"; public MessageProducer(KafkaTemplate<String, String> kafkaTemplate) { this.kafkaTemplate = kafkaTemplate; } public void send(String message) { kafkaTemplate.send(TOPIC, message); System.out.println("✅ Message envoyé : " + message); } }

🎧 Étape 4 : Créer le Consommateur

import org.springframework.kafka.annotation.KafkaListener; import org.springframework.stereotype.Service; @Service public class MessageConsumer { @KafkaListener(topics = "demo-topic", groupId = "demo-group") public void consume(String message) { System.out.println("🎯 Message reçu : " + message); } }

🚀 Étape 5 : Créer un contrôleur REST

import org.springframework.web.bind.annotation.*; @RestController @RequestMapping("/api/kafka") public class KafkaController { private final MessageProducer producer; public KafkaController(MessageProducer producer) { this.producer = producer; } @PostMapping("/publish") public String sendMessage(@RequestParam String message) { producer.send(message); return "✅ Message envoyé au topic Kafka !"; } }

Test :
Lancez l’application puis appelez :
POST http://localhost:8080/api/kafka/publish?message=BonjourKafka
Vérifiez les logs du producteur et du consommateur.


⚙️ 5️⃣ Intégration avec le framework Spring classique

Si vous utilisez le Spring Framework sans Boot, vous devez définir les beans manuellement.

📜 kafka-config.xml

<bean id="producerFactory" class="org.springframework.kafka.core.DefaultKafkaProducerFactory"> <constructor-arg> <map> <entry key="bootstrap.servers" value="localhost:9092"/> <entry key="key.serializer" value="org.apache.kafka.common.serialization.StringSerializer"/> <entry key="value.serializer" value="org.apache.kafka.common.serialization.StringSerializer"/> </map> </constructor-arg> </bean> <bean id="kafkaTemplate" class="org.springframework.kafka.core.KafkaTemplate"> <constructor-arg ref="producerFactory"/> </bean>

Puis, utilisez KafkaTemplate de la même façon :

kafkaTemplate.send("demo-topic", "Message depuis Spring classique !");

🔄 6️⃣ Communication bidirectionnelle (Request-Reply)

Kafka prend en charge le mode requête-réponse via un identifiant de corrélation :

Côté producteur :

kafkaTemplate.sendAndReceive(new ProducerRecord<>("request-topic", "QueryData"));

Côté consommateur :

@KafkaListener(topics = "request-topic") public void reply(ConsumerRecord<String, String> record) { kafkaTemplate.send("response-topic", "Réponse : " + record.value()); }

🧰 7️⃣ Bonnes pratiques pour la production

DomaineBonne pratique
Gestion d’erreursUtiliser SeekToCurrentErrorHandler pour les réessais
🔁 IdempotenceActiver enable.idempotence=true pour éviter les doublons
🔐 SécuritéConfigurer SASL/SSL pour Kafka Cloud
📈 SurveillanceIntégrer Prometheus / Micrometer avec Spring Actuator
📦 PerformanceUtiliser @KafkaListener(batch = true) pour les gros volumes

📈 8️⃣ Schéma d’architecture

+---------------------+ +--------------------+ | Application Spring | | Application Spring | | Boot (Producteur) | | Boot (Consommateur)| | /api/kafka/publish | ---> | @KafkaListener | +----------+----------+ +----------+---------+ | | v v +---------------------------------+ | Apache Kafka Broker | | (Topic : demo-topic) | +---------------------------------+

🧠 9️⃣ Erreurs fréquentes

ErreurCauseSolution
bootstrap broker disconnectedKafka non démarréLancer Kafka (9092)
TimeoutExceptionMauvais endpointVérifier bootstrap-servers
SerializationExceptionMauvais sérialiseurCorriger les types key/value
Consumer rebalance loopGroupe non définiAjouter group-id

🏁 Conclusion

🎯 En intégrant Apache Kafka avec Spring Boot et le framework Spring, vous pouvez construire des microservices orientés événements, scalables et résilients.

Cette combinaison permet :

  • Une communication asynchrone

  • Une meilleure tolérance aux pannes

  • Des flux de données temps réel performants

💬 Kafka + Spring = Architecture réactive, robuste et en temps réel 🚀


👉 Regardez “Intégrer Apache Kafka avec Java Spring Boot et Spring Framework” en action : 

🎬 Une démo étape par étape bientôt disponible sur YouTube : Learn IT with Shikha

💼 Support professionnel disponible

Si vous rencontrez des problèmes sur des projets réels liés au développement backend d’entreprise ou à l’automatisation des workflows, je propose des services de conseil payants, de débogage en production, de support projet et de formations ciblées.

Les technologies couvertes incluent Java, Spring Boot, PL/SQL, Azure, ainsi que l’automatisation des workflows (jBPM, Camunda BPM, RHPAM).

📧 Contact: ishikhanirankari@gmail.com | info@realtechnologiesindia.com

🌐 Website: IT Trainings | Digital lectern | Digital rostrum | Digital metal podium    


Comments

Popular posts from this blog

jBPM Installation Guide: Step by Step Setup

Scopes of Signal in jBPM

OOPs Concepts in Java | English | Object Oriented Programming Explained