这是《Spring Boot 与 Spring Cloud 零基础实战指南》的独立章节版。本章从概念、实操和生产排查三个视角展开,代码块保留了原书可直接运行的版本。 中间件集成不只是引入依赖,还要考虑连接池、超时、重试、认证、可观测性、故障隔离和数据安全。本章按常见中间件给出集成要点和治理清单。
32.1 MySQL
依赖:
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
</dependency>
配置:
spring:
datasource:
url: jdbc:mysql://mysql:3306/order?useSSL=true&serverTimezone=Asia/Shanghai
username: ${DB_USER}
password: ${DB_PASSWORD}
hikari:
maximum-pool-size: 20
connection-timeout: 2000
治理:
- 超时和最大连接数;
- 慢 SQL 监控;
- 读写分离策略;
- 事务边界;
- 连接池指标;
- 密钥管理;
- 迁移脚本版本化。
32.2 Redis
依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
配置:
spring:
data:
redis:
host: redis
port: 6379
password: ${REDIS_PASSWORD}
timeout: 500ms
lettuce:
pool:
max-active: 50
max-idle: 20
min-idle: 5
治理:
- key 命名;
- TTL 策略;
- 大 key 扫描;
- 热 key 保护;
- 序列化兼容;
- 集群和主从拓扑;
- 命令延迟监控。
32.3 Kafka
依赖:
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
</dependency>
生产者:
spring:
kafka:
producer:
bootstrap-servers: kafka:9092
acks: all
properties:
enable.idempotence: true
消费者:
spring:
kafka:
consumer:
group-id: order-service
auto-offset-reset: earliest
enable-auto-commit: false
治理:
- Outbox;
- 幂等消费;
- 分区 key;
- 消费 lag;
- 重试 topic;
- 死信队列;
- schema 版本。
32.4 RocketMQ
依赖:
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-spring-boot-starter</artifactId>
</dependency>
配置:
rocketmq:
name-server: rocketmq:9876
producer:
group: order-producer
send-message-timeout: 3000
特点:
- 事务消息;
- 延迟消息;
- 顺序消息;
- 消费重试;
- 死信 topic;
- 广播和集群消费。
使用顺序消息时要保证生产队列选择和消费串行逻辑一致。
32.5 Elasticsearch
依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
配置:
spring:
elasticsearch:
uris: https://es:9200
username: ${ES_USER}
password: ${ES_PASSWORD}
connection-timeout: 1s
socket-timeout: 5s
治理:
- 索引生命周期;
- mapping 版本;
- 分片和副本;
- 写入批量大小;
- 查询超时;
- 慢查询;
- 数据同步链路。
32.6 MongoDB
配置:
spring:
data:
mongodb:
uri: mongodb://mongo:27017/order
治理:
- 索引设计;
- 文档大小;
- 写关注和读偏好;
- 副本集;
- 连接池;
- 慢查询;
- schema 演进。
适合灵活文档模型、日志轨迹、内容详情,不宜盲目替代关系数据库。
32.7 RabbitMQ
配置:
spring:
rabbitmq:
host: rabbitmq
port: 5672
username: ${RABBIT_USER}
password: ${RABBIT_PASSWORD}
listener:
simple:
acknowledge-mode: manual
prefetch: 50
治理:
- exchange、queue、binding 版本化;
- 死信交换器;
- 惰性队列;
- prefetch;
- 手动 ack;
- 队列积压告警。
32.8 对象存储
接口:
public interface StorageClient {
String upload(String key, InputStream stream, long size, String contentType);
void download(String key, OutputStream out);
String presignedGetUrl(String key, Duration ttl);
}
治理:
- key 设计;
- 生命周期;
- 分片上传;
- 权限;
- CDN;
- 防盗链;
- 跨区域备份。
不要把大文件读进内存再上传。
32.9 邮件短信
共同要求:
- 重试和幂等;
- 发送状态持久化;
- 模板版本;
- 频率限制;
- 退避和黑名单;
- 供应商降级;
- 敏感信息脱敏。
异步发送:
@Async("notifyExecutor")
public void send(SmsMessage message) {
}
通知失败通常不阻塞主业务,但要有补偿和查询。
32.10 集成清单
1. 明确依赖版本矩阵
2. 设置认证和密钥
3. 配置连接池和超时
4. 区分可重试和不可重试错误
5. 提供健康检查
6. 暴露指标
7. 接入 trace
8. 定义容量和限流
9. 配置降级策略
10. 编写集成测试和故障演练
本章小结
中间件集成要从数据模型、连接治理、故障语义、可观测性和安全五个层面设计。数据库关注事务和慢查询,缓存关注一致性和容量,消息关注可靠性和幂等,搜索关注索引生命周期,通知类中间件关注重试和降级。任何中间件都要纳入统一监控和故障演练。
思考题
- 集成 Redis 时必须治理哪些风险?
- Kafka 和 RocketMQ 的事务语义有何差异?
- Elasticsearch mapping 如何安全演进?
- 对象存储为什么要流式处理?
- 中间件健康检查应包含什么级别?