กำหนดค่าและใช้ Apache Kafka กับ Spring Boot

May 13 2023
คาฟคากับรองเท้าบูทสปริง
บทนำ Apache Kafka เป็นแพลตฟอร์มการสตรีมแบบกระจายแบบโอเพ่นซอร์สที่จัดการการสตรีมข้อมูลแบบเรียลไทม์ในปริมาณมาก ปริมาณงานสูง และทนทานต่อความผิดพลาด ระบบนี้อิงตามโมเดลการเผยแพร่และสมัครสมาชิก ซึ่งผู้ผลิตเผยแพร่ข้อความไปยังหัวข้อต่างๆ และผู้บริโภคสมัครรับข้อมูลหัวข้อเหล่านั้นเพื่อใช้งานข้อความ
ที่มาของภาพ

การแนะนำ

Apache Kafka เป็นแพลตฟอร์มการสตรีมแบบกระจายแบบโอเพ่นซอร์สที่จัดการการสตรีมข้อมูลแบบเรียลไทม์ในปริมาณมาก ปริมาณงานสูง และทนทานต่อข้อผิดพลาด ระบบนี้อิงตามโมเดลการเผยแพร่และสมัครสมาชิก ซึ่งผู้ผลิตเผยแพร่ข้อความไปยังหัวข้อต่างๆ และผู้บริโภคสมัครรับข้อมูลหัวข้อเหล่านั้นเพื่อใช้งานข้อความ กรณีการใช้งาน Apache Kafka มีให้เห็นในสถานการณ์ต่างๆ เช่น การวิเคราะห์ตามเวลาจริง สถาปัตยกรรมที่ขับเคลื่อนด้วยเหตุการณ์ การรวมบันทึก ระบบการส่งข้อความ และการสร้างไปป์ไลน์ข้อมูลที่ปรับขนาดได้

การใช้เอกสารนี้:

คุณสามารถใช้เอกสารนี้เพื่อกำหนดค่าและใช้ Apache Kafka เพื่อสร้างและใช้ข้อความ (เนื้อหา JSON) ในแอปพลิเคชัน Spring boot ของคุณ

ข้อกำหนดเบื้องต้น

คุณต้องมีความเข้าใจที่ดีเกี่ยวกับ Java, spring-boot, Apache Kafka, maven หรือ Gradle ก่อนที่จะอ่านเอกสารนี้ มิฉะนั้นจะแนะนำให้คุณตรวจสอบเอกสารและคำแนะนำอย่างเป็นทางการ

การติดตั้ง

ก่อนสร้างข้อความไปยังหัวข้อ Kafka คุณต้องทำตามขั้นตอนสองสามขั้นตอนเพื่อกำหนดค่าการอ้างอิงที่จำเป็นใน pom.xml (Maven) หรือ build.gradle (โครงการ Gradle)

สำหรับ Maven:

For Gradle 
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
   <groupId>org.springframework.kafka</groupId>
   <artifactId>spring-kafka</artifactId>
</dependency>

implementation ‘org.springframework.boot:spring-boot-starter’
implementation ‘org.springframework.kafka:spring-kafka’

การกำหนดค่า

การกำหนดค่าคุณสมบัติ Kafka เป็นไฟล์ Application.properties คุณสามารถมีคุณสมบัติที่กำหนดเองได้เช่นกัน ระบุเซิร์ฟเวอร์ bootstrap ของเซิร์ฟเวอร์ Kafka และคุณสมบัติการกำหนดค่าเพิ่มเติมที่คุณต้องการ เช่น ID กลุ่มผู้บริโภค

Application.properties

spring.kafka.bootstrap-servers=<kafka-bootstrap-servers> 
spring.kafka.consumer.group-id=<consumer-group-id>
spring.kafka.producer.key-serializer=org.apache.kafka.common.serialization.StringSerializer
spring.kafka.producer.value-serializer=org.apache.kafka.common.serialization.StringSerializer
spring.kafka.app.topic=<topic-name>


spring.kafka.bootstrap-servers=localhost:9092 
spring.kafka.consumer.group-id=group_category
spring.kafka.producer.key-serializer=org.apache.kafka.common.serialization.StringSerializer
spring.kafka.producer.value-serializer=org.apache.kafka.common.serialization.StringSerializer
spring.kafka.app.topic=my-topic

ผู้ผลิต Kafka เป็นส่วนประกอบที่ส่งข้อความไปยังหัวข้อ Kafka มันเผยแพร่ข้อมูลไปยัง Kafka ซึ่งผู้บริโภค Kafka หนึ่งรายขึ้นไปสามารถบริโภคได้

