作家
登录

在微服务中使用领域事件

作者: 来源: 2017-07-10 14:01:56 阅读 我要评论

创建范畴事宜 范畴事宜应当答复“什么人什么时刻做了什么工作”如许的问题,在实际编铝闼楝可以推敲采取层超类型(Layer Supertype)来包含事宜的某些共有属性: 复制代码
public abstract class Event {    private final UUID id;    private final DateTime createdTime;    public Event() {        this.id = UUID.randomUUID();        this.createdTime = new DateTime();    }}
复制代码可以看到,范畴事宜还包含了ID,然则该ID并不是实体(Entity)层面的ID概念,而是重要用于事宜追溯和日记。别的,因为范畴事宜描述的是页堪产生的工作,我们应当将范畴事宜建模成弗成变的(Immutable)。大年夜DDD概念上讲,范畴事宜更像一种特别的值对象(Value Object)。对于上文中提到的咖啡厅例子,创建“客户已达到”事宜如下: 复制代码
public final class CustomerArrivedEvent extends Event {    private final int customerNumber;    public CustomerArrivedEvent(int customerNumber) {        super();        this.customerNumber = customerNumber;    }}
复制代码在这个CustomerArrivedEvent事伊闼楝除了持续自Event的属性外,还自定义了一个与该事宜密切接洽关系的营业属性——客户人数(customerNumber)——如许后续操作便可预留响应数量标座位了。别的,我们将所有属性以及CustomerArrivedEvent本身都声明成了final,并且不向外裸露任何可能修改┞封些属性的办法,如许便包管了事宜的不变性。宣布范畴事宜 在应用范畴事宜时,我们平日采取“宣布-订阅”的方法来集成不合的模块或体系。在单个微办事内部,我们可以应用范畴事沂攀来集成不合的功能组件,比如在上文中提到的“用户注册之后向用户发送迎接邮件”的例子中,注册组件发出一个事宜,邮件发送组件接收到该事宜后向用户发送邮件。 

【编辑推荐】

  1. 微办事时代 怎么看华闻敉件开辟云实现DevOps落地
  2. 微办事架构:基于微办事和Docker容器技巧的PaaS云平台架构设计(微办事架构实施道理)
  3. 成功备战微办事的5个预备步调
  4. 技巧干货|如安在微办事架构下构建高效的运维治理平台?
【义务编辑:张子龙 TEL:(010)68476606】

图2

在微办事内部应用范畴事宜时,我们不必定非得惹人消息中心件(比如ActiveMQ等)。照样以膳绫擎的“注册后发送迎接邮件”为例,注册行动和发送邮件行动固然经由过程范畴事宜集成,然则他们依然产生在同一个线程中,并且是同步的。别的须要留意的是,在限界高低文之内应用范畴事宜时,我们依然须要遵守“一个事务只更新一?聚合根”的原则,违背之往往意味着我们对聚合根的拆分是错的。即便确切存在如许的情况,也应当经由过程异步的方法(此时须要惹人消息中心件)对不合的聚合根采取不合的事务,此时可以推敲应用后台义务。除了用于微办事的内部,范畴事宜更多的是被用于集成不呵9依υ?办事,如上文中的“电商订单”例子。 

图3

平日,范畴事宜产生于范畴对象中,或者更精确的说是产生于聚合根中。在具体编码实现时,有多种方法可用于宣布范畴事宜。 一种直接的方法是在聚合根中直接调用宣布事宜的Service对象。以上文中的“电商订单”为例,当创建订单时,宣布“订单已创建”范畴事宜。此时可以推敲在订单对象的构造函数中宣布事宜: 复制代码
public class Order {    public Order(EventPublisher eventPublisher) {        //create order                //…                eventPublisher.publish(new OrderPlacedEvent());            }}
复制代码注:为了把核心集中在事宜宣布上,我们对Order对象做了简化,Order对象本身在实际编码中不具备参考性。 可以看到,为了宣布OrderPlacedEvent事宜,我们须要将Service对象EventPublisher传入,这显然是一种API污染,即Order作为一个范畴对象只须要存眷和营业相干的数据,而不是诸如EventPublisher如许的基本举措措施对象。 另一种办法是由NServiceBus的开创人Udi Dahan提出来的,即在范畴对象中经由过程调用EventPublisher上的静态办法宣布范畴事宜:复制代码
public class Order {    public Order() {        //create order        //...        EventPublisher.publish(new OrderPlacedEvent());    }}
复制代码这种办法固然避免了API污染,然则这里的publish()静态办法将产生副感化,对Order对象的测试带来了难处。此时,我们可以采取“在聚合根中临时保存范畴事宜”的方法予以改进:

  推荐阅读

  Mysql群集架构mmm高可用群集及服务器上线

【引自攀岩人生的博客】MMM即Multi-Master Replication Manager for MySQL:mysql多主复制治理器,基于perl实现,关于mysql主主复制设备的监控、故障转移和治理的一套可伸缩的脚本套件(在任>>>详细阅读


本文标题:在微服务中使用领域事件

地址:http://www.17bianji.com/lsqh/36107.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)