一、微服务架构
-
服务治理
-
Nacos 注册中心(AP模式)
- CAP选择:Nacos 默认采用 AP 模式(可用性 + 分区容忍性),通过心跳检测实现服务健康管理。
- 服务发现:客户端定时拉取服务列表,支持权重路由和元数据过滤。
- 配置管理 :通过
dataId
和group
动态推送配置,支持灰度发布。
-
Sentinel 熔断规则持久化
- 规则存储:将流控、熔断规则持久化到 Nacos/ZooKeeper,避免重启丢失。
- 动态更新 :通过
DataSource
接口监听配置中心变化,实时生效。
java// 示例:Sentinel 规则持久化到 Nacos ReadableDataSource<String, List<FlowRule>> flowRuleDataSource = new NacosDataSource<>( nacosServerAddr, groupId, dataId, source -> JSON.parseObject(source, new TypeReference<List<FlowRule>>() {}) ); FlowRuleManager.register2Property(flowRuleDataSource.getProperty());
-
-
分布式事务
-
Seata AT模式
- 两阶段流程 :
- 一阶段:执行业务 SQL,生成 UNDO_LOG(数据快照)。
- 二阶段:提交时删除 UNDO_LOG;回滚时通过 UNDO_LOG 恢复数据。
- 全局锁:TC(事务协调器)通过全局锁避免脏写。
- 两阶段流程 :
-
最大努力通知型事务
- 适用场景:跨系统最终一致性(如支付成功后通知商户)。
- 实现步骤 :
- 本地事务提交后,异步发送通知消息。
- 消息队列保证至少一次投递,接收方需幂等处理。
-
-
网关设计
-
Spring Cloud Gateway 过滤器链
-
核心过滤器 :
GlobalFilter
:全局过滤(如鉴权、日志)。GatewayFilter
:路由级过滤(如添加请求头)。
-
自定义过滤器 :
java@Component public class AuthFilter implements GlobalFilter { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { if (!checkAuth(exchange.getRequest())) { return exchange.getResponse().setComplete(); // 拦截 } return chain.filter(exchange); } }
-
-
动态路由配置
- 基于Nacos:监听 Nacos 配置变化,刷新路由表。
- API 动态更新 :通过
RouteDefinitionRepository
接口实现。
-
二、中间件核心
-
Redis
-
集群模式
- Cluster分片 :
- 16384个哈希槽,每个节点负责部分槽位。
- 客户端路由:通过
CRC16(key) % 16384
计算槽位。
- Codis方案 :
- 代理层(Codis-Proxy)负责分片,依赖 ZooKeeper 维护元数据。
- Cluster分片 :
-
持久化策略
- RDB:定时快照,恢复快但可能丢失数据。
- AOF:追加日志,数据安全但文件较大。
- 混合模式:RDB 全量 + AOF 增量(Redis 4.0+)。
-
缓存问题解决方案
- 穿透 :布隆过滤器(
RedissonBloomFilter
)拦截无效请求。 - 击穿 :互斥锁(
SET key value NX PX 3000
)防止并发重建。 - 雪崩:随机过期时间(基础过期时间 + 随机偏移量)。
- 穿透 :布隆过滤器(
-
-
Kafka
-
ISR机制
- In-Sync Replicas:与 Leader 保持同步的副本集合。
- Leader选举:当 Leader 失效时,从 ISR 中选择新 Leader。
-
零拷贝技术
- sendfile系统调用:数据直接从磁盘文件传输到网卡,绕过用户态。
-
Exactly-Once语义
- 幂等生产者:通过 PID + Sequence Number 去重。
- 事务消息:跨分区原子性写入(需配合事务协调器)。
-
-
RocketMQ
-
事务消息流程
- 发送半消息(对消费者不可见)。
- 执行本地事务,提交或回滚。
- Broker 根据事务状态提交或丢弃消息。
-
顺序消息实现
- MessageQueueSelector:通过相同选择策略(如订单ID哈希)将消息发送到同一队列。
- 消费者单线程顺序消费。
-
三、高可用设计
-
限流降级
-
滑动窗口算法
- 实现:将时间划分为多个小窗口,统计窗口内请求量。
- 优势:比固定窗口更平滑,避免临界突发流量。
-
令牌桶实现(Resilience4j)
java// 配置每秒10个令牌 RateLimiterConfig config = RateLimiterConfig .custom() .limitRefreshPeriod(Duration.ofSeconds(1)) .limitForPeriod(10) .build(); RateLimiter limiter = RateLimiter.of("apiLimiter", config);
-
-
容灾方案
-
同城双活
- 数据同步:基于数据库主从复制或 DRBD 块级同步。
- 流量切换:DNS 或负载均衡器(如 Nginx)切换流量。
-
异地多活
- 单元化路由:按用户 ID 哈希路由到指定机房(如用户A固定访问北京机房)。
- 数据最终一致:通过消息队列异步同步数据。
-
-
压测实战
-
JMeter全链路压测
- 脚本录制:使用 JMeter 代理服务器录制用户操作。
- 参数化:CSV 文件驱动多用户登录(不同账号)。
- 分布式压测:控制机(Master)调度多台压力机(Slave)。
- 监控指标:TPS、响应时间、错误率、资源利用率(CPU/内存)。
-
结果分析
- 瓶颈定位:数据库慢 SQL、线程池满、缓存命中率低。
- 优化建议:增加索引、调整线程池参数、预热缓存。
-
四、总结与实战案例
案例:电商大促系统设计
- 挑战:秒杀场景下的高并发(10万QPS)、数据一致性。
- 解决方案 :
- 流量削峰:MQ 队列缓冲请求,异步处理订单。
- 库存扣减:Redis Lua 脚本保证原子性,异步同步到数据库。
- 降级策略:核心功能(下单)优先,非核心功能(推荐)降级。
通过深入理解上述技术点,并结合实际场景灵活运用,能够设计出高可用、可扩展的分布式系统。