使用 Kafka、Avro、Schema Registry 与 PostgreSQL 构建事件驱动的 Spring Boot 应用

发布: (2026年1月5日 GMT+8 05:28)
4 min read
原文: Dev.to

Source: Dev.to

《使用 Avro、Schema Registry 和 PostgreSQL 构建 Kafka 事件驱动的 Spring Boot 应用》封面图

介绍

如果您正在使用 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 在遵守规则时允许安全的演进。

典型步骤:

  1. 添加一个新的可选字段。
  2. 提供默认值。
  3. 将兼容性设置为 BACKWARD

Schema Registry 确保:

  • 旧的消费者仍能正常工作。
  • 新的生产者不会破坏系统。

此演示旨在展示真实场景下的架构演进,而非玩具示例。

Confluent Cloud Ready

该项目还通过 Spring 配置文件支持 Confluent Cloud:

  • SASL/SSL
  • Schema Registry API 密钥
  • use.latest.version=true
  • auto.register.schemas=false

非常适合 CI/CD 流水线。

源代码

  • Docker Compose 配置
  • Avro 模式
  • 生产者和消费者应用程序
  • PostgreSQL 设置
  • Postman 集合

谁适合阅读?

  • Java 与 Spring Boot 开发者
  • 使用 Kafka 并想摆脱 JSON 的用户
  • 构建事件驱动微服务的团队
  • 学习 Schema Registry + Avro 的任何人

最终思考

这是一个面向生产的 Kafka 示例,而不是一个简单的 hello‑world。如果你对以下方面很认真:

  • 模式契约
  • 向后兼容性
  • 安全演进
  • 真正的持久化

那么这个演示将为你节省大量的试错时间。

如果它对你有帮助,欢迎给仓库加星,或者 fork 并将其适配到你的系统中。

Back to Blog

相关文章

阅读更多 »

Spring Cloud Gateway:基础示例

Spring Cloud Gateway:基础示例的封面图片 https://media2.dev.to/dynamic/image/width=1000,height=420,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fd...

分布式系统中的双写问题

概述:双写问题发生在单个逻辑操作必须更新两个或多个独立系统时——例如,将数据持久化到数据库并发布…