将 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 应用程序分离为(微)服务时,您大致可以遵循两种方法:

  1. 使用完全开源的方法
  2. 使用AxonHub / AxonDb

采用您可以在开发人员环境中执行的方法 2,您只需 运行 AxonHub 和 AxonDb 并将它们配置到您的应用程序。 就是这样,你完成了;您可以扩展您的应用程序,所有消息都按需要路由。

但是如果你想走路线1,你需要提供几个配置

首先,您声明您使用 RabbitMQ 来路由命令和事件。 事实上,该框架根本不允许使用 RabbitMQ 路由命令。请注意 它是 分发 EventMessages 的解决方案,而不是 CommandMessages。 我建议使用 JGroups or Spring Cloud 在开源场景中路由你的命令(我已经添加了指向参考指南页面的链接,关于为 JGroups 和 Spring 云分发 CommandBus)。

要分发您的活动,您可以采用三种方法:

  1. 为您的活动使用共享数据库。
  2. 使用 AMQP 将您的事件发送到不同的实例。
  3. 使用 Kafka 将您的事件发送到不同的实例。

不过,在启动应用程序时,我个人的偏好是 一个整体开始,并在必要时分开。 我认为 '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.