DDD事件建模与实现源码案例:外卖系统

21-09-20 banq
整个外卖系统架构包括三个系统订单管理餐厅管理快递管理。
案例场景:客户使用 Web 应用程序在当地餐馆下订单。应用程序协调餐厅/厨房订单的准备工作,以及交付订单的快递员网络。

建模

事件建模是一种使用示例来描述系统的方法,该示例说明系统内的信息如何随时间发生变化。


架构

C4软件架构模型是考虑软件系统的容器中,组件和类(或代码)方面的静态结构简单的分级方式。
系统Context图可以成为绘制和记录软件系统的有用起点,允许您退后一步查看大图。


技术框架:


语言平台:
  • Java
  • Axon
  • Spring(Boot)
  • SQL(Postgres)
  • Docker
  • Testcontainers
  • Kubernetes
  • Prometheus
  • Grafana
  • Jaeger

  
1. 订单管理系统

接单和执行管理系统。协调餐厅和快递系统的订单管理。

  • 领域事件


实例说明 (SBE) 是一种协作方法,它基于使用实际示例而不是抽象语句来捕获和说明需求,为软件产品定义需求和面向业务的功能测试。


  • 订单架构:

一旦您通过系统上下文图了解您的系统如何适应整个 IT 环境,下一步非常有用的就是用容器图说明高级技术选择:


继显示高级技术决策的容器图之后,您可以开始放大和进一步分解每个容器:


服务接口gRPC命令:

  • PlaceOrderCommand
  • RejectOrderCommand
  • AcceptOrderCommand
  • MarkOrderAsPreparedCommand
  • MarkOrderAsCollectedCommand
  • MarkOrderAsExpiredCommand
  • MarkOrderAsDeliveredCommand
  • MarkOrderAsPayedCommand

服务接口的gRPC事件:
  • OrderPlaced
  • OrderRejected
  • OrderAccepted
  • OrderPrepared
  • OrderCollected
  • OrderExpired
  • OrderDelivered
  • OrderPayed

领域模型Order:
调用下游:

订阅上文:

  
2. 餐厅

管理餐厅菜单和其他信息,包括位置和营业时间。管理餐厅厨房的订单准备工作。

  • 领域事件模型:


实例说明 (SBE) 是一种协作方法,它基于使用实际示例而不是抽象语句来捕获和说明需求,为软件产品定义需求和面向业务的功能测试。


  • 餐厅技术架构:

一旦您通过系统上下文图了解您的系统如何适应整个 IT 环境,下一步非常有用的就是用容器图说明高级技术选择:


继显示高级技术决策的容器图之后,您可以开始放大和进一步分解每个容器:


服务接口gRPC命令:

  • CreateRestaurantCommand
  • ActivateRestaurantMenuCommand
  • PassivateRestaurantMenuCommand
  • PlaceRestaurantOrderCommand
  • MarkRestaurantOrderAsPreparedCommand

gRPC查询:
  • FindRestaurantQuery
  • FindMenuQuery
  • FindAllMenusQuery
  • FindRestaurantOrderQuery
  • FindAllRestaurantsQuery
  • FindAllRestaurantOrdersQuery

gRPC发布事件:
  • RestaurantCreatedEvent
  • RestaurantMenuActivatedEvent
  • RestaurantMenuPassivatedEvent
  • RestaurantOrderPlacedEvent
  • RestaurantOrderPreparedEvent
  • RestaurantOrderRejectedEvent

  
3. 快递

管理快递信息。订单的快递员视图(管理订单的交付)。

  • 领域事件:快递管理系统的事件模型:


实例说明 (SBE) 是一种协作方法,它基于使用实际示例而不是抽象语句来捕获和说明需求,为软件产品定义需求和面向业务的功能测试。


  • 技术架构

一旦您通过系统上下文图了解您的系统如何适应整个 IT 环境,下一步非常有用的就是用容器图说明高级技术选择:


继显示高级技术决策的容器图之后,您可以开始放大和进一步分解每个容器:


服务接口gRPC命令:

  • CreateCourierCommand
  • CreateShipmentCommand
  • AssignShipmentCommand
  • MarkShipmentAsDeliveredCommand

查询:

gRPC:

  • FindCourierQuery
  • FindShipmentQuery
  • FindAllCouriersQuery
  • FindAllShipmentsQuery

发布的事件:

gRPC:

  • CourierCreatedEvent
  • ShipmentCreatedEvent
  • ShipmentAssignedEvent
  • ShipmentNotAssignedEvent
  • ShipmentDeliveredEvent
  • ShipmentExpiredEvent

 
项目源码:


10
猜你喜欢