# pafa5-demo **Repository Path**: tuies/pafa5-demo ## Basic Information - **Project Name**: pafa5-demo - **Description**: pafa5 demo工程 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2026-09-17 - **Last Updated**: 2026-09-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # PAFA5 Demo(user / order / product) 参照《平安 PAFA5 框架技术白皮书》架构风格实现的**多 SAR 示例工程**。 PAFA5 为平安集团内部框架、并未公开发布,因此本工程使用公开可用的 Spring 生态还原其核心理念: **模块化(SAR)、环境感知配置(Pizza/PApp 装配)**。 ## 技术栈 | 组件 | 版本 | 说明 | |---|---|---| | JDK | 1.8 | 编译与运行级别 | | Spring Framework | 3.2.18.RELEASE | Spring 3 最后版本线,支持 JDK 8(PAFA3/PAFA4 时代技术栈) | | Jetty | 9.2.30.v20200428 | 内嵌 Web 容器(9.2 版本线支持 JDK 7/8) | | Jackson | 2.9.10.8 | Spring 3.2 经 MappingJackson2HttpMessageConverter 支持 Jackson 2.x | | JUnit | 4.13.2 | 单元测试 | Spring 3.2 的 API 约束(本工程已适配): - 无 `@RestController` / `@GetMapping` 等快捷注解,使用 `@Controller` + 方法级 `@ResponseBody` + `@RequestMapping(method = ...)` - 构造器注入需显式标注 `@Autowired`(不支持隐式单构造器注入) - 全局异常处理使用 `@ControllerAdvice`(3.2 起可用)+ 方法级 `@ResponseBody`,无 `@RestControllerAdvice` ## 架构对应关系 | PAFA5 概念 | 本 demo 中的实现 | |---|---| | SAR(业务组件) | `sar-user` / `sar-product` / `sar-order` 三个 Maven 模块,各自拥有独立的 `ics_pafa.spring.xml` 与 `ST/datasource.properties` | | PApp(应用容器) | `papp-bootstrap`,以 `classpath*:ics_pafa.spring.xml` 统一装配所有 SAR,启动 DispatcherServlet + 内嵌 Jetty | | Pizza(配置中心) | `PAppBootstrap` → `Pizza.resolveClasspath(env)`(本地 `pizza.properties` 模拟 Apollo 的 env→classpath 映射) | | 环境切换 | `server.properties` 中修改 `env`(DEV/SIT/PRD),PApp 自动加载对应 classpath 下的配置 | | SAR 间依赖 | `sar-order/pom.xml` 依赖 `sar-user`、`sar-product`,`sar-user/pom.xml` 依赖 `sar-product`(无循环依赖),由 PApp 完成跨 SAR 的 Bean 装配 | | 数据源 | 各 SAR 保留 `ST/datasource.properties` 约定(真实环境由 Druid 消费);demo 使用内存存储,开箱即跑 | 启动链路(与白皮书一致): ``` Framework-Foundation(读取 server.properties 获取 env) ↓ Pizza(根据 env 解析配置 classpath,demo 中以本地 pizza.properties 模拟 Apollo) ↓ PApp(装配所有 SAR 的 Spring Bean,启动 Web 容器) ``` ## 项目结构 ``` pafa5-demo/ ├── pom.xml # 父 POM(统一依赖管理) ├── papp-bootstrap/ # PApp 启动模块 │ └── src/main/ │ ├── java/com/pafa5/demo/papp/ │ │ ├── PAppBootstrap.java # 启动类:env 解析 → Pizza → Web 容器 │ │ ├── Pizza.java # 配置中心本地模拟 │ │ └── handler/GlobalExceptionHandler.java │ └── resources/ │ ├── ics_pafa.spring.xml # PApp 级配置(component-scan + mvc:annotation-driven) │ ├── server.properties # env=DEV │ ├── pizza.properties # 环境 → classpath 映射 │ └── ST/app.properties ├── sar-user/ # SAR:用户 ├── sar-product/ # SAR:商品(含库存扣减) └── sar-order/ # SAR:订单(依赖 user + product,含单元测试) ``` ## 构建与运行 要求 JDK 8+、Maven 3.5+: ```bash mvn clean package java -jar papp-bootstrap/target/papp-bootstrap.jar ``` 启动后访问 。 ## 接口示例 ```bash # 用户 curl http://localhost:8080/users curl -X POST http://localhost:8080/users \ -H "Content-Type: application/json" \ -d '{"name":"王五","email":"wangwu@demo.com"}' # 商品 curl http://localhost:8080/products # 下单(校验用户、扣减库存、价格快照计算总额) curl -X POST http://localhost:8080/orders \ -H "Content-Type: application/json" \ -d '{"userId":1,"items":[{"productId":1,"quantity":2},{"productId":2,"quantity":1}]}' # 查询订单(支持 ?userId= 过滤) curl http://localhost:8080/orders/1 curl "http://localhost:8080/orders?userId=1" ``` ## 跨 SAR 调用:用户查询产品 → 下单 三个 SAR 通过 Maven 依赖建立调用关系(无循环依赖): ``` sar-user ──→ sar-product 用户查询产品(UserShoppingService → ProductService) ↑ ↑ └──── sar-order ──┘ 下单/快速下单(OrderService → UserService / ProductService) ``` 调用入口: ```bash # ① 用户查询产品(跨 SAR:sar-user → sar-product) curl http://localhost:8080/users/1/products # ② 快速下单(单接口内完成"查商品 → 下单"编排,跨 SAR:sar-order → sar-product → sar-user) curl -X POST http://localhost:8080/orders/quick-buy \ -H "Content-Type: application/json" \ -d '{"userId":1,"productId":1,"quantity":2}' # ③ 常规下单(跨 SAR:sar-order → sar-user 校验用户、sar-order → sar-product 扣库存) curl -X POST http://localhost:8080/orders \ -H "Content-Type: application/json" \ -d '{"userId":1,"items":[{"productId":1,"quantity":2},{"productId":2,"quantity":1}]}' ``` 预置数据:用户(张三、李四),商品(PAFA5 实战指南 ¥99.00 / 平安科技马克杯 ¥39.50)。 业务异常(用户不存在、库存不足等)由 PApp 级 `GlobalExceptionHandler` 统一返回 JSON: ```json {"code":400,"error":"商品 [PAFA5 实战指南] 库存不足,剩余 100,需要 10000"} ``` ## 测试 ```bash mvn test # sar-user 2 个单元测试:用户查询产品、非法用户拒绝 # sar-order 5 个单元测试:价格快照/库存扣减、非法用户、库存不足、空订单、快速下单 ```