Skip to content

Latest commit

 

History

1 Commit

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

StarSelect 星选商城

一个从单体商城演进而来的 Spring Cloud 微服务实践项目,覆盖商品、购物车、用户、交易与支付核心链路,并围绕服务治理、分布式事务、异步消息和流量保护完成可复现验证。

Java Spring Boot Spring Cloud Nacos License

项目介绍 · 系统架构 · 核心亮点 · 实测证据 · 快速启动

项目介绍

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
Loading

服务清单

模块 默认端口 职责
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

核心亮点

1. 统一网关与身份透传

Gateway 根据路径区分公开接口与受保护接口,校验 JWT 后将用户 ID 写入 user-info 请求头;OpenFeign 拦截器继续向下游传递用户上下文,业务服务无需重复解析 Token。

2. Nacos 注册发现与共享配置

微服务统一注册到 Nacos,数据库、日志、Swagger 与 Seata 配置通过共享 Data ID 管理。Item 服务可启动双实例,由 Gateway 基于服务名完成访问。

3. Seata 跨服务事务边界

创建订单会依次写入订单和明细、清理购物车、扣减商品库存。Trade 服务以 @GlobalTransactional 定义全局事务边界,用于处理库存不足等下游异常,避免多个本地事务各自提交。

4. RabbitMQ 异步支付通知

Pay 服务完成余额扣减与支付单状态更新后,向 pay.direct 发布 pay.success 事件;Trade 服务监听 trade.pay.success.queue,异步更新业务订单状态,降低支付与交易服务的同步耦合。

5. Sentinel 流量保护与线程隔离

Cart 服务接入 Sentinel Dashboard,对 GET:/carts 配置 QPS 流控,并对调用 Item 的资源配置并发线程数限制。配合 OpenFeign fallback,在下游慢调用或突发流量下限制资源占用。

6. 真实测试证据沉淀

围绕 Nacos 服务治理、Sentinel 流量保护、Seata 事务边界和 JMeter 请求表现保留实际操作截图,并在 README 中区分已验证结论与待补充证据,避免使用无法由当前测试支撑的性能数据。

界面展示

商城首页

首页完成 StarSelect 品牌替换,并重新整理导航、搜索、主题视觉、商品分类与服务承诺区域。桌面端和移动端使用同一套商城内容,针对窄屏调整导航、搜索框和首屏信息密度。

StarSelect 商城桌面端首页

移动端首页 运营后台登录
StarSelect 商城移动端首页 StarSelect 运营后台登录

购物车与结算链路

购物车聚合商品最新价格、库存和上下架状态,支持数量调整、选择结算和异常商品提示。该页面也是 Trade、Cart、Item 三个服务协作的业务入口。

StarSelect 购物车与结算

实测证据

以下数据均来自仓库内保留的实际操作截图。由于测试环境为本地 Windows + 虚拟机,结果用于验证行为,不代表生产环境容量。

Nacos:服务注册、双实例与共享配置

测试时共有 Gateway、Pay、User、Cart、Item、Trade 6 个服务注册;Item 显示 2 个实例且 2 个健康实例。配置中心集中维护 5 个 Data ID,包括 JDBC、日志、Swagger、Cart 和 Seata 配置。

服务注册与 Item 双实例 共享配置列表
Nacos 服务列表 Nacos 共享配置

Sentinel:6 QPS 流控

GET:/carts 设置单机阈值 6 QPS。在测试流量下,实时监控显示通过 QPS 稳定为 6.0、拒绝 QPS 为 4.0,说明超出阈值的请求被 Sentinel 限制。

6 QPS 规则 实时监控结果
Sentinel 6 QPS 规则 Sentinel QPS 监控

Sentinel:Feign 调用线程隔离

对 Cart 调用 Item 的资源设置并发线程数阈值 5。监控中该资源通过约 10 QPS、拒绝约 88-91 QPS;上游 GET:/carts 仍保持约 98-101 QPS,用于观察慢下游调用被隔离后对入口线程的保护效果。

Sentinel 线程隔离监控

对应 JMeter 汇总样本为 500,平均响应时间 104 ms、最大响应时间 518 ms、异常率 0.00%、吞吐量 47.7 req/s。这些是一次功能性验证结果,不作为系统容量上限。

JMeter 汇总报告

Seata:跨服务事务问题复现与边界引入

测试将目标商品库存置为 0,扣库存接口返回 500 和“库存不足”。在未建立全局事务传播时,前序购物车清理已经提交,出现了“库存扣减失败但购物车商品消失”的不一致现象;随后在 Trade 下单入口加入 @GlobalTransactional,将订单、购物车与库存操作纳入同一全局事务边界。

库存不足异常 未传播时购物车未回滚 全局事务入口
库存不足异常 购物车未回滚 Seata 全局事务

当前证据完整记录了问题复现和事务边界引入,但没有将其描述为“10 次回滚成功率 100%”;后续补充回滚前后数据库对照后再给出成功率结论。

快速启动

项目采用 Windows 本地应用 + 虚拟机中间件的学习环境。推荐顺序:

  1. 启动虚拟机中的 MySQL,等待 mysqld is alive
  2. 启动 Nacos、Seata、RabbitMQ。
  3. Windows 启动 Sentinel Dashboard。
  4. IDEA 使用 JDK 17 和 local Profile 启动 Gateway 与各微服务。
  5. 运行 starselect-web/nginx.exe
  6. 访问商城 http://localhost:18080/

完整端口、命令、Nacos 数据源修复和故障排查见 项目启动指南

构建后端:

cd starselect-services
mvn package -DskipTests

项目结构

StarSelect/
├─ 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 微服务技术栈学习、架构演进和求职作品展示。仓库中的测试数据来自本地实验环境,请结合硬件、数据量和测试脚本理解,不将其等同于生产压测结论。

About

基于 Spring Cloud Alibaba 的微服务商城实践项目,涵盖 Gateway、Nacos、OpenFeign、Seata、Sentinel、RabbitMQ 与完整交易链路。

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages