将事件存储与Axon Framework 3和Spring Boot结合使用

时间:2018-09-05 14:02:13

标签: spring-boot microservices cqrs axon

我正在尝试实现一个简单的分布式应用程序,并且我想将所有事件保存到事件存储中。 因此,正如Axon here的“文档”中所建议的那样,我想使用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用作事件存储?

1 个答案:

答案 0 :(得分:1)

由于参考指南当前未指定此内容,因此我将在此处指出。 当前,在分发Axon应用程序或将Axon应用程序分为(微)服务时,您大致遵循两种方法:

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

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

但是,如果您要乘坐路线1,则必须提供几种配置

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

要分发事件,可以采取三种方法:

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

尽管我个人偏好启动应用程序时,是开始一个整体并在必要时分开。 我认为“演化微服务”一词很好地理解了这一点。

无论如何,如果要充分利用Axon支持的消息传递范例,在病房之后将Query端从Query端分离出来应该很简单。 如果您还使用AxonHub分发消息,那么您实际上已经完成了。

最后,我没有从您的问题中找到非常确切的要求。 这会给您提供进行下一步所需的信息吗,@ Federico Ponzi?

更新

经过深思熟虑,我认为您的解决方案非常简单。 您正在使用Spring Boot,并且想要设置EventStore以使用MySQL。为了使Axon设置正确的EventStorageEngine(用于读取/写入事件的幕后组件),您可以简单地在spring-boot-starter-data-jpa上添加依赖项。 在这种情况下,Axon的自动配置功能会自动注意到您在类路径中具有Spring Data JPA,因此将设置JpaEventStorageEngine