一个从单体商城演进而来的 Spring Cloud 微服务实践项目,覆盖商品、购物车、用户、交易与支付核心链路,并围绕服务治理、分布式事务、异步消息和流量保护完成可复现验证。
StarSelect(星选)是一个微服务商城学习与工程实践项目。项目保留完整商城业务闭环,并将原有单体应用逐步拆分为 Gateway、Item、Cart、User、Trade、Pay 等独立服务,引入 Spring Cloud Alibaba 体系完成服务注册发现、集中配置、服务间调用、分布式事务和流量治理。
项目关注的不只是“接口能够调用”,还保留了 Nacos、Seata、Sentinel 与 JMeter 的测试证据,便于复现技术方案的行为和边界。
flowchart LR
Browser["商城 / 运营端"] --> Nginx["Nginx :18080 / :18082"]
Nginx --> Gateway["Spring Cloud Gateway :8080"]
Gateway --> Item["Item :8081 / :8083"]
Gateway --> Cart["Cart :8082"]
Gateway --> User["User :8084"]
Gateway --> Trade["Trade :8085"]
Gateway --> Pay["Pay :8086"]
Cart -- OpenFeign --> Item
Trade -- OpenFeign --> Cart
Trade -- OpenFeign --> Item
Pay -- OpenFeign --> User
Pay -- pay.success --> MQ["RabbitMQ"]
MQ --> Trade
Gateway -. 注册发现 .-> Nacos["Nacos"]
Item -. 注册 / 配置 .-> Nacos
Cart -. 注册 / 配置 .-> Nacos
Trade -. 注册 / 配置 .-> Nacos
Trade -. 全局事务 .-> Seata["Seata AT"]
Cart -. 流量治理 .-> Sentinel["Sentinel"]
Item --> MySQL[(MySQL)]
Cart --> MySQL
User --> MySQL
Trade --> MySQL
Pay --> MySQL
| 模块 | 默认端口 | 职责 |
|---|---|---|
starselect-gateway |
8080 | 统一路由、JWT 鉴权、用户上下文透传 |
item-service |
8081 | 商品查询、分页搜索、库存扣减 |
cart-service |
8082 | 购物车增删改查、商品信息聚合 |
user-service |
8084 | 登录、地址与余额管理 |
trade-service |
8085 | 订单创建、订单明细、支付状态更新 |
pay-service |
8086 | 支付单幂等创建、余额支付、支付事件发布 |
starselect-api |
- | OpenFeign 客户端、跨服务 DTO 与降级工厂 |
starselect-common |
- | 通用异常、配置、分页、用户上下文等基础能力 |
| 分类 | 技术 |
|---|---|
| 基础框架 | Java 11、Spring Boot 2.7.12、Maven |
| 微服务 | Spring Cloud 2021.0.3、Spring Cloud Alibaba 2021.0.4.0 |
| 服务治理 | Nacos、OpenFeign、Spring Cloud LoadBalancer、Sentinel |
| 数据一致性 | Seata AT、Spring Transaction |
| 消息通信 | RabbitMQ、Spring AMQP |
| 数据访问 | MySQL 8、MyBatis-Plus 3.5.3 |
| 网关与前端 | Spring Cloud Gateway、JWT、Nginx、Vue/静态商城页面 |
| 测试工具 | JMeter、Nacos Console、Sentinel Dashboard、Navicat |
Gateway 根据路径区分公开接口与受保护接口,校验 JWT 后将用户 ID 写入 user-info 请求头;OpenFeign 拦截器继续向下游传递用户上下文,业务服务无需重复解析 Token。
微服务统一注册到 Nacos,数据库、日志、Swagger 与 Seata 配置通过共享 Data ID 管理。Item 服务可启动双实例,由 Gateway 基于服务名完成访问。
创建订单会依次写入订单和明细、清理购物车、扣减商品库存。Trade 服务以 @GlobalTransactional 定义全局事务边界,用于处理库存不足等下游异常,避免多个本地事务各自提交。
Pay 服务完成余额扣减与支付单状态更新后,向 pay.direct 发布 pay.success 事件;Trade 服务监听 trade.pay.success.queue,异步更新业务订单状态,降低支付与交易服务的同步耦合。
Cart 服务接入 Sentinel Dashboard,对 GET:/carts 配置 QPS 流控,并对调用 Item 的资源配置并发线程数限制。配合 OpenFeign fallback,在下游慢调用或突发流量下限制资源占用。
围绕 Nacos 服务治理、Sentinel 流量保护、Seata 事务边界和 JMeter 请求表现保留实际操作截图,并在 README 中区分已验证结论与待补充证据,避免使用无法由当前测试支撑的性能数据。
首页完成 StarSelect 品牌替换,并重新整理导航、搜索、主题视觉、商品分类与服务承诺区域。桌面端和移动端使用同一套商城内容,针对窄屏调整导航、搜索框和首屏信息密度。
| 移动端首页 | 运营后台登录 |
|---|---|
![]() |
![]() |
购物车聚合商品最新价格、库存和上下架状态,支持数量调整、选择结算和异常商品提示。该页面也是 Trade、Cart、Item 三个服务协作的业务入口。
以下数据均来自仓库内保留的实际操作截图。由于测试环境为本地 Windows + 虚拟机,结果用于验证行为,不代表生产环境容量。
测试时共有 Gateway、Pay、User、Cart、Item、Trade 6 个服务注册;Item 显示 2 个实例且 2 个健康实例。配置中心集中维护 5 个 Data ID,包括 JDBC、日志、Swagger、Cart 和 Seata 配置。
| 服务注册与 Item 双实例 | 共享配置列表 |
|---|---|
![]() |
![]() |
为 GET:/carts 设置单机阈值 6 QPS。在测试流量下,实时监控显示通过 QPS 稳定为 6.0、拒绝 QPS 为 4.0,说明超出阈值的请求被 Sentinel 限制。
| 6 QPS 规则 | 实时监控结果 |
|---|---|
![]() |
![]() |
对 Cart 调用 Item 的资源设置并发线程数阈值 5。监控中该资源通过约 10 QPS、拒绝约 88-91 QPS;上游 GET:/carts 仍保持约 98-101 QPS,用于观察慢下游调用被隔离后对入口线程的保护效果。
对应 JMeter 汇总样本为 500,平均响应时间 104 ms、最大响应时间 518 ms、异常率 0.00%、吞吐量 47.7 req/s。这些是一次功能性验证结果,不作为系统容量上限。
测试将目标商品库存置为 0,扣库存接口返回 500 和“库存不足”。在未建立全局事务传播时,前序购物车清理已经提交,出现了“库存扣减失败但购物车商品消失”的不一致现象;随后在 Trade 下单入口加入 @GlobalTransactional,将订单、购物车与库存操作纳入同一全局事务边界。
| 库存不足异常 | 未传播时购物车未回滚 | 全局事务入口 |
|---|---|---|
![]() |
![]() |
![]() |
当前证据完整记录了问题复现和事务边界引入,但没有将其描述为“10 次回滚成功率 100%”;后续补充回滚前后数据库对照后再给出成功率结论。
项目采用 Windows 本地应用 + 虚拟机中间件的学习环境。推荐顺序:
- 启动虚拟机中的 MySQL,等待
mysqld is alive。 - 启动 Nacos、Seata、RabbitMQ。
- Windows 启动 Sentinel Dashboard。
- IDEA 使用 JDK 17 和
localProfile 启动 Gateway 与各微服务。 - 运行
starselect-web/nginx.exe。 - 访问商城
http://localhost:18080/。
完整端口、命令、Nacos 数据源修复和故障排查见 项目启动指南。
构建后端:
cd starselect-services
mvn package -DskipTestsStarSelect/
├─ starselect-services/ # Maven 多模块后端
│ ├─ starselect-gateway/ # API 网关
│ ├─ starselect-common/ # 通用能力
│ ├─ starselect-api/ # Feign API
│ ├─ item-service/ # 商品服务
│ ├─ cart-service/ # 购物车服务
│ ├─ user-service/ # 用户服务
│ ├─ trade-service/ # 交易服务
│ ├─ pay-service/ # 支付服务
│ └─ starselect-monolith/ # 保留的单体对照模块
├─ starselect-web/ # Nginx 与前端页面
├─ Sentinel/ # Sentinel Dashboard
├─ docs/ # 界面截图与公开测试证据
└─ 项目启动指南.md
本项目用于 Spring Cloud 微服务技术栈学习、架构演进和求职作品展示。仓库中的测试数据来自本地实验环境,请结合硬件、数据量和测试脚本理解,不将其等同于生产压测结论。












