共计 2469 个字符,预计需要花费 7 分钟才能阅读完成。
一、传统架构的痛点分析
在 Skill Market 平台用户量突破 50 万时,原有单体架构暴露出三个致命问题:

- 响应延迟飙升 :订单查询接口平均响应时间从 200ms 恶化到 1.2s,高峰期出现 HTTP 503 错误
- 级联故障风险 :MySQL 连接池耗尽导致整个系统不可用,符合典型的服务雪崩特征
- 扩展性受限 :技能搜索模块需要频繁重建索引,但无法独立扩容
通过 Arthas 监控发现,80% 的慢请求集中在用户积分计算和技能推荐两个模块,这正是微服务拆分的理想候选。
二、技术选型决策矩阵
| 维度 | Spring Cloud Alibaba | Kubernetes + Istio |
|---|---|---|
| 学习曲线 | 对 Java 团队更友好 | 需要掌握容器和声明式 API |
| 服务发现 | Nacos(AP 模式) | Etcd(CP 模式) |
| 配置中心 | 内置 Nacos 配置管理 | 需额外部署 ConfigMap/Secret |
| 流量治理 | Sentinel 可视化控制台 | Istio 需要配合 Prometheus |
| 事务支持 | 提供 Seata 分布式事务方案 | 无原生支持 |
选择 Spring Cloud Alibaba 的核心因素是其与 Java 技术栈的深度整合,以及 Seata 对金融级事务的支持能力。
三、领域驱动设计与微服务拆分
3.1 限界上下文划分
// 用户上下文聚合根示例
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long userId;
@Embedded
private UserCredential credential; // 值对象
@OneToMany(mappedBy = "user")
private List<Skill> skills; // 聚合引用
}
3.2 服务拆分结果
- 用户服务 :处理注册 / 登录 / 权限(QPS 300+)
- 技能服务 :管理技能分类 / 搜索(QPS 500+)
- 交易服务 :处理订单 / 支付(TPS 200+)
四、关键实现代码示例
4.1 JWT 鉴权配置
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {http.csrf().disable()
.authorizeRequests()
.antMatchers("/api/auth/**").permitAll()
.antMatchers("/api/skill/**").hasRole("PROVIDER")
.anyRequest().authenticated()
.and()
.addFilter(new JwtAuthenticationFilter(authenticationManager()))
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
}
}
4.2 RocketMQ 事务消息
// 订单创建事务消息发送方
public class OrderService {
@Autowired
private TransactionMQProducer producer;
public void createOrder(OrderDTO order) {
Message msg = new Message("order_topic",
JSON.toJSONString(order).getBytes());
TransactionSendResult result = producer.sendMessageInTransaction(msg,
new LocalTransactionExecuter() {
@Override
public LocalTransactionState executeLocalTransaction(Message msg, Object arg) {return saveOrderToDB(order) ?
LocalTransactionState.COMMIT_MESSAGE :
LocalTransactionState.ROLLBACK_MESSAGE;
}
}, null);
}
}
五、性能优化实践
5.1 多级缓存架构
graph TD
A[客户端] -->|CDN| B(边缘节点)
B -->|Nginx 缓存 | C[API 网关]
C -->|Redis 集群 | D[服务节点]
D -->|Caffeine| E[本地缓存]
5.2 Sentinel 流控规则
// 技能查询接口限流配置
@SentinelResource(value = "skillQuery",
blockHandler = "handleBlock",
fallback = "queryFallback")
@GetMapping("/skills")
public List<Skill> querySkills(@RequestParam String keyword) {// 业务逻辑}
public List<Skill> handleBlock(String keyword, BlockException ex) {log.warn("触发限流 keyword:{}", keyword);
return Collections.emptyList();}
六、典型避坑指南
-
分布式 ID 生成 :避免使用 UUID,推荐美团 Leaf 方案,TPS 可达 10W+
-
Nacos 热更新 :必须配合 @RefreshScope 使用,且注意配置项的刷新粒度
# 错误的配置方式(无法热更新)skill.rate.limit=100 # 正确方式(支持动态调整)skill: rate: limit: 100
七、扩展思考
如何设计实时技能推荐系统?建议考虑以下技术组合:
- 实时数据采集:Flink + Kafka
- 特征计算:TensorFlow Serving 在线推理
- 结果存储:Redis ZSET 实现热度榜
期待大家在评论区分享各自的架构设计方案。
正文完
发表至: 技术架构
近一天内
