本示例中的命令端提供了REST API,可接受通过HTTP发送的请求。请求采取命令的形式,可以驱动对微服务所拥有的领域数据的状态更改。简单来说,对领域数据的任何写入都将以命令形式从API请求流出,处理导致数据库发生更改的操作。
我们将一个微服务分为命令端、查询端和事件处理器,这三个部分可以相互独立地部署。
< div> 命令端 本示例中的命令端提供了REST API,可接受通过HTTP发送的请求。请求采取命令的形式,可以驱动对微服务所拥有的领域数据的状态更改。简单来说,对领域数据的任何写入都将以命令形式从API请求流出,处理导致 数据库发生更改的操作。 命令触发操作,操作触发领域事件。领域事件保存在事件存储中,也就是“一个将数据库与消息代理相结合的系统。”最合适入门使用的事件存储是Eventuate,是由Chris Richardson创建的项目,旨在帮助将CQRS和Event Sourcing应用到微服务。 领域事件存储为按时间顺序排列的一系列事件,附加在日志上。由于每个命令都生成一个事件,我们能够根据收集的事件历史记录重新构建当前系统的总体状态。 事件处理器 我们要探讨的下一个组件是事件处理器。这个CQRS组件采用Worker应用的形式,负责摄取领域事件。事件处理器是无状态的,并侦听来自事件存储的消息,对传入的事件消息采取操作。 事件处理器可通过很多有用的方式对新的领域事件作出响应。一个领域事件可以生成多个事件,这些事件可以发送到其他微服务。这就是为什么大多数微服务开发人员都被CQRS吸引,因为通过这种方法可以发布和订阅来自限界环境之外的应用的领域事件。 这种方法为我们提供了一种机制,可确保领域数据的引用完整性。来自其他微服务的消息可用来处理领域事件,从而让我们能够维护分布式系统中与其他记录的领域数据相关的恼人的外键关系。 查询端 事件处理器首要负责应用可改变领域整合状态的领域事件。每个领域事件都可用来更新数据库记录,形成描述整合的增量实体化视图。反过来,查询端将提供一个REST API,允许HTTP客户端读取从已处理事件生成的实体化视图。 查询端组件中的限制是领域数据是只读的。此系统中的所有状态更改都会从命令端流入,然后形成可在查询端读取的实体化视图。