我正在运行三个不同的服务(A,B和C),所有服务都已连接到axonserver 4.3.3。除了它们之外,我还包含一个包含所有事件的api服务,以便可以在所有服务之间共享它。当事件被触发时(由服务A说),其他服务(B和C)正在监听该事件,并且它们会做出相应的反应。
现在我也想共享查询,以便当一个服务(比如说A)想要属于另一个服务(比如说B)的某些信息时,它可以直接触发相应的查询,该查询将被服务B侦听并返回该信息。
更新
我只是将查询添加到common-api服务,并按如下所示从服务A触发了它:
queryGateway.query( findCourierByIdQuery, responseType)
时:我没有找到queryhandler异常queryGateway.subscriptionQuery( findCourierByIdQuery, initialResponseType, updateResponseType)
时:我什么也没有得到queryGateway.scatterGather( findCourierByIdQuery, responseType, timeout, timeUnit)
时:我得到了一个空流当我从服务B本身触发findCourierByIdQuery时,queryhandler被调用,并且我得到了正确的响应。
我的观察是,查询处理程序仅在查询是从同一组件(在这种情况下为服务B)触发的情况下才调用的,如果我从其他组件(服务A)触发查询则不会被调用。
请注意,所有服务都在不同的主机和端口上独立运行,但是连接到相同的轴突服务器,并且查询句柄写在服务B中。
所以基本上实现是这样的:
最佳答案
我认为这完全没问题!
Axon使用三种类型的消息:命令,事件和查询。它们代表您的服务的API。
下游服务(在您的情况下为B&C)可以发送命令,订阅事件,或发送(并订阅)上游服务的查询(在您的情况下为A)。简而言之,B&C依赖于A。如果可能的话,使此依赖关系为单向是很重要的(唯一的B依赖于A,而不是相反)。
通常,您希望在下游服务(B&C)的边缘有一个anti-corruption layer component
。它可以将事件从上游服务(A)转换为其自己的命令,并且可以将其自身的事件转换为上游服务(A)的命令。这是Saga或常规的事件处理程序(处理器)。
如果您对查询感兴趣,那么您的anti-corruption layer component
将使用查询网关从上游服务(A)发出(订阅)查询,并希望以自动化方式将响应转换为命令,类似于我提到的Saga / Event Handlers。 。通常,通过Query API进行的这种集成不是完全自动化的:从查询到命令的转换涉及用户。在这种情况下,服务B(下游)正在使用(服务A的)查询响应来呈现视图,用户可以从该视图发出下一个命令(服务B)
在下游系统中具有反腐败层组件将使您的服务自治。
最好,
伊万