我正在尝试实现一个简单的分布式应用程序,并且我想将所有事件保存到事件存储中。 因此,正如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用作事件存储?
答案 0 :(得分:1)
由于参考指南当前未指定此内容,因此我将在此处指出。 当前,在分发Axon应用程序或将Axon应用程序分为(微)服务时,您大致遵循两种方法:
采用方法2(您可以在开发人员环境中进行操作),则只需运行AxonHub和AxonDb并将它们配置到您的应用程序中。 就这样,您完成了;您可以扩展您的应用程序,并且所有消息均按需要路由。
但是,如果您要乘坐路线1,则必须提供几种配置
首先,您声明使用RabbitMQ路由命令和事件。
实际上,该框架根本不完全允许使用RabbitMQ来路由命令。请注意这是一种分发EventMessages
而不是CommandMessages
的解决方案。
我建议在开放源代码场景中使用JGroups或Spring Cloud来路由您的命令(我已向参考指南页面添加了有关为JGroups和Spring Cloud分发CommandBus
的链接)。
要分发事件,可以采取三种方法:
尽管我个人偏好启动应用程序时,是开始一个整体并在必要时分开。 我认为“演化微服务”一词很好地理解了这一点。
无论如何,如果要充分利用Axon支持的消息传递范例,在病房之后将Query端从Query端分离出来应该很简单。 如果您还使用AxonHub分发消息,那么您实际上已经完成了。
最后,我没有从您的问题中找到非常确切的要求。 这会给您提供进行下一步所需的信息吗,@ Federico Ponzi?
经过深思熟虑,我认为您的解决方案非常简单。
您正在使用Spring Boot,并且想要设置EventStore
以使用MySQL。为了使Axon设置正确的EventStorageEngine
(用于读取/写入事件的幕后组件),您可以简单地在spring-boot-starter-data-jpa
上添加依赖项。
在这种情况下,Axon的自动配置功能会自动注意到您在类路径中具有Spring Data JPA,因此将设置JpaEventStorageEngine
。