我正在尝试实现一个简单的分布式应用程序,我想将所有事件保存到事件存储中。出于这个原因,正如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作为事件存储?
由于参考指南目前没有具体说明,我将在此指出。目前,在分发Axon应用程序或将Axon应用程序分离为(微)服务时,您大致有两种方法:
采用方法2,您可以在开发人员环境中执行,您只需运行AxonHub和AxonDb并将它们配置到您的应用程序。就是这样,你做完了;您可以扩展您的应用程序,并根据需要路由所有消息。
但是,如果您想采用路线1,则必须提供多种配置
首先,您声明使用RabbitMQ来路由命令和事件。实际上,框架不仅仅允许使用RabbitMQ来路由命令。请注意它是分发EventMessages
的解决方案,而不是CommandMessages
。我建议使用JGroups或Spring Cloud在开源场景中路由你的命令(我已经添加了关于为JGroups和Spring Cloud分发CommandBus
的参考指南页面的链接)。
要分发您的活动,您可以采取三种方法:
我个人在开始申请时的偏好是从一个整体开始,必要时分开。我认为“进化微服务”一词很好地捕捉到了这一点。
如果你使用Axon支持的消息传递范例,那么如何在病房之后将命令端从查询端拆分出来应该非常简单。如果您另外使用AxonHub来分发您的消息,那么您几乎已经完成了。
最后,我没有从您的问题中找到非常确切的请求。这是否能为您提供所需的信息,@ Federico Ponzi?
在考虑了一些之后,我认为你的解决方案非常简单。您正在使用Spring Boot,并且您想要设置EventStore
以使用MySQL。要让Axon设置正确的EventStorageEngine
(封面下用于读/写事件的infra组件),您只需添加对spring-boot-starter-data-jpa
的依赖。 Axon它的自动配置将在该场景中自动注意到您的类路径上有Spring Data JPA,因此将设置JpaEventStorageEngine
。