Spring Boot 3 + Kafka 实战指南

------麻辣火锅版 🍲

一、项目层级

像火锅店的分工:点单员、传菜员、食客清清楚楚。

bash 复制代码
kafka/
├── pom.xml                 # 根 POM(BOM对齐)
├── provider/               # 点单:生产者
│   ├── pom.xml             # 子模块 POM
│   └── src/main/java/org/example/provider/
│       ├── ProviderApplication.java
│       ├── conf/KafkaTopicsConfig.java
│       ├── controller/ProviderController.java
│       └── service/KafkaProducerService.java
│   └── src/main/resources/application.yaml
└── consumer/               # 上桌:消费者
    ├── pom.xml             # 子模块 POM
    └── src/main/java/org/example/consumer/
        ├── ConsumerApplication.java
        └── listener/KafkaConsumerListener.java
    └── src/main/resources/application.yaml

二、根 POM(大厨的调料表)

xml 复制代码
<properties>
  <java.version>17</java.version>
  <spring.boot.version>3.4.3</spring.boot.version>
  <spring.cloud.version>2024.0.2</spring.cloud.version>
</properties>

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-dependencies</artifactId>
      <version>${spring.boot.version}</version>
      <type>pom</type><scope>import</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-dependencies</artifactId>
      <version>${spring.cloud.version}</version>
      <type>pom</type><scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>

👉 全局版本对齐,避免"锅底和食材不搭"。


三、子模块 POM

provider/pom.xml

xml 复制代码
    <parent>
        <groupId>org.example</groupId>
        <artifactId>kafka</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <groupId>org.example</groupId>
    <artifactId>provider</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>provider</name>
    <description>provider</description>
    <packaging>jar</packaging>

    <properties>
        <java.version>17</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.kafka</groupId>
            <artifactId>spring-kafka</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.kafka</groupId>
            <artifactId>spring-kafka-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

consumer/pom.xml

xml 复制代码
    <parent>
        <groupId>org.example</groupId>
        <artifactId>kafka</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <groupId>org.example</groupId>
    <artifactId>consumer</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>consumer</name>
    <description>consumer</description>
    <packaging>jar</packaging>

    <properties>
        <java.version>17</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.kafka</groupId>
            <artifactId>spring-kafka</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.kafka</groupId>
            <artifactId>spring-kafka-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>2.0.58</version>
        </dependency>
    </dependencies>

Provider(application.yaml - 生产者)

yaml 复制代码
server:
  port: 1003
app:
  kafka:
    topic: demo.topic.v1
    auto-create-topic: true
spring:
  kafka:
    bootstrap-servers: yiqiquhuxi.cn:9092
    producer:
      key-serializer: org.apache.kafka.common.serialization.StringSerializer
      value-serializer: org.springframework.kafka.support.serializer.JsonSerializer
      acks: all

Consumer(application.yaml -消费者)

yaml 复制代码
server:
  port: 1004
app:
  kafka:
    topic: demo.topic.v1
spring:
  kafka:
    bootstrap-servers: yiqiquhuxi.cn:9092
    consumer:
      group-id: demo-group
      auto-offset-reset: earliest
      value-deserializer: org.springframework.kafka.support.serializer.JsonDeserializer
      properties:
        spring.json.value.default.type: org.example.consumer.kafka.MessagePayload
        spring.json.trusted.packages: "*"

四、配置(菜单写清楚)

入口

typescript 复制代码
@SpringBootApplication
public class ProviderApplication {
  public static void main(String[] args) { SpringApplication.run(ProviderApplication.class, args); }
}
@SpringBootApplication
public class ConsumerApplication {
  public static void main(String[] args) { SpringApplication.run(ConsumerApplication.class, args); }
}

消息模型

arduino 复制代码
public record MessagePayload(String id, String content, long ts) {}

就像菜单:编号、菜名、上桌时间。

Provider:点菜 + 上菜

typescript 复制代码
@Service
public class KafkaProducerService {
  @Autowired private KafkaTemplate<String, MessagePayload> kafka;
  @Value("${app.kafka.topic}") private String topic;

  public void send(String content) {
    kafka.send(topic, new MessagePayload(UUID.randomUUID().toString(), content, System.currentTimeMillis()));
  }
}

@RestController
@RequestMapping("/provider")
public class ProviderController {
  @Autowired private KafkaProducerService producer;
  @GetMapping("/done") public String done() { producer.send("done"); return "done"; }
}

Consumer:吃菜

less 复制代码
@Slf4j
@Component
public class KafkaConsumerListener {
  @KafkaListener(topics = "${app.kafka.topic}", groupId = "${spring.kafka.consumer.group-id}")
  public void onMessage(MessagePayload payload) {
    log.info("🍜 收到菜:{} - {}", payload.id(), payload.content());
  }
}

五、运行流程

  1. 点火:Kafka Broker 先启动。
  2. 开店:先跑 consumer,再跑 provider。
  3. 点单GET http://localhost:1003/provider/done
  4. 吃菜:consumer 日志里出现 🍜 → 成功!

六、常见坑

  • 锅点不着bootstrap-servers 不通,先查网络。
  • 没菜 :topic 不存在?开 auto-create-topic
  • 吃不到 :改 group-id 或加 auto-offset-reset=earliest

七、总结

Spring Boot + Kafka 的套路:

👉 Provider 点单,Kafka 传菜,Consumer 开吃。

就像火锅:食材扔进去,涮一涮,人人都能分到一口热乎的。🔥

相关推荐
FQNmxDG4S16 小时前
Java多线程编程:Thread与Runnable的并发控制
java·开发语言
虹科网络安全17 小时前
艾体宝干货|数据复制详解:类型、原理与适用场景
java·开发语言·数据库
axng pmje17 小时前
Java语法进阶
java·开发语言·jvm
HackTorjan17 小时前
深度神经网络的反向传播与梯度优化原理
人工智能·spring boot·神经网络·机器学习·dnn
rKWP8gKv717 小时前
Java微服务性能监控:Prometheus与Grafana集成方案
java·微服务·prometheus
老前端的功夫17 小时前
【Java从入门到入土】28:Stream API:告别for循环的新时代
java·开发语言·python
qq_4352879217 小时前
第9章 夸父逐日与后羿射日:死循环与进程终止?十个太阳同时值班的并行冲突
java·开发语言·git·死循环·进程终止·并行冲突·夸父逐日
小江的记录本17 小时前
【Kafka核心】架构模型:Producer、Broker、Consumer、Consumer Group、Topic、Partition、Replica
java·数据库·分布式·后端·搜索引擎·架构·kafka
yaoxin52112318 小时前
397. Java 文件操作基础 - 创建常规文件与临时文件
java·开发语言·python
极客先躯20 小时前
高级java每日一道面试题-2025年11月24日-容器与虚拟化题[Dockerj]-runc 的作用是什么?
java·oci 的命令行工具·最小可用·无守护进程·完全标准·创建容器的核心流程·runc 核心职责思维导图