介绍
在本文中,我将概述微服务模式,事件源和命令查询责任隔离(CQRS)模式。 然后,我将展示如何使用Axon Framework在Spring Web Application上应用这些概念。 您可以在Github上查看最终代码。
我建议您已经掌握了Java和Spring Boot的一些基本概念,以便更好地理解。
活动采购
这种模式意味着每个应用程序状态更改都应由一个事件开始,并应将其存储。 例如,在电子商务站点上,用户单击要添加到购物车的产品后,此操作应发送一个包含产品ID和数量的JSON事件。
然后,将通过先前处理的事件的顺序来定义最终的应用程序状态。
使用事件源而不是仅维护最后一个应用程序状态的主要好处是:
审核:您可以搜索存储的事件并准确验证哪些事件导致了下一个状态。
重播:如果事件处理出错(例如:数据库已关闭),则可以再次触发失败的事件。
复制:您可以在消息代理(例如:Apache Kafka)上发布事件,并在另一个微服务上使用事件。
CQRS
一种模式,建议将读取操作与写入或更新操作分开。 从创建单独的类到使用不同的数据库,这可以通过多种方式完成。
CQRS的主要好处是代码的逻辑划分,使其更清晰。
演示应用概述
该应用程序将包含一个Spring Boot,该Boot模拟一个电子商务结帐平台。 通过REST端点,您可以添加或编辑包含id
, name
和quantity
属性的产品。
遵循CQRS概念,将有用于命令和查询的单独模块:
Command Side:将包含
POST
和PUT
端点,这将生成其各自的commands
,这些commands
将转换为events
。 这些事件将以原始格式存储到MongoDb数据库中,同时还将进行处理以生成最终的应用程序状态并存储在Postgres数据库中。查询端:将包含
GET
端点,以获取我们的电子商务购物车的最新快照。
Axon Framework为我们提供了有关CQRS和事件源实现的简单方法,使您易于理解数据流。
依存关系
-
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