領域驅動設計 也就是咱們在設計系統時的一種模式。領域是個很寬泛的概念,好比銀行領域,消費領域等,可大可小。驅動也意味推進,也就是用領域方面的知識來推進軟件的設計。(那麼也能夠有產品驅動設計,測試驅動設計(TDD),也就是產品測試催着開發辦事麼?哈哈,這裏是我瞎掰!)html
CQRS 屬於DDD應用領域的一個模式。java
設計架構將應用程序分爲兩部分:命令端和查詢端。命令端負責建立,更新和刪除請求,並在數據更改時發出事件。查詢端經過執行查詢來處理,查詢的這些數據經過訂閱數據更改時發出的事件流而保持最新。git
Axon Framework 是一個嚴格按照CQRS模式實現的java框架。github
Axon Framework
下面以建立訂單爲例子spring
代碼例子數據庫
訂單Controller架構
@RestController public class OrderCommandController { @Autowired private CommandGateway commandGateway; @PostMapping("/create") public void create(@Valid @RequestBody OrderDto dto) { CreateOrderCommand command = new CreateOrderCommand(dto.getOrderNo()); commandGateway.sendAndWait(command); } }
訂單聚合對象app
@Aggregate @Data @NoArgsConstructor public class OrderAggregate { @NotNull @AggregateIdentifier private String id; private String orderNo; @CommandHandler public UsersAggregate(CreateOrderCommand command) { apply(new OrderCreatedEvent(command.getId(), command.getOrderNo())); } @EventSourcingHandler public void on(OrderCreatedEvent event) { this.id = event.getId(); this.orderNo = event.getOrderNo(); } }
事件處理器框架
@Slf4j @Component @ProcessingGroup("order") public class OrderEventHandler { @Autowired private orderRepository repository; @EventHandler public void handle(final OrderCreatedEvent event, @Timestamp Instant timestamp, @SequenceNumber Long version) { log.info("OrderCreatedEvent: [{}] ", event.getId()); Order order = new Order(); order.setId(event.getId().getValue()); order.setOrderNo(event.getOrderNo()); order.setAggregateVersion(version); order.setCreatedDate(timestamp); order.setLastModifiedDate(timestamp); repository.save(users); } }
【微服務版本】查看如下例子微服務
Micro service with spring cloud and the AxonFramework