# 软件体系结构案例 **Repository Path**: wayxingwork/softarchexam ## Basic Information - **Project Name**: 软件体系结构案例 - **Description**: 软件体系结构配套的案例,仅供参考 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-07-26 - **Last Updated**: 2026-07-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # EduMall 配套源代码 本目录包含两套完整的源代码,与教材《软件设计与体系结构》配套使用。 > **学习路径**:教材16周教学进度安排见 [`教学大纲.md`](./教学大纲.md);课前环境检测见 [`check-env.sh`](./check-env.sh)。 ## 教学配套资料 | 文件 | 说明 | |------|------| | [`教学大纲.md`](./教学大纲.md) | 16周×3学时进度表,含理论/实践拆分和代码对应关系 | | [`check-env.sh`](./check-env.sh) | 环境检测脚本(JDK/Maven/Git/Docker),建议课前运行 | | [`Gitee使用指南.md`](./Gitee使用指南.md) | 从Gitee获取代码、提交作业的流程 | | **部署指南**(3份) | 单体版、微服务完整版、微服务H2演示版的部署说明 | ## 一、EduMall 单体版 (`edu-mall-monolith/`) | 对应章节 | 内容 | |----------|------| | 第3章 §3.12 | 设计模式:策略模式(支付)+ 观察者模式(通知) | | 第4章 §4.8 | IoC/AOP:构造器注入 + 事务管理 + 日志切面 | | 第5章 §5.8 | Spring MVC:REST 接口 + Controller 分层 | | 第6章 §6.9 | Spring Boot:自动配置 + 启动类 | **技术栈**:Spring Boot 3.2.0 + JDK 17 + MyBatis-Plus 3.5.5 + H2 (内嵌,零安装) + JWT **目录结构**: ``` edu-mall-monolith/ ├── pom.xml └── src/main/java/com/edumall/campusstore/ ├── EduMallApplication.java # 启动类 ├── entity/ # 实体类 │ ├── User.java │ ├── Product.java │ ├── Order.java │ └── Payment.java ├── dto/ # 数据传输对象 │ └── Result.java # 统一响应结果 ├── mapper/ # MyBatis-Plus Mapper ├── service/ # 业务服务 │ ├── AuthService.java │ ├── UserService.java │ ├── ProductService.java │ └── OrderService.java # ★ @Transactional 本地事务 ├── controller/ # REST 控制器 │ ├── IndexController.java # GET / 欢迎页(服务说明 + 端点列表) │ ├── ProductController.java │ ├── UserController.java │ ├── OrderController.java │ ├── AuthController.java │ └── GlobalExceptionHandler.java # 全局异常处理 ├── payment/ # 策略模式(支付) │ ├── PaymentStrategy.java │ ├── AlipayStrategy.java │ ├── WechatPayStrategy.java │ └── CampusCardStrategy.java # 校园卡支付(特色) ├── event/ # 观察者模式(事件通知) ├── aspect/ # AOP 切面 └── exception/ # 异常处理 ``` > **说明**:本仓库**未包含** `Dockerfile`(早期文档有误)。单体应用通过 `java -jar` 直接运行(详见《Ubuntu22.04开发部署指南.md》§2.5)。该服务为**纯后端 API**,无前端页面;`GET /` 由 `IndexController` 返回接口导航 JSON。 **启动命令**: ```bash cd edu-mall-monolith mvn clean package -DskipTests java -jar target/edu-mall-monolith-1.0.0.jar ``` --- ## 二、EduMall-Cloud 微服务版 (`edumall-cloud/`) | 对应章节 | 内容 | |----------|------| | 第14章 §14.2-§14.7 | 微服务全栈:服务拆分、远程调用、分布式事务、容器部署 | **技术栈**:Spring Boot 3.2.0 + Spring Cloud 2023.0.0 + Spring Cloud Alibaba 2022.0.0.0 + JDK 17 **模块说明**: | 模块 | 服务名 | 端口 | 职责 | 关键技术 | |------|--------|------|------|---------| | edu-common | 公共模块 | - | DTO/异常/AOP切面 | AOP | | edu-gateway | 网关服务 | 8080 | 路由转发+JWT认证 | Gateway + GlobalFilter | | edu-auth | 认证服务 | 8081 | 登录/注册/Token | JWT | | edu-user | 用户服务 | 8082 | 用户信息管理 | MyBatis-Plus | | edu-product | 商品服务 | 8083 | 教材搜索/浏览 | MyBatis-Plus + Redis | | edu-order | 订单服务 | 8084 | 创建订单(核心) | **@GlobalTransactional + Feign** | | edu-inventory | 库存服务 | 8085 | 扣减库存 | **Redis分布式锁 + Seata** | | edu-payment | 支付服务 | 8086 | 支付处理 | Seata AT | | edu-notification | 通知服务 | 8087 | 消息通知 | RabbitMQ Consumer | **启动命令**: ```bash cd edumall-cloud # 1. 启动基础设施 docker-compose -f docker-compose-infra.yml up -d # 2. 编译微服务 mvn clean package -DskipTests # 3. 启动微服务集群 docker-compose up -d ``` ### 快速演示版(轻量,H2 内存库,免 MySQL / ES / Seata) **适用场景**:想快速体验微服务架构,但**不想等 MySQL 8.0 初始化**、也不想装 Elasticsearch / Seata / SkyWalking。 **与完整版的区别**: - 数据库改用 **H2 内存库**(每个服务独立,零初始化、启动最快),通过环境变量覆盖 `bootstrap.yml` 里的 MySQL 数据源,并自动执行各服务的 `schema-h2.sql` 建表 + 初始数据; - 基础设施仅保留 **nacos / redis / rabbitmq**,不启动 MySQL / Elasticsearch / Seata / SkyWalking; - 独立项目名 `edumall-demo` 与独立网络,**可与完整版(`edumall`)同时运行、互不干扰**; - 外部端口改用 `19xxx` / `19090`(网关),避免与完整版 `8081~8090` 冲突; - 下单核心链路(用户/商品/订单/库存/支付/通知)正常,但**分布式事务不可用**(无 Seata),且 **H2 内存数据重启即清空**(演示足够)。 **启动命令**: ```bash cd edumall-cloud # 一键:Maven 编译 8 jar → 构建镜像 → up -d(首次约 8~12 分钟) bash demo-up.sh # docker 需 docker 组时:sg docker -c "bash demo-up.sh" # 停止并移除(H2 内存数据随容器销毁自动清空,无数据卷需清理) bash demo-down.sh ``` > 详细部署、验证与排障见《Ubuntu22.04部署指南-微服务demo版.md》。 --- ## 三、单体 vs 微服务 关键对比 | 对比维度 | 单体版 | 微服务版 | 微服务演示版(H2) | |---------|--------|----------|---------------------| | 服务调用 | Java 方法调用(构造器注入) | OpenFeign 网络调用 | OpenFeign 网络调用 | | 事务管理 | `@Transactional` 本地事务 | Seata AT `@GlobalTransactional` | 本地事务(无 Seata) | | 数据库 | H2 内嵌(文件) | MySQL 8.0 | H2 内存库(重启清空) | | 消息通知 | `ApplicationEventPublisher` | RabbitMQ + StreamBridge | RabbitMQ + StreamBridge | | 部署方式 | 1个 jar | 8 jar + Compose(含 MySQL/ES/Seata) | 8 jar + Compose(仅 nacos/redis/rabbitmq) | | 认证 | Filter 拦截 | Gateway 全局过滤器 | Gateway 全局过滤器 | --- ## 四、从单体到微服务的演进路径 ``` 第3章 策略模式(PaymentStrategy) ↓ 第4章 IoC 管理 + AOP 切面(OrderService 构造器注入) ↓ 第5章 REST 接口(ProductController + OrderController) ↓ 第6章 Spring Boot 一键启动(EduMallApplication) ↓ 第14章 拆分为微服务(edu-order @FeignClient + @GlobalTransactional) ``` **核心洞见**:业务逻辑基本不变,变化的是调用边界—— 从同一 JVM 的方法调用变成跨网络的 RPC 调用。 --- ## 五、本次部署记录(2026-07-26) > 操作环境:Ubuntu 22.04 LTS(用户 `hmtest`,`sudo` 需密码,初始无 JDK/Maven/Docker)。 **改动**: 1. 新增 `controller/IndexController.java`:`GET /` 返回服务说明与全部 API 端点列表,解决根路径访问报 `500 系统内部错误: No static resource .` 的问题。 2. 免 root 安装 JDK 17(Temurin 17.0.20)+ Maven 3.9.9 至 `/home/hmtest/opt/`,环境变量写入 `~/.bashrc`。 3. `mvn clean package -DskipTests` 构建出 `target/edu-mall-monolith-1.0.0.jar`,`java -jar` 后台运行(PID 7872,监听 8080)。 **验证**:`GET /` → 200;`GET /api/products/list` → 200(4 本教材);`POST /api/auth/login` → 200(JWT);H2 控制台(`jdbc:h2:file:./data/edumall;MODE=MySQL;AUTO_SERVER=TRUE`)连接成功。 **文档更新**:修正本 README 中不存在的 `Dockerfile` 标注;《Ubuntu22.04部署指南-单体版.md》§2.3/§2.5 及新增「五、本次部署记录与修改日志」。 > 本次仅新增 `IndexController.java`,未改动既有业务代码、配置或数据库结构,向后兼容。详见《Ubuntu22.04部署指南-单体版.md》第五节。