【SpringBoot整合系列】Kafka的各种模式及Spring Boot整合的使用基础案例

简介

Apache Kafka 是一个开源的流处理平台,广泛用于构建实时数据流管道和流处理应用程序。Kafka 采用发布-订阅模型,并支持多种消息通信模式,如点对点、发布-订阅、流处理等。本文将介绍 Kafka 的各种模式,以及如何使用 Spring Boot 整合每种模式。

一、Kafka 的基本概念

在深入 Kafka 的各种模式之前,我们首先了解一些基本概念:

  • Producer:生产者,负责发送消息到 Kafka。
  • Consumer:消费者,负责从 Kafka 中消费消息。
  • Topic:主题,消息的类别或名称。
  • Partition:分区,每个主题可以分为多个分区,允许并行处理。
  • Broker:消息代理,Kafka 集群中的一台服务器。
  • Consumer Group:消费者组,多个消费者可以组成一个组,共同消费同一主题的消息。

二、Kafka 的各种模式

1. 点对点模式

  • 在点对点模式中,消息发送方(生产者)将消息发送给一个特定的消费者(消费者组中的一个消费者),每条消息只被一个消费者消费。这种模式适合于需要负载均衡的场景,例如任务调度。
  • 首先,引入 Kafka 相关依赖:
xml 复制代码
<dependency>
    <groupId>org.springframework.kafka</groupId>
    <artifactId>spring-kafka</artifactId>
</dependency>
  • 然后,配置 application.yml:
yaml 复制代码
spring:
  kafka:
    bootstrap-servers: localhost:9092
    consumer:
      group-id: my-group
      auto-offset-reset: earliest
    producer:
      key-serializer: org.apache.kafka.common.serialization.StringSerializer
      value-serializer: org.apache.kafka.common.serialization.StringSerializer
  • 接下来,创建生产者和消费者:
java 复制代码
@Service
public class KafkaProducer {
    @Autowired
    private KafkaTemplate<String, String> kafkaTemplate;

    public void sendMessage(String topic, String message) {
        kafkaTemplate.send(topic, message);
    }
}

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

2. 发布-订阅模式

  • 在发布-订阅模式中,每个消息可以被多个消费者消费。生产者将消息发送到主题,所有订阅该主题的消费者都能接收到消息。
  • 使用和点对点模式相同的依赖和配置,只需在消费者组的配置上进行调整。
java 复制代码
@Component
public class KafkaSubscriber {
    @KafkaListener(topics = "my-topic", groupId = "subscriber-group")
    public void subscribe(String message) {
        System.out.println("Subscriber received message: " + message);
    }
}
  • 在这个例子中,消费者将以不同的组 ID 订阅同一个主题,从而实现发布-订阅模式。

3. 流处理模式

  • Kafka 允许将消息流视为数据流进行处理。流处理模式适合实时分析和处理数据流。
  • 首先,引入 Kafka Streams 相关的依赖:
xml 复制代码
<dependency>
    <groupId>org.springframework.kafka</groupId>
    <artifactId>spring-kafka-streams</artifactId>
</dependency>
  • 配置 application.yml:
yaml 复制代码
spring:
  kafka:
    streams:
      application-id: stream-app
      bootstrap-servers: localhost:9092
  • 创建流处理器:
java 复制代码
@EnableKafkaStreams
@Configuration
public class StreamConfig {
    @Bean
    public KStream<String, String> process(StreamsBuilderFactoryBean factory) {
        KStream<String, String> stream = factory.getObject().stream("input-topic");
        stream.filter((key, value) -> value.contains("filter"))
              .mapValues(value -> value.toUpperCase())
              .to("output-topic");
        return stream;
    }
}
  • 在这个示例中,流处理器从 input-topic 读取消息,过滤包含"filter"的消息,并将其转换为大写后发送到 output-topic。
相关推荐
陈猪的杰咪1 分钟前
DeepSeek V4 中转方案全解析 | Flash 成本仅为 GPT 的 1/90
java·人工智能·gpt·spring
zlpzlpzyd3 分钟前
spring boot 4.1发布
java·数据库·spring boot
无籽西瓜a3 分钟前
Plan-and-Execute 里的 DAG 是怎么工作的
java·后端·ai·agent·dag
ch.ju4 分钟前
Java Programming Chapter 4——The difference between overloading and overwriting.
java·开发语言
我命由我123455 分钟前
Android 开发问题:View 的 getWidth、getHeight 方法返回的值都为 0
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
满怀冰雪6 分钟前
第12篇-二分答案法-当答案不好求时如何反向搜索
java·算法
我登哥MVP7 分钟前
SpringCloud 核心组件解析:服务网关
java·spring boot·后端·spring·spring cloud·java-ee·maven
lulu121654407810 分钟前
OpenAI 如何用开源前端生态为 GPT-5.6 铺路? - 微元算力(weytoken)
java·前端·人工智能·python·gpt·开源·ai编程
北城以北88881 小时前
RocketMQ简介
java·spring boot·后端·rocketmq
折哥的程序人生 · 物流技术专研8 小时前
Java面试85题图解版 · 特别篇:2026后端高频面试题复盘(算法底层逻辑+高并发架构设计全解析,附Java实战代码)
java·网络·数据库·算法·面试