为了这个问题,我正在做一个项目,其中有两个微服务:
根据我所读到的,为了进行这种更改,我们需要做以下几点:
SimpleCommandBus
->DistributedCommandBus
这是我们遇到麻烦的第四点:发票服务是由一个不愿意进行更改的单独团队维护的。
在这种情况下,使用消息代理而不是命令网关是否可行。例如,不要这样做:
public class OrderManagementSaga {
private boolean paid = false;
private boolean delivered = false;
@Inject
private transient CommandGateway commandGateway;
@StartSaga
@SagaEventHandler(associationProperty = "orderId")
public void handle(OrderCreatedEvent event) {
// client generated identifiers
ShippingId shipmentId = createShipmentId();
InvoiceId invoiceId = createInvoiceId();
// associate the Saga with these values, before sending the commands
SagaLifecycle.associateWith("shipmentId", shipmentId);
SagaLifecycle.associateWith("invoiceId", invoiceId);
// send the commands
commandGateway.send(new PrepareShippingCommand(...));
commandGateway.send(new CreateInvoiceCommand(...));
}
@SagaEventHandler(associationProperty = "shipmentId")
public void handle(ShippingArrivedEvent event) {
delivered = true;
if (paid) { SagaLifecycle.end(); }
}
@SagaEventHandler(associationProperty = "invoiceId")
public void handle(InvoicePaidEvent event) {
paid = true;
if (delivered) { SagaLifecycle.end(); }
}
// ...
}
我们可以这样做:
public class OrderManagementSaga {
private boolean paid = false;
private boolean delivered = false;
@Inject
private transient RabbitTemplate rabbitTemplate;
@StartSaga
@SagaEventHandler(associationProperty = "orderId")
public void handle(OrderCreatedEvent event) {
// client generated identifiers
ShippingId shipmentId = createShipmentId();
InvoiceId invoiceId = createInvoiceId();
// associate the Saga with these values, before sending the commands
SagaLifecycle.associateWith("shipmentId", shipmentId);
SagaLifecycle.associateWith("invoiceId", invoiceId);
// send the commands
rabbitTemplate.convertAndSend(new PrepareShippingCommand(...));
rabbitTemplate.convertAndSend(new CreateInvoiceCommand(...));
}
@SagaEventHandler(associationProperty = "shipmentId")
public void handle(ShippingArrivedEvent event) {
delivered = true;
if (paid) { SagaLifecycle.end(); }
}
@SagaEventHandler(associationProperty = "invoiceId")
public void handle(InvoicePaidEvent event) {
paid = true;
if (delivered) { SagaLifecycle.end(); }
}
// ...
}
在这种情况下,当我们从exchange中的InvoiceService收到消息时,我们将在事件网关或使用SpringAMQPublisher发布相应的事件。
问题:
首先,您指的是支持分布式消息传递的Axon扩展,而不是完全针对您的问题定制的。尽管这确实是一个选项,但要知道,这将要求您配置几个单独的解决方案,专门用于分布式命令、事件和事件存储。为此使用统一的解决方案,如Axon Server,将确保用户不必使用三种(或更多)不同的方法来使其全部工作。相反,Axon Server附加到Axon Framework应用程序,它为您完成所有的分发和事件存储。
因此,如果要使用Axon Server,那么DistributedCommandBus
和SpringAMQPpPublisher
之类的东西对于实现您的目标是不必要的。
这是一个可以简化你生活的片段;当然,这绝不是必要的。让我们来讨论你的实际问题:
这是一个有效的方法吗?
我认为一个传奇以这种形式充当反腐败层是完全没有问题的。一个传奇声明它对事件做出反应并发送操作。这些操作是以命令的形式还是以另一个第三方服务的形式完全取决于您。
不过请注意,我觉得AMQP更多的是一种分布式事件的解决方案(在广播方法中),而不是发送命令(到直接处理程序)的方法。它可以根据你的需要进行变形,但我认为它对指挥调度来说是次优的,因为它需要调整。
那是我的两分钱,希望这能帮到你!
我有一个Spring Boot微服务项目,用三个微服务来测试分布式事务管理的saga模式。 当我使用 命令后,微服务无法连接到Axon服务器,我收到了以下错误: 我的问题是为什么微服务在中寻找axon服务器,这显然是错误的,并且违反了它们在中的配置: 这里的轴子服务器的容器名称。
Spring Boot 2.3.0.Release(带有启动程序:Data、JPA、web、mysql) 轴突Spring启动器-4.2.1 每个服务在mysql服务器中使用不同的模式。 当我在激活axon框架的情况下启动spring boot服务时,在每个应用程序的数据库模式中创建了一些令牌、SAGA等表。
我对尝试将微服务/SOA作为一种体系结构非常感兴趣,并且很难对服务之间的集成进行概念化。 我喜欢使用消息传递将客户端与服务分离的想法,但不理解系统如何独占地使用它。典型的异步操作和发布/订阅显然是有意义的——比如创建新订单、广播数据以进行报告等。我不明白的是,人们是否通常尝试在常见的请求/回复场景中使用消息传递——例如,用户点击他们的“个人资料”页面,而需要在页面上呈现的部分数据来自用户服务。 我
我将非常感谢任何答复以及文章,在您的意见可能有助于这里。提前谢谢你。
我对Axon框架比较陌生,只是评估框架是否适合我的项目。本文描述了事件的版本控制。但是在本例中,EventStore更改为JPA。是否可以将Axon服务器上传事件作为事件存储?还是我误解了什么?
我正在写一个微服务的应用程序,由Spring Boot和Spring云。我有五个模块 API网关(基于Spring云网关spect) Discovery-Server(基于Spring云NetflixEureka服务发现) Microservice-A(它是一个包含我们业务的Spring引导应用程序) Microservice-B(它是一个包含我们业务的Spring引导应用程序) Microser