# ddd-demo **Repository Path**: soulnew/ddd-demo ## Basic Information - **Project Name**: ddd-demo - **Description**: 包含:核心域(订单)、支撑域(库存)、通用域(通知) 区分:DTO\DO\PO 听过mapper 转换 4层架构: 接入层\biz sercie \ domain service \ Repository spring/rabbit MQ - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-08-02 - **Last Updated**: 2026-08-02 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # DDD 微服务演示项目 本项目是一个基于 **Java 17 + Spring Boot 3.2 + JPA/Hibernate + RabbitMQ + H2** 的现代化领域驱动设计(DDD)示例。 它展示了如何将一个电商下单场景拆分为 **三个独立的微服务**,每个服务拥有独立的代码库、独立的数据库,并通过 **RabbitMQ 发布/订阅领域事件** 进行跨服务协作。 --- ## 1. 业务场景 - **创建订单**:用户提交商品清单,系统生成订单 - **支付订单**:订单状态变为已支付 - **发货订单**:订单状态变为已发货 - **库存联动**:下单时预留库存,支付后确认扣减 - **通知记录**:订单创建/支付/发货时生成通知记录 --- ## 2. 子域划分 | 服务 | 子域类型 | 职责 | |------|---------|------| | `order-service` | 核心域 | 订单生命周期管理,产生核心业务价值 | | `inventory-service` | 支撑域 | 库存预留、扣减、释放,支撑订单履约 | | `notification-service` | 通用域 | 通知记录,可被多个业务复用 | --- ## 3. 技术栈 - Java 17 - Spring Boot 3.2.7 - Spring Data JPA - Spring AMQP(RabbitMQ) - H2 Database(每个服务独立内存数据库) - Maven - Docker & Docker Compose --- ## 4. 项目结构 ``` D:\mycode\ddd ├── docker-compose.yml ├── README.md ├── order-service/ # 核心域:订单 │ ├── pom.xml │ ├── Dockerfile │ └── src/main/java/com/example/ddd/demo/orderservice │ ├── web/ # REST 入口 │ ├── application/ # 应用服务、DTO、Mapper │ ├── domain/ │ │ ├── model/ # DO(充血聚合根)、值对象 │ │ ├── service/ # Domain Service │ │ ├── event/ # 领域事件 │ │ └── repository/ # 仓储接口 │ ├── infrastructure/ │ │ ├── jpa/po/ # PO(JPA 持久化实体) │ │ ├── jpa/ # 仓储实现、DO/PO 转换 │ │ └── integration/ # 领域事件桥接到 RabbitMQ │ └── config/ │ ├── inventory-service/ # 支撑域:库存 │ └── ... │ └── notification-service/ # 通用域:通知 └── ... ``` --- ## 5. 体现的 DDD 要素 ### 5.1 充血模型 - `Order` 封装 `create / pay / ship`、金额计算、状态校验 - `Inventory` 封装 `reserve / confirm / release` 库存规则 - 业务不变量内聚在领域对象中,而不是散落在 Service 里 ### 5.2 DO / PO 分离 - **DO(Domain Object)**:纯业务对象,无 JPA 注解,无持久化依赖 - **PO(Persistent Object)**:JPA 实体,直接映射数据库表 - **Repository**:负责 DO 与 PO 之间的转换,屏蔽持久化细节 ### 5.3 领域服务(Domain Service) - `OrderPricingService`:订单计价策略(满减/折扣),不适合放在单个 `Order` 中 - `InventoryAllocationService`:跨多个 `Inventory` 聚合根的批量预留/扣减,保证 all-or-nothing ### 5.4 领域事件 - `Order` 通过 `AggregateRoot` 基类注册内部领域事件 - 应用服务在持久化后发布事件 - `OrderIntegrationEventPublisher` 将内部事件桥接到 RabbitMQ - `inventory-service` 和 `notification-service` 通过 `@RabbitListener` 订阅并处理事件 ### 5.5 DTO - 应用层使用 Java Record 定义请求/响应对象 - `OrderMapper` 负责 DTO ↔ DO 转换 --- ## 6. 快速启动 ### 6.1 启动 RabbitMQ ```bash cd D:\mycode\ddd docker-compose up rabbitmq -d ``` RabbitMQ 管理界面:`http://localhost:15672`,账号/密码:`guest/guest` ### 6.2 分别启动三个服务 打开三个独立终端: ```bash cd D:\mycode\ddd\order-service mvn spring-boot:run ``` ```bash cd D:\mycode\ddd\inventory-service mvn spring-boot:run ``` ```bash cd D:\mycode\ddd\notification-service mvn spring-boot:run ``` 服务端口: | 服务 | 端口 | |------|------| | order-service | 8080 | | inventory-service | 8081 | | notification-service | 8082 | ### 6.3 全部 Docker 化启动 ```bash cd D:\mycode\ddd mvn -f order-service/pom.xml package -DskipTests mvn -f inventory-service/pom.xml package -DskipTests mvn -f notification-service/pom.xml package -DskipTests docker-compose up --build -d ``` --- ## 7. 接口测试 `inventory-service` 启动后会自动初始化两个商品: - `11111111-1111-1111-1111-111111111111`:手机,库存 100 - `22222222-2222-2222-2222-222222222222`:笔记本,库存 50 ### 7.1 创建订单 ```bash curl -X POST http://localhost:8080/orders \ -H "Content-Type: application/json" \ -d '{ "lines": [ { "productId": "11111111-1111-1111-1111-111111111111", "productName": "手机", "quantity": 2, "unitPrice": 2999.00, "currency": "CNY" } ] }' ``` ### 7.2 支付订单 ```bash curl -X POST http://localhost:8080/orders/{orderId}/pay ``` ### 7.3 发货订单 ```bash curl -X POST http://localhost:8080/orders/{orderId}/ship ``` ### 7.4 查询订单 ```bash curl http://localhost:8080/orders/{orderId} ``` 每次操作都会触发 RabbitMQ 事件: - `inventory-service` 自动预留/扣减库存 - `notification-service` 自动写入通知记录 --- ## 8. 运行测试 ```bash cd D:\mycode\ddd for %s in (order-service inventory-service notification-service) do ( cd %s && mvn test -q && cd .. ) ``` 每个服务都包含: - 单元测试(针对 DO 的业务规则) - 上下文加载测试(验证 Spring 容器能正常启动) --- ## 9. 设计要点总结 1. **微服务拆分**:按子域拆分为独立 Maven 项目,独立数据库 2. **DO / PO 分离**:领域对象不直接依赖 ORM,持久化细节下沉到基础设施层 3. **Domain Service**:处理跨聚合或无状态的业务规则 4. **Application Service**:编排用例、控制事务、调用仓储与领域服务 5. **领域事件**:通过 RabbitMQ 实现服务间最终一致的事件驱动协作 6. **充血模型**:业务规则封装在聚合根和值对象中 --- ## 10. 参考目录 - `order-service/src/main/java/com/example/ddd/demo/orderservice/domain/model/Order.java` - `order-service/src/main/java/com/example/ddd/demo/orderservice/domain/service/OrderPricingService.java` - `inventory-service/src/main/java/com/example/ddd/demo/inventoryservice/domain/service/InventoryAllocationService.java` - `order-service/src/main/java/com/example/ddd/demo/orderservice/infrastructure/jpa/OrderRepositoryImpl.java` - `order-service/src/main/java/com/example/ddd/demo/orderservice/integration/OrderIntegrationEventPublisher.java`