使用 Kafka、Avro、Schema Registry 与 PostgreSQL 构建事件驱动的 Spring Boot 应用
Source: Dev.to

介绍
如果您正在使用 Apache Kafka 构建事件驱动系统,必须提前考虑数据契约。本文展示了一个实用的、端到端的 Spring Boot 示例,使用:
- Apache Kafka
- Confluent Schema Registry
- Avro 序列化
- PostgreSQL
- Docker Compose
完整源码已在文章末尾链接的仓库中提供。
为什么使用 Schema Registry + Avro?
JSON 能用……但有时会失效。Kafka 系统中常见的问题包括:
- 当生产者更改负载时导致消费者崩溃
- 没有模式版本管理
- 团队之间的数据契约不明确
Avro + Schema Registry 通过以下方式解决这些问题:
- 强制执行模式兼容性
- 允许安全的模式演进
- 将生产者与消费者解耦
架构概览
Client (Postman)
|
v
Spring Boot Producer (REST)
|
v
Kafka Topic (users.v1)
|
v
Spring Boot Consumer
|
v
PostgreSQL
- 生产者暴露
POST /users - 有效负载被转换为 Avro 记录
- 消息被发布到 Kafka
- 消费者对 Avro 进行反序列化并将数据持久化到 PostgreSQL
本演示包含的内容
- Spring Boot Kafka 生产者(Avro)
- Spring Boot Kafka 消费者(Avro)
- Confluent Schema Registry
- 使用 Spring Data JPA 的 PostgreSQL 持久化
- 向后兼容的模式演进
- 用于本地开发的 Docker Compose
本地部署(Kafka + Schema Registry + PostgreSQL)
前置条件
- Java 21
- Maven
- Docker 与 Docker Compose
启动基础设施
docker compose up -d
已启动的服务:
- Kafka →
localhost:29092 - Schema Registry → (原文中省略地址)
- PostgreSQL →
localhost:5432
运行应用程序
Consumer(消费者)
cd consumer-app
mvn spring-boot:run
消费者监听 users.v1 并将消息持久化到 PostgreSQL。
Producer(生产者)
cd producer-app
mvn spring-boot:run
生产者提供一个 REST 接口。
生成事件
curl -X POST http://localhost:8080/users \
-H "Content-Type: application/json" \
-d '{
"id": "u-1",
"email": "user@test.com",
"firstName": "John",
"lastName": "Doe",
"isActive": true,
"age": 30
}'
您将看到:
- Avro 模式已注册(或已验证)
- 消息已发布到 Kafka
- 消费者将记录保存到 PostgreSQL
架构演进(重要部分)
Avro 在遵守规则时允许安全的演进。
典型步骤:
- 添加一个新的可选字段。
- 提供默认值。
- 将兼容性设置为 BACKWARD。
Schema Registry 确保:
- 旧的消费者仍能正常工作。
- 新的生产者不会破坏系统。
此演示旨在展示真实场景下的架构演进,而非玩具示例。
Confluent Cloud Ready
该项目还通过 Spring 配置文件支持 Confluent Cloud:
- SASL/SSL
- Schema Registry API 密钥
use.latest.version=trueauto.register.schemas=false
非常适合 CI/CD 流水线。
源代码
- Docker Compose 配置
- Avro 模式
- 生产者和消费者应用程序
- PostgreSQL 设置
- Postman 集合
谁适合阅读?
- Java 与 Spring Boot 开发者
- 使用 Kafka 并想摆脱 JSON 的用户
- 构建事件驱动微服务的团队
- 学习 Schema Registry + Avro 的任何人
最终思考
这是一个面向生产的 Kafka 示例,而不是一个简单的 hello‑world。如果你对以下方面很认真:
- 模式契约
- 向后兼容性
- 安全演进
- 真正的持久化
那么这个演示将为你节省大量的试错时间。
如果它对你有帮助,欢迎给仓库加星,或者 fork 并将其适配到你的系统中。