将 eventstore 与 Axon Framework 3 和 Spring Boot 一起使用
Use eventstore with Axon Framework 3 and Spring Boot
我正在尝试实现一个简单的分布式应用程序,我想将所有事件保存到事件存储中。
出于这个原因,正如 Axon here 的 "documentation" 中所建议的,我想使用 Mysql 作为事件存储。
由于我对 Spring 的使用经验不多,所以我不明白如何让它工作。
我会有两个单独的服务,一个用于命令端,一个用于查询端。由于我计划拥有更多服务,我想知道如何配置它们以使用外部事件存储(不存储在任何这些服务中)。
对于命令和事件的分发,我使用的是 RabbitMQ:
@Bean
public org.springframework.amqp.core.Exchange exchange() {
return ExchangeBuilder.fanoutExchange("AxonEvents").build();
}
@Bean
public Queue queue() {
return QueueBuilder.durable("AxonEvents").build();
}
@Bean
public Binding binding() {
return BindingBuilder.bind(queue()).to(exchange()).with("*").noargs();
}
@Autowired
public void configure(AmqpAdmin admin)
{
admin.declareExchange(exchange());
admin.declareQueue(queue());
admin.declareBinding(binding());
}
这会在本地 运行 RabbitMQ 实例上创建所需的队列(使用默认用户名和密码)。
我的问题是:如何配置 Axon 以将 mysql 用作事件存储?
参考指南目前没有具体说明,我在这里指出。
当前,在分发 Axon 应用程序或将 Axon 应用程序分离为(微)服务时,您大致可以遵循两种方法:
采用您可以在开发人员环境中执行的方法 2,您只需 运行 AxonHub 和 AxonDb 并将它们配置到您的应用程序。
就是这样,你完成了;您可以扩展您的应用程序,所有消息都按需要路由。
但是如果你想走路线1,你需要提供几个配置
首先,您声明您使用 RabbitMQ 来路由命令和事件。
事实上,该框架根本不允许使用 RabbitMQ 路由命令。请注意 它是 分发 EventMessages
的解决方案,而不是 CommandMessages
。
我建议使用 JGroups or Spring Cloud 在开源场景中路由你的命令(我已经添加了指向参考指南页面的链接,关于为 JGroups 和 Spring 云分发 CommandBus
)。
要分发您的活动,您可以采用三种方法:
不过,在启动应用程序时,我个人的偏好是从 一个整体开始,并在必要时分开。
我认为 'Evolutionary Micro Services' 这个词很好地表达了这一点。
无论如何,如果您充分利用 Axon 支持的消息传递范例,那么在 wards 之后将命令端与查询端分开应该非常简单。
如果您还使用 AxonHub 来分发您的消息,那么您实际上已经完成了。
最后,我没有从您的问题中找到非常准确的请求。
这是否为您提供了继续所需的信息,@Federico Ponzi?
更新
经过深思熟虑,我认为您的解决方案非常简单。
您正在使用 Spring 引导,并且您希望将 EventStore
设置为使用 MySQL。为了让 Axon 设置正确的 EventStorageEngine
(在幕后使用 read/write 事件的基础组件),您可以简单地添加对 spring-boot-starter-data-jpa
的依赖。
Axon 它的自动配置将在这种情况下自动注意到您的类路径上有 Spring Data JPA,因此将设置 JpaEventStorageEngine
.
我正在尝试实现一个简单的分布式应用程序,我想将所有事件保存到事件存储中。 出于这个原因,正如 Axon here 的 "documentation" 中所建议的,我想使用 Mysql 作为事件存储。
由于我对 Spring 的使用经验不多,所以我不明白如何让它工作。 我会有两个单独的服务,一个用于命令端,一个用于查询端。由于我计划拥有更多服务,我想知道如何配置它们以使用外部事件存储(不存储在任何这些服务中)。
对于命令和事件的分发,我使用的是 RabbitMQ:
@Bean
public org.springframework.amqp.core.Exchange exchange() {
return ExchangeBuilder.fanoutExchange("AxonEvents").build();
}
@Bean
public Queue queue() {
return QueueBuilder.durable("AxonEvents").build();
}
@Bean
public Binding binding() {
return BindingBuilder.bind(queue()).to(exchange()).with("*").noargs();
}
@Autowired
public void configure(AmqpAdmin admin)
{
admin.declareExchange(exchange());
admin.declareQueue(queue());
admin.declareBinding(binding());
}
这会在本地 运行 RabbitMQ 实例上创建所需的队列(使用默认用户名和密码)。
我的问题是:如何配置 Axon 以将 mysql 用作事件存储?
参考指南目前没有具体说明,我在这里指出。 当前,在分发 Axon 应用程序或将 Axon 应用程序分离为(微)服务时,您大致可以遵循两种方法:
采用您可以在开发人员环境中执行的方法 2,您只需 运行 AxonHub 和 AxonDb 并将它们配置到您的应用程序。 就是这样,你完成了;您可以扩展您的应用程序,所有消息都按需要路由。
但是如果你想走路线1,你需要提供几个配置
首先,您声明您使用 RabbitMQ 来路由命令和事件。
事实上,该框架根本不允许使用 RabbitMQ 路由命令。请注意 它是 分发 EventMessages
的解决方案,而不是 CommandMessages
。
我建议使用 JGroups or Spring Cloud 在开源场景中路由你的命令(我已经添加了指向参考指南页面的链接,关于为 JGroups 和 Spring 云分发 CommandBus
)。
要分发您的活动,您可以采用三种方法:
不过,在启动应用程序时,我个人的偏好是从 一个整体开始,并在必要时分开。 我认为 'Evolutionary Micro Services' 这个词很好地表达了这一点。
无论如何,如果您充分利用 Axon 支持的消息传递范例,那么在 wards 之后将命令端与查询端分开应该非常简单。 如果您还使用 AxonHub 来分发您的消息,那么您实际上已经完成了。
最后,我没有从您的问题中找到非常准确的请求。 这是否为您提供了继续所需的信息,@Federico Ponzi?
更新
经过深思熟虑,我认为您的解决方案非常简单。
您正在使用 Spring 引导,并且您希望将 EventStore
设置为使用 MySQL。为了让 Axon 设置正确的 EventStorageEngine
(在幕后使用 read/write 事件的基础组件),您可以简单地添加对 spring-boot-starter-data-jpa
的依赖。
Axon 它的自动配置将在这种情况下自动注意到您的类路径上有 Spring Data JPA,因此将设置 JpaEventStorageEngine
.