SpringNotes

第 32 章:常用中间件集成

zjc 于 2026-02-01 发布

这是《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

治理:

  1. 超时和最大连接数;
  2. 慢 SQL 监控;
  3. 读写分离策略;
  4. 事务边界;
  5. 连接池指标;
  6. 密钥管理;
  7. 迁移脚本版本化。

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

治理:

  1. key 命名;
  2. TTL 策略;
  3. 大 key 扫描;
  4. 热 key 保护;
  5. 序列化兼容;
  6. 集群和主从拓扑;
  7. 命令延迟监控。

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

治理:

  1. Outbox;
  2. 幂等消费;
  3. 分区 key;
  4. 消费 lag;
  5. 重试 topic;
  6. 死信队列;
  7. 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

特点:

  1. 事务消息;
  2. 延迟消息;
  3. 顺序消息;
  4. 消费重试;
  5. 死信 topic;
  6. 广播和集群消费。

使用顺序消息时要保证生产队列选择和消费串行逻辑一致。

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

治理:

  1. 索引生命周期;
  2. mapping 版本;
  3. 分片和副本;
  4. 写入批量大小;
  5. 查询超时;
  6. 慢查询;
  7. 数据同步链路。

32.6 MongoDB

配置:

spring:
  data:
    mongodb:
      uri: mongodb://mongo:27017/order

治理:

  1. 索引设计;
  2. 文档大小;
  3. 写关注和读偏好;
  4. 副本集;
  5. 连接池;
  6. 慢查询;
  7. schema 演进。

适合灵活文档模型、日志轨迹、内容详情,不宜盲目替代关系数据库。

32.7 RabbitMQ

配置:

spring:
  rabbitmq:
    host: rabbitmq
    port: 5672
    username: ${RABBIT_USER}
    password: ${RABBIT_PASSWORD}
    listener:
      simple:
        acknowledge-mode: manual
        prefetch: 50

治理:

  1. exchange、queue、binding 版本化;
  2. 死信交换器;
  3. 惰性队列;
  4. prefetch;
  5. 手动 ack;
  6. 队列积压告警。

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);
}

治理:

  1. key 设计;
  2. 生命周期;
  3. 分片上传;
  4. 权限;
  5. CDN;
  6. 防盗链;
  7. 跨区域备份。

不要把大文件读进内存再上传。

32.9 邮件短信

共同要求:

  1. 重试和幂等;
  2. 发送状态持久化;
  3. 模板版本;
  4. 频率限制;
  5. 退避和黑名单;
  6. 供应商降级;
  7. 敏感信息脱敏。

异步发送:

@Async("notifyExecutor")
public void send(SmsMessage message) {
}

通知失败通常不阻塞主业务,但要有补偿和查询。

32.10 集成清单

1. 明确依赖版本矩阵
2. 设置认证和密钥
3. 配置连接池和超时
4. 区分可重试和不可重试错误
5. 提供健康检查
6. 暴露指标
7. 接入 trace
8. 定义容量和限流
9. 配置降级策略
10. 编写集成测试和故障演练

本章小结

中间件集成要从数据模型、连接治理、故障语义、可观测性和安全五个层面设计。数据库关注事务和慢查询,缓存关注一致性和容量,消息关注可靠性和幂等,搜索关注索引生命周期,通知类中间件关注重试和降级。任何中间件都要纳入统一监控和故障演练。

思考题

  1. 集成 Redis 时必须治理哪些风险?
  2. Kafka 和 RocketMQ 的事务语义有何差异?
  3. Elasticsearch mapping 如何安全演进?
  4. 对象存储为什么要流式处理?
  5. 中间件健康检查应包含什么级别?