从零搭建 Spring Cloud Alibaba 微服务架构:一次真实生产项目的落地实践
背景介绍:为什么选择 Spring Cloud Alibaba?

记得那是我加入现在这家互联网公司后接手的第一个大型项目。团队要重构一套已经运行多年、代码臃肿、功能耦合严重的单体系统,目标是拆分成多个独立部署的微服务,并支持后续的可扩展性和高并发能力。
我们当时做了技术选型调研,最终决定采用 Spring Cloud Alibaba 来作为微服务框架的核心技术栈。不是因为它是“阿里系”,而是因为它在以下几个方面打动了我们:
- 对国内云平台(如阿里云)有天然兼容性
- 集成了 Sentinel、Nacos、Seata 等一系列生产级组件
- 支持 Dubbo 与 Spring Cloud 的混合开发模式
- 社区活跃、文档丰富、版本更新稳定
这个项目,也成为了我第一次真正完整地将 Spring Cloud Alibaba 应用于生产环境的经历。
项目背景简述

我们要做的是一套在线教育平台,包括课程管理、用户中心、订单系统、支付系统、学习记录等多个模块。整个业务链条长、数据一致性要求高,且对稳定性有强需求。
原有的系统存在如下问题:
- 单体架构导致部署周期长,上线风险高
- 各个模块之间强依赖,一处故障影响全局
- 用户量上涨后性能瓶颈明显,响应延迟增大
- 日志和监控手段缺失,排查问题困难
我们的目标很明确:通过微服务化改造,提升系统的可维护性、可观测性以及弹性伸缩能力。
搭建之初:踩过的坑

1. 技术栈选择带来的初期混乱
我们在项目初期尝试同时使用 Nacos 和 Eureka,结果发现服务注册和发现出现了混乱。Eureka 的客户端没有及时下线,而 Nacos 又有自己的健康检查机制,导致部分调用路径出现异常。
解决方案:
果断统一技术栈为 Nacos。理由是它不光可以做服务注册与发现,还能作为配置中心使用,节省了重复引入 Config Server 的成本。我们把原本分散在各个节点上的配置文件集中起来,在 Nacos 上统一管理。
举个例子,订单模块的数据库连接池参数、超时时间等配置,都可以通过 @Value 注解自动注入,甚至可以在配置变更后动态刷新,不用重启服务。
spring:
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
extension-configs:
- data-id: order-service.yaml
group: DEFAULT_GROUP
refresh: true
这样,我们在测试环境频繁调整配置的时候非常方便,省去了手动修改 jar 包或脚本重启的成本。
2. 微服务拆分粒度过细带来集成复杂度上升
一开始,为了追求“微”,我们按照每个实体(比如用户、课程、章节)来拆分服务。结果发现接口调用链太长,有些场景需要跨多个服务查询,性能反而下降。
经验总结:
微服务划分不宜过细,建议遵循“业务边界 + 数据自洽”原则。后来我们将用户管理、权限控制和认证服务合并成一个 user-center;课程和章节合并成 course-center,效果就好很多。
遇到的问题及解决思路

