分布式与数据层
微服务拆分后,数据库不能共享一张大表,会话与缓存常上 Redis,跨服务写操作需要 分布式事务或最终一致。本章把 Spring Cloud / Alibaba 常见落地方式,映射到架构与数据库知识库。
数据层在微服务中的位置
API Gateway
▼
订单服务 ──Feign──► 库存服务
│ │
▼ ▼
order_db stock_db ← 每服务独立库(推荐)
│ │
└──── Seata AT / 本地消息表 ────┘ ← 需要跨库一致性时
▼
Redis(缓存、锁、Session、限流计数)
设计原则见 数据库架构:服务边界 = 数据边界,跨服务优先 异步事件 而非分布式事务。
专题文档(推荐直接跳转)
| 主题 | 文档 |
|---|---|
| 分库分表 / 分布式库 | ShardingSphere · 分布式数据库(TiDB/Vitess) |
| 分布式事务 | Seata → Seata |
| 数据同步 CDC | 数据同步与 CDC → Canal、CDC |
| Kafka | Kafka 集成 → Kafka |
| Nacos | Nacos 集成 |
Redis(Spring 集成 + 分布式场景)
依赖与配置
见 Redis 集成:spring-boot-starter-data-redis、Lettuce 连接池、序列化方式。
典型用途对照
| 场景 | Spring 文档 | Redis / 架构 |
|---|---|---|
| 声明式缓存 | 缓存 | 缓存架构、多级缓冲 |
| 分布式锁 | 分布式锁 | Redis 命令与 Redisson |
| 幂等键 | 接口幂等性 | SET NX、支付回调 |
| Gateway 限流 | API 网关 | RequestRateLimiter + Redis |
| 共享 Session | Session 管理 | Spring Session Redis |
| 秒杀库存 | — | 秒杀、Lua 原子扣减 |
集群与可靠性
生产需明确:主从、哨兵还是 Cluster — 见 Redis(持久化、热 key、缓存穿透/击穿/雪崩)。高并发专题:高并发。
spring:
data:
redis:
host: redis.cluster.internal
port: 6379
lettuce:
pool:
max-active: 32
max-idle: 16数据库访问(单服务内)
| 能力 | 文档 |
|---|---|
| 分层与对象 | 分层模型 |
| JPA | JPA 与 Hibernate |
| MyBatis | MyBatis、MyBatis-Plus |
| 事务 | 事务管理 |
| 多数据源 | 多数据源 |
| 读写分离 | 读写分离 → MySQL 主从 |
| 连接池 | 连接池配置 |
| 分页 | 分页查询 |
SQL 优化、索引、锁见 MySQL。
分库分表与分布式事务
实现细节、配置示例见专文:
跨服务写默认优先:本地事务 + Kafka 最终一致;库存类见 秒杀。
分布式 ID
订单号、消息 ID 需全局唯一:分布式 ID(雪花、号段、Redis INCR)。
数据同步与 CDC
Canal → Kafka → Spring 消费、幂等与 CQRS:数据同步与 CDC。
与消息队列配合(推荐解耦)
订单服务 ──发布 order.created──► Kafka
▼
库存服务消费(幂等扣库存)
检查清单
| 检查项 | 参考 |
|---|---|
| 是否每服务独立库 | 数据库架构 |
| 缓存与 DB 一致性策略 | 缓存架构 |
| Redis 是否集群、是否防热 key | Redis |
| 跨服务写是否可改为 MQ | 消息队列 |
| 分库分片键是否合理 | ShardingSphere |
| 全局事务是否必要 | Seata |