CQRS基础和应用程序结构

介绍

在本文中,我将概述微服务模式,事件源和命令查询责任隔离(CQRS)模式。 然后,我将展示如何使用Axon Framework在Spring Web Application上应用这些概念。 您可以在Github上查看最终代码。

我建议您已经掌握了Java和Spring Boot的一些基本概念,以便更好地理解。

活动采购

这种模式意味着每个应用程序状态更改都应由一个事件开始,并应将其存储。 例如,在电子商务站点上,用户单击要添加到购物车的产品后,此操作应发送一个包含产品ID和数量的JSON事件。

然后,将通过先前处理的事件的顺序来定义最终的应用程序状态。

使用事件源而不是仅维护最后一个应用程序状态的主要好处是:

  • 审核:您可以搜索存储的事件并准确验证哪些事件导致了下一个状态。

  • 重播:如果事件处理出错(例如:数据库已关闭),则可以再次触发失败的事件。

  • 复制:您可以在消息代理(例如:Apache Kafka)上发布事件,并在另一个微服务上使用事件。

CQRS

一种模式,建议将读取操作与写入或更新操作分开。 从创建单独的类到使用不同的数据库,这可以通过多种方式完成。

CQRS的主要好处是代码的逻辑划分,使其更清晰。

演示应用概述

该应用程序将包含一个Spring Boot,该Boot模拟一个电子商务结帐平台。 通过REST端点,您可以添加或编辑包含idnamequantity属性的产品。

遵循CQRS概念,将有用于命令和查询的单独模块:

  • Command Side:将包含POSTPUT端点,这将生成其各自的commands ,这些commands将转换为events 。 这些事件将以原始格式存储到MongoDb数据库中,同时还将进行处理以生成最终的应用程序状态并存储在Postgres数据库中。

  • 查询端:将包含GET端点,以获取我们的电子商务购物车的最新快照。

Axon Framework为我们提供了有关CQRS和事件源实现的简单方法,使您易于理解数据流。

该图表示从REST端点到事件生成和聚合更改的数据流

依存关系

  • spring-boot-starter
  • spring-boot-starter-web
  • spring-boot-starter-data-mongodb
  • spring-boot-starter-data-jpa
  • axon-spring-boot-starter
  • axon-mongo
  • postgresql

我们将使用axon-spring-boot-starter 4.1.2版本,该版本需要运行单独的Axon Server才能启动我们的Spring Boot Application。 为了简化本教程,我们将不使用Axon Server,因此可以通过在build.gradle文件中声明以下build.gradle来删除其依赖build.gradle

compile ( 'org.axonframework:axon-spring-boot-starter:4.1.2' ) {
  exclude group: 'org.axonframework' , module: 'axon-server-connector'
}

命令模块配置

我们将从创建Command模块开始。 如果您使用的是IntelliJ,则可以通过单击File > New > Module ,选择Gradle ,然后选择Java 。 在ArtfactId键入commandside然后ArtfactId Finish 。 此步骤将在包含单个build.gradle文件的应用程序的根文件夹中创建一个名为commandside的文件夹。 检查它的配置在这里 Github上库。

接下来,您需要通过在内部创建一个包含主包src/main/java/com/example/project/command的路径,在commandside文件夹中创建Spring Boot应用程序的结构。 将其放置在@SpringBootApplication注释的类以及所有其他与包相关的类的位置。 在此处检查最终结果。

src/main/resources内部,创建一个application.yml文件来放置您的Postgres配置。 您可以在这里按照我的示例。

现在最重要的步骤是Axon的EventStorageEngine的配置,在我们的示例中将为MongoDb。 为此,请创建如下的Configuration类:

@Configuration
public class AxonConfig {

    // The `MongoEventStorageEngine` stores each event in a separate MongoDB document
    @Bean
    public EventStorageEngine storageEngine ( MongoClient client ) {
        return MongoEventStorageEngine
                . builder ()
                . mongoTemplate ( DefaultMongoTemplate
                        . builder ()
                        . mongoDatabase ( client )
                        . build ())
                . build ();
    }
}

Query模块不需要任何特殊配置。 这将是一个简单的Spring Boot Web应用程序,可以从Postgres数据库获取视图模型。

现在运行您的应用程序,以检查是否一切正常。

结论

在第一部分中,我们讨论了CQRS的基本概念并构建了演示应用程序。 在下一步中,我们将对Command模块进行编码。

From: https://dev.to/fabiothiroki/cqrs-basics-and-application-structure-2ac2

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值