环境准备
必须版本
| 组件 | 版本 | 说明 |
|---|---|---|
| JDK | Temurin 25.0.5+8 | --release 25 |
| Maven | 3.9.12 | 标准构建 |
| Project Reactor | 2025.0.8 BOM | reactor-core 3.8.8、reactor-netty 1.3.8 |
| R2DBC PostgreSQL | 1.0.x | 响应式 JDBC 替代 |
| Caffeine | 3.1.x | 异步缓存 |
| Lettuce | 6.5.x | Redis Reactive 客户端 |
验证 JDK:
java -version
# openjdk version "25.0.5" 2026-10-14
# OpenJDK Runtime Environment Temurin-25.0.5+8 (build 25.0.5+8)
mvn -v
# Apache Maven 3.9.12
Maven BOM
eventd-v2/pom.xml 的依赖管理:
<properties>
<maven.compiler.release>25</maven.compiler.release>
<reactor.version>2025.0.8</reactor.version>
<r2dbc-postgresql.version>1.0.7.RELEASE</r2dbc-postgresql.version>
<caffeine.version>3.1.8</caffeine.version>
<lettuce.version>6.5.1.RELEASE</lettuce.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>io.projectreactor</groupId>
<artifactId>reactor-bom</artifactId>
<version>${reactor.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!-- Reactor Netty -->
<dependency>
<groupId>io.projectreactor.netty</groupId>
<artifactId>reactor-netty-http</artifactId>
</dependency>
<!-- R2DBC -->
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>r2dbc-postgresql</artifactId>
<version>${r2dbc-postgresql.version}</version>
</dependency>
<!-- Cache -->
<dependency>
<groupId>com.github.ben-manes.caffeine</groupId>
<artifactId>caffeine</artifactId>
<version>${caffeine.version}</version>
</dependency>
<dependency>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
<version>${lettuce.version}</version>
</dependency>
<!-- Test -->
<dependency>
<groupId>io.projectreactor</groupId>
<artifactId>reactor-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
Spring WebFlux 仅在第 4–6 章使用,会在对应章节引入 spring-webflux 与 spring-boot-starter-webflux(Spring Boot 3.5.x;3.5.16 的系统要求为 Java 17–25,与本书 JDK 25 对齐,3.4.x 不支持 JDK 25)。其余章节保持纯 Reactor + R2DBC 堆栈,避免容器复杂度干扰网络与数据层的讨论。
贯穿项目:eventd v2
卷一实现了基于内存的 SyncSinglePublisher 与 BackpressureDashboard,验证了 RS 规范与背压原理。卷二将其升级为完整的 HTTP 服务。
模块划分
eventd-v2/
├── eventd-gateway # Reactor Netty HTTP/WebSocket 网关
│ └── 路由表、协议转换、连接管理
├── eventd-api # WebFlux 接口层
│ └── 注解路由、函数式路由、过滤器、安全
├── eventd-data # R2DBC + 缓存
│ └── PostgreSQL 交互、事务、Caffeine Async、Redis Reactive
├── eventd-monitor # 第 10 章引入:指标、追踪、结构化日志
├── eventd-resilience # 第 11 章引入:负载均衡、熔断、限流
└── eventd-saga # 第 12 章引入:事件总线与 Saga 编排
前三个模块从第 1 章开始使用;监控、弹性、Saga 模块随对应章节逐步加入,避免一开始就引入尚未讲到的依赖。
端口约定
| 服务 | 端口 | 协议 |
|---|---|---|
| eventd-gateway | 8080 | HTTP/1.1、WebSocket |
| PostgreSQL(eventd-data 使用) | 5432 | R2DBC |
| Redis | 6379 | RESP |
开发时可以通过 docker-compose.yml 启动 PostgreSQL 与 Redis:
services:
postgres:
image: postgres:17
environment:
POSTGRES_DB: eventd
POSTGRES_USER: eventd
POSTGRES_PASSWORD: eventd
ports:
- "5432:5432"
redis:
image: redis:7
ports:
- "6379:6379"
每个章节的可运行代码都假设 eventd 数据库已创建。
与卷一的关系
| 卷一能力 | 卷二对应 |
|---|---|
Publisher.subscribe() | HttpServer.handle() 中创建 Flux/Mono |
Subscription.request(n) | TCP 接收窗口、HTTP 响应的 writeWith() 背压 |
onNext/onError/onComplete | WebFlux 请求管线中的信号传递 |
| 背压策略选择 | HTTP 层与 R2DBC 查询结果流的联合背压 |
三种读法
路径 A:顺序通读(推荐给卷一读者)
- 第 1–3 章:Reactor Netty 最小服务器 → 请求管线 → 背压
- 第 4–6 章:WebFlux 路由 → 请求响应体 → 安全与测试
- 第 7–9 章:R2DBC 驱动 → 事务 → 缓存
- 第 10–12 章:监控 → 弹性 → 全链路集成
- 第 13–14 章:测试 → 验收
路径 B:有 WebFlux 经验,想深入底层
跳过第 4–6 章,从第 1 章(Reactor Netty)或第 7 章(R2DBC)开始。重点看:
- 第 1–3 章:HTTP 层的背压、WebSocket 广播、网关路由
- 第 9 章:Caffeine Async 与 Redis Reactive 的桥接
- 第 10–12 章:响应式系统的监控与弹性模式
- 第 13 章:StepVerifier、Testcontainers、JMH
路径 C:只想看可运行代码
- 前言(本页)→ 确认环境
- 第 3 章(eventd v2 网关架构)→ 理解整体
- 第 9 章(缓存)→ 看 Caffeine Async + Redis
- 第 12 章(全链路集成)→ 端到端可运行
- 附录 A(Netty 配置速查)→ 查配置
一个前置提醒
本机环境为 Apple M1 Pro, macOS 26.3。Reactor Netty 会优先使用平台原生的传输实现(macOS 上是 KQueue,Linux 上是 Epoll),native 库不可用时回退到 NIO。书中示例保持平台无关;部署到 Linux 时,通过 LoopResources/HttpResources 选择原生传输即可,业务代码不变。
Kafka Streams 与 Flink 的内容属于卷三,卷二仅在网关层使用 HTTP 与 WebSocket,不涉及消息队列消费。
环境就绪后,从最小 HTTP 服务器开始:第 1 章第 1 节 Reactor Netty 最小 HTTP 服务器 。
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。