ในการสร้างผู้ผลิต Kafka คุณต้องทำตามขั้นตอนต่อไปนี้:

  1. กำหนดค่าคุณสมบัติผู้ผลิต Kafka:ตั้งค่าคุณสมบัติการกำหนดค่าที่จำเป็นสำหรับผู้ผลิต Kafka เช่น เซิร์ฟเวอร์บูตสแตรป (ที่อยู่ของนายหน้า Kafka) และการตั้งค่าซีเรียลไลเซชัน เราได้ดำเนินการในขั้นตอนสุดท้ายแล้ว
  2. สร้างผู้ผลิต Kafka:เพื่อส่งข้อความถึง Kafka; คุณสามารถใช้เทมเพลตที่จัดทำโดย Spring Kafka นี่คือตัวอย่างของผู้ผลิตอย่างง่าย:
  3. import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.kafka.core.KafkaTemplate;
    import org.springframework.stereotype.Service;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    @Component
    public class KafkaEventProducer {
     
     private static final Logger logger = LoggerFactory.getLogger(KafkaEventProducer.class);
     
     @Autowired
     private KafkaTemplate<String, String> kafkaTemplate;
     
     public void sendMessage(String topic, String message) {
       logger.info("Producing message [{}]", message);
       kafkaTemplate.send(topic, message);
     }
    }
    

  4. กำหนดค่าคุณสมบัติผู้ผลิต Kafka:กำหนดค่าคุณสมบัติ Kafka ในไฟล์ application.properties ของคุณ ระบุเซิร์ฟเวอร์ bootstrap ของเซิร์ฟเวอร์ Kafka และคุณสมบัติการกำหนดค่าเพิ่มเติมที่คุณต้องการสำหรับผู้ใช้
  5. สร้างผู้ฟังของผู้บริโภค Kafka:ใช้เมธอดในแอปพลิเคชันของคุณที่จะถูกเรียกใช้เมื่อใดก็ตามที่ได้รับข้อความใหม่จาก Kafka ใช้คำอธิบายประกอบ kafkaListener ที่จัดทำโดย Spring Kafka
  6. import org.springframework.kafka.annotation.KafkaListener;
    import org.springframework.stereotype.Component;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    @Component
    public class KafkaEventConsumer {
    
    private static final Logger logger = LoggerFactory.getLogger(KafkaEventConsumer.class);
    
    @KafkaListener(topics = “<topic-name>”, groupId = “<consumer-group-id>”)
     public void consumeMessage(String message) {
      //Use log
     log.info("Consumed message [{}]", message);
     }
    }
    
    

    @KafkaListener(topics = “${spring.kafka.app.topic}”,groupId= “${spring.kafka.consumer.group-id}”)
    

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class MainApplication {

 @Autowired
 private KafkaEventProducer kafkaEventProducer;

 public static void main(String[] args) {
   SpringApplication.run(MainApplication.class, args);
 }
 
 public void YourMethod() {
 // Send a message using the Kafka producer
 kafkaEventProducer.sendMessage(“<topic-name>”, “Oh Kafka Boy How'z Everything?”);
 }
}

บทสรุป

โดยสรุป Spring Boot ให้การสนับสนุนที่ยอดเยี่ยมสำหรับการรวม Apache Kafka เข้ากับแอปพลิเคชันของคุณ ด้วยการสนับสนุน Kafka ของ Spring Boot คุณสามารถสร้างผู้ผลิตและผู้บริโภค Kafka กำหนดค่าคุณสมบัติของ Kafka และจัดการการประมวลผลข้อความได้อย่างง่ายดาย
การผสานรวมของ Spring Boot กับ Kafka ช่วยลดความยุ่งยากในการพัฒนาแอปพลิเคชันที่ใช้ Kafka ให้ระดับนามธรรมที่สูงขึ้นและลดปริมาณของรหัสต้นแบบที่จำเป็น

และก่อนที่จะรันโค้ด โปรดตรวจสอบให้แน่ใจว่าเซิร์ฟเวอร์ Kafka กำลังทำงานอยู่ และหัวข้อถูกสร้างขึ้นแล้ว

หมายเหตุ: อย่าลืมอ้างอิงเอกสารอย่างเป็นทางการของ Spring Kafka และสำรวจตัวอย่าง Spring Kafka เพื่อทำความเข้าใจคุณสมบัติและตัวเลือกต่างๆ ที่มีอยู่สำหรับการรวม Kafka ใน Spring Boot ให้ดียิ่งขึ้น

ขอบคุณ!