3. 分布式事务如何保证一致性?
这几乎是所有中台系统的痛点。举个典型的场景:用户下单之后,要扣减库存、生成订单、写入学习记录、发送消息通知等一系列操作,这些分布在不同的微服务里。
一开始我们想用本地事务 + RocketMQ 发送异步通知,但随着业务逻辑变复杂,数据一致性变得越来越难保障。
最终方案:引入 Seata 实现分布式事务
我们选择了 Seata 的 AT 模式,原理上就是在本地事务的基础上添加全局锁机制,配合事务日志做回滚/补偿。
具体来说,我们在订单创建的入口加上 @GlobalTransactional 注解,然后让下游服务(如库存服务)实现对应的 TCC 接口或者参与 AT 模式。
@GlobalTransactional
public void createOrder(OrderDTO dto) {
// 创建订单
orderMapper.insert(dto);
// 扣减库存
inventoryService.reduceStock(dto.getProductId());
// 记录学习信息
learningRecordService.addRecord(dto.getUserId(), dto.getCourseId());
}
当然,Seata 并非银弹,我们也遇到了一些性能瓶颈,比如全局锁冲突频繁、日志过大等问题。最终通过设置合适的事务组、优化 SQL 语句、拆分热点资源等手段缓解了这些问题。
4. 系统负载过高,服务雪崩怎么办?
在压测过程中,我们发现某个课程详情接口突然慢下来,进而拖垮整个网关层,导致大面积超时甚至宕机。
应对策略:引入 Sentinel 做熔断限流
Sentinel 是阿里巴巴开源的一个轻量级、高性能的流量控制工具。我们对核心接口都做了限流保护,设置了 QPS 和线程数阈值。
举个例子,用户中心的登录接口设置了 QPS 限制为每秒 500 次,并在超过限制时返回 429 错误码而不是直接崩溃。
@GetMapping("/login")
@SentinelResource(value = "userLogin", blockHandler = "handleLoginLimit")
public Response login(String username, String password) {
return userService.login(username, password);
}
// 限流处理方法
public static Response handleLoginLimit(BlockException e) {
return new Response(429, "当前访问人数过多,请稍后再试");
}
除了接口级别,我们还对网关整体做了降级策略。当某个子服务不可用时,网关会自动切换到缓存或者降级页面,避免用户完全无法访问。
5. 日志与链路追踪缺失,排查效率低
项目上线初期,遇到问题只能靠人工查日志,不同服务的日志格式不统一,很难关联定位。
解决方案:ELK + SkyWalking 实现全链路追踪
我们整合了 ElasticSearch、Logstash、Kibana 作为日志收集和展示平台,结合 SkyWalking 做请求链路追踪。
这样一来,只要知道某次请求的 traceId,就能在 SkyWalking 看到从 gateway 到 user-service 再到 course-service 的每一跳耗时,极大提升了排障效率。
例如,有一次我们发现有个 API 平均响应时间高达 3 秒,通过追踪发现是 Redis 连接池打满,最终优化了连接池大小并增加了集群节点,问题迎刃而解。
生产部署与运维经验分享
6. 容器编排与自动化发布
我们采用了 Kubernetes + Jenkins + Harbor 的组合进行容器化部署和 CI/CD 流水线建设。
每个微服务构建为 Docker 镜像,推送到私有仓库后,由 Helm Chart 编排发布到 K8s 集群中。并通过 Jenkins Pipeline 实现一键部署。
举个小插曲:有一次我们在 Jenkins 的 job 中漏掉了 --no-cache 参数,导致 build 出来的镜像用了旧版本的 JDK,结果线上出现兼容性问题。从此我们加入了强制清缓存步骤,并加上了 image 标签版本校验。
7. 监控告警体系建设
除了 SkyWalking 的链路监控外,我们还接入了 Prometheus + Grafana 的监控体系,实时查看 CPU、内存、请求数、错误率等指标。
特别推荐几个关键指标监控:
- 接口成功率(2xx / 总请求)
- 请求延迟分布(P95、P99)
- GC 时间 & 线程阻塞情况
- Sentinel 的 block 数
一旦出现异常,触发企业微信或钉钉机器人推送,值班人员第一时间介入。
效果总结与收益回顾
经过三个月的努力,这套基于 Spring Cloud Alibaba 构建的微服务系统终于上线并稳定运行至今。以下是几个关键指标的对比:
| 指标 | 改造前 | 改造后 |
|---|---|---|
| 部署频率 | 每月 1 次 | 每周多次 |
| 故障恢复时间 | 小时级 | 分钟级 |
| 单接口 QPS | < 100 | > 2000 |
| 异常发生率 | 高频 | 明显降低 |
更重要的是,研发团队的工作效率提升了。新功能可以快速孵化在一个独立服务中,而不会被老系统牵制。这也为我们后续接入 AI 功能模块提供了更灵活的架构支撑。
经验总结与建议
如果你正在考虑使用 Spring Cloud Alibaba 来搭建自己的微服务系统,我建议你:
- 不要一味追求“微”,合理划分服务边界,以业务为主线,避免过度拆分。
- 重视前期架构设计,尤其是接口定义和数据模型的设计,否则后期迁移成本极高。
- 尽早引入 Sentinel 与 SkyWalking,这两个组件能帮你规避大多数生产事故。
- 优先考虑可观测性,日志、监控、追踪必须同步建设,不能等出了问题再补。
- 做好自动化运维准备,包括 CI/CD 流水线、健康检查、滚动升级等机制。
最后我想说,任何技术都不是万能的,关键在于怎么用。Spring Cloud Alibaba 提供了一套非常好的基础工具链,但如何组合、如何优化、如何落地,还要靠团队自身的理解与执行力。
希望这篇文章能帮助到即将开始微服务化转型的你,少走点弯路。如果有疑问,欢迎留言交流。
本文完

评论 0