簡單聊聊CQRS

序言

  • Domain Driven Design (DDD)
  • CQRS
  • Axonframework
  • Mvc vs CQRS
  • 參考

Domain driver design

領域驅動設計 也就是咱們在設計系統時的一種模式。領域是個很寬泛的概念,好比銀行領域,消費領域等,可大可小。驅動也意味推進,也就是用領域方面的知識來推進軟件的設計。(那麼也能夠有產品驅動設計,測試驅動設計(TDD),也就是產品測試催着開發辦事麼?哈哈,這裏是我瞎掰!)html

CQRS (命令查詢責任隔離)

CQRS 屬於DDD應用領域的一個模式。java

設計架構將應用程序分爲兩部分:命令端和查詢端。命令端負責建立,更新和刪除請求,並在數據更改時發出事件。查詢端經過執行查詢來處理,查詢的這些數據經過訂閱數據更改時發出的事件流而保持最新。git

CQRS

Axonframework

Axon Framework 是一個嚴格按照CQRS模式實現的java框架。github

Axon Framework

Mvc vs CQRS

下面以建立訂單爲例子spring

  1. 用戶請求建立訂單;
  2. 接受建立請求後,命令總線分發命令請求,訂單聚合加載對象歷史事件,並執行相應業務邏輯;
  3. 訂單聚合對象處理成功後,產生事件,事件發送到事件總線和存儲到事件倉庫;
  4. 事件總線分發到訂閱的組件進行處理,存儲數據庫,發送郵件;
  5. 用戶經過API直接查詢存儲的訂單數據。

CRQS實現方式

  1. 用戶請求建立訂單;
  2. 接受建立請求後,服務層執行業務邏輯處理。

MVC實現方式

代碼例子數據庫

訂單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

https://github.com/onlythinki...
應用架構

參考

相關文章
相關標籤/搜索