亿级分布式系统架构演进实战(一)- 总体概要
亿级分布式系统架构演进实战(二)- 横向扩展(服务无状态化)
亿级分布式系统架构演进实战(三)- 横向扩展(数据库读写分离)
亿级分布式系统架构演进实战(四)- 横向扩展(负载均衡与弹性伸缩)
亿级分布式系统架构演进实战(五)- 横向扩展(缓存策略设计)
亿级分布式系统架构演进实战(六)- 横向扩展(监控与日志体系)
亿级分布式系统架构演进实战(七)- 横向扩展(安全防护设计)
亿级分布式系统架构演进实战(八)- 垂直拆分(领域划分及垂直分库设计)
亿级分布式系统架构演进实战(九)- 垂直拆分(服务间通信设计)
亿级分布式系统架构演进实战(十)- 垂直拆分(分布式事务管理设计)
亿级分布式系统架构演进实战(十一)- 垂直拆分(服务治理体系、安全架构升级)
目标:构建可独立运行的自治单元,单元内闭环处理所有业务,避免跨单元强依赖
分片维度 | 规则与实现 | 适用场景 |
---|---|---|
用户ID哈希 | cell_id = hash(user_id) % 16 (16单元) |
用户中心型业务(社交、电商) |
地理位置 | 根据用户IP解析城市编码(如北京=1,上海=2),映射到对应单元 | 本地服务、低延迟业务(物流、游戏) |
业务分片 | 按业务线独立分片(如订单单元、支付单元) | 复杂系统解耦(金融、ERP) |
单元粒度:
• 中型单元(百万级用户):部署10-15个服务实例(8C16G规格),独立数据库分片(MySQL 8C32G)
• 扩展规则:用户量增长20%时触发自动扩容(K8s HPA + ShardingSphere动态分片)
核心要求:
• 服务闭环:单元内微服务自包含,跨单元调用需通过GZone代理(禁止直连)。
• 数据闭环:单元内数据库分片存储,仅通过Canal + Kafka异步同步全局数据。
技术实现:
# 北京单元Nacos配置(服务注册隔离)
spring.cloud.nacos.discovery.namespace=bj-cell
spring.cloud.nacos.discovery.server-addr=bj-nacos:8848
# 数据同步配置(Canal监听北京单元Binlog)
canal.instance.master.address=bj-mysql:3306
canal.mq.topic=cell-sync-topic
目标:统一处理跨单元协同服务,保障全局一致性与高可用
核心能力:
实现方案:
• 配置发布:
# 全局风控规则(Nacos配置ID=risk_rules)
risk_rules:
- pattern: "amount > 10000"
action: "REVIEW"
- pattern: "ip in blacklist"
action: "BLOCK"
• 监听与生效:
@NacosConfigListener(dataId = "risk_rules", group = "GLOBAL_GROUP")
public void onRiskRulesUpdate(String newRules) {
RiskRuleManager.refreshRules(newRules); // 动态生效
}
核心挑战:跨单元数据操作的原子性与一致性
技术方案:
生产配置:
# Seata Server高可用配置(3节点集群)
seata:
registry:
type: nacos
nacos:
server-addr: gzone-nacos:8848
config:
type: nacos
nacos:
server-addr: gzone-nacos:8848
store:
mode: db
db:
url: jdbc:mysql://gzone-mysql:3306/seata
user: seata
password: seata
# Redis分布式锁配置
redis.lock.prefix=seata:lock:
redis.lock.expire=30
事务流程:
核心问题:单元间数据同步冲突(如用户同时修改手机号)
冲突解决策略:
冲突类型 | 自动解决策略 | 人工干预场景 |
---|---|---|
时间戳冲突 | 最后写入优先(Last Write Win) | 无 |
业务规则冲突 | 以核心单元为准(如支付单元状态优先) | 转账金额不一致 |
版本号冲突 | 基于Vector Clock合并版本 | 分布式购物车商品更新 |
自动修复流程:
目标:智能路由流量,支持单元级容灾与灰度发布
• DNS智能解析:根据用户IP解析至最近单元(如华北用户→北京单元)。
• API网关路由:支持Header显式指定单元(X-Cell-ID=1
),用于调试与灰度。
# Spring Cloud Gateway配置(北京单元路由)
spring.cloud.gateway.routes:
- id: bj_cell
uri: lb://bj-cell-service
predicates:
- Header=X-Cell-ID, 1
灰度发布:
Gray
。X-Gray=1
导流。熔断规则:
# 北京单元熔断规则(异常比例>60%触发)
sentinel:
degrade:
rules:
- resource: bj-cell-service
grade: EXCEPTION_RATIO
count: 0.6
timeWindow: 30
minRequestAmount: 20
容灾切换流程:
目标:业务逻辑无状态化,支持快速扩缩容
• 会话外部化:Spring Session + Redis存储用户状态。
@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 1800)
public class SessionConfig {
@Bean
public RedisConnectionFactory redisConnectionFactory() {
return new LettuceConnectionFactory("bj-redis", 6379);
}
}
• 配置外置:数据库连接、缓存地址从Nacos动态获取。
降级策略:
@SentinelResource(
value = "queryProduct",
fallback = "queryProductFallback",
blockHandler = "queryProductBlock"
)
public Product queryProduct(String id) {
// 正常查询逻辑
}
public Product queryProductFallback(String id) {
return Product.DEFAULT; // 返回默认商品
}
目标:保障数据本地化与最终一致性
ShardingSphere分片规则:
rules:
- !SHARDING
tables:
user:
actualDataNodes: cell_${0..15}.user_${0..3}
databaseStrategy:
standard:
shardingColumn: user_id
shardingAlgorithmName: hash_mod
shardingAlgorithms:
hash_mod:
type: HASH_MOD
props:
sharding-count: 16
技术实现:
冲突解决:
• 自动合并:基于时间戳与版本号自动解决大部分冲突。
• 人工干预:剩余冲突记录至管理台,由运维处理。