使用Axon框架开发CQRS应用

Axon是一个基于DDD领域驱动设计的搭建CQRS架构的框架,特点是可以和Spring整合。

Axon可以帮助简化建立基于EDA架构的CQRS应用,它对Domain Events的支持比较丰富,特别增强了JdonFramework没有的领域事件中的事务支持(不过个人觉得处理起来要复杂,因为事务本身就很棘手)。

Axon最大特点就是严格按照CQRS定义来编程,比如Command EventStore等等,好处是熟悉CQRS的人比较易懂,个人认为缺点是和DDD的统一语言要求有些距离了,如果只懂DDD,不懂CQRS的术语,还是不能方便使用Axon,这方面好像有些逻辑上疙瘩。个人观点。

开发步骤:
1.结合Maven建立项目Project,配置好需要的包。
2.建立Command类,如下:

  CreateOrderCommand {
 
      String orderId;
      String productId;
 
     CreateOrderCommand(String orderId, String productId) {
        .orderId = orderId;
        .productId = productId;
    }
 
     String getOrderId() {
         orderId;
    }
 
     String getProductId() {
         productId;
    }
}


建立Domain Events类,如下:
 org.axonframework.domain.DomainEvent;
 
   AbstractOrderEvent  DomainEvent {
     String getOrderId() {
         getAggregateIdentifier().asString();
    }
}

  OrderCreatedEvent  AbstractOrderEvent {
 
      String productId;
 
     OrderCreatedEvent(String productId) {
        .productId = productId;
    }
 
     String getProductId() {
         productId;
    }
}

如果用Annotation注解来标明DomainEvent,也许更好(应该有),使用继承有些侵入性。

这些步骤之前,应该假设Order等领域模型已经建立好,上面这些类都应该属于行为操作性质,以前我们是写在Service中的。

3.建立CommandHandler,前面有事件发生,这里就有事件处理了,这里实际遵循事件模式中两个主题:触发者;接收者,CommandHandler属于接收者。关于CommandHandler讨论可见 OOJDON的 观点
接受Order订单的创建命令的处理者Handler代码如下,需要使用@CommandHandler标注:
@CommandHandler
  createOrder(CreateOrderCommand command) {
    orderRepository.add( Order(command.getOrderId(), command.getProductId()));
}
 
@CommandHandler
  confirmOrder(ConfirmOrderCommand command) {
    Order order = orderRepository.load( StringAggregateIdentifier(command.getOrderId()));
    order.confirm();
}


在confirmOrder中,我们注意它委托了order.confirm(),让领域模型Order的方法confirm()确认自己的创建。

从这里看出,CommandHandler类似我们MVC中Controller,也就是控制器,专门接受来自界面的命令事件,类似Struts等中Action;JSF等中的界面Bean,或者类似Swing等中Listerner,或者类似 SOA中的服务。当然在JdonFramework中,结合Struts 1.x的Handler可以节省不用写。

DCI架构中,Handler这里实际就是场景发生地,在简洁优雅上,DCI架构要比 CQRS更简单,更倾向于业务统一语言,否则,只懂业务的领域专家还要学习设计模式中事件命令模式,将业务再翻译成事件语言,多一层翻译,就多一层信息失真,以前是将业务翻译成数据库语言,现在推翻了,就不能再多翻译这一层了。

前面谈到CommandHanlder再次触发Domain Model领域模型 Order中的方法,内容如下:
  confirm() {


最后一步,编写查询Query组件:
@Component

看得出来,Axon可能没有对查询进行更多支持,JdonFramework提供查询 缓存优化,自动分页查询等功能,将查询和命令之间数据共享通过 缓存联系封装起来,更简化 CQRS的查询和命令分离后的再结合。

从Axon和JdonFramework 6.0版本等 CQRS框架看得出来,事件是一个解决领域驱动技术架构的好方法,但是如果事件比较多,都在空中飞来飞去,增加编程复杂性和代码可阅读性,这时,DCI架构,将模型带上角色帽子,拉到当前场景,让其演出,表演交互行为,就更加符合业务,符合 DDD统一语言这个概念。


转载于:https://my.oschina.net/u/942996/blog/400741

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值