除了默认的AxonServer之外,SpringCloud是分发命令总线(命令)的另一种方法。 SpringCloudExtension使用SpringCloud描述的服务注册和发现机制来分发命令总线。因此,您可以选择在发现分发命令的路由时使用哪个SpringCloud实现。Netflix的EurekaDiscoveryEurekaServer组合或HashiCorp的Consul就是一个例子。 要使用Axon的SpringCloud组件,请确保axonspringcloud模块在类路径中可用。最简单的方法是将此扩展中的SpringCloudstarter(axonspringcloudspringbootstarter)包含到您的项目中。 给出每个SpringCloud实现的描述会使这个参考指南走得太远。有关其他SpringCloud实现选项的信息,请参阅它们各自的文档。 SpringCloud连接器设置是SpringCloudCommandRouter和SpringHttpCommandBusConnector的组合。前者是CommandRouter,后者是CommandBusConnector,两者都被DistributedCommandBus用来启用命令分发。发现命令路由 SpringCloudCommandRouter使用SpringCloud的发现机制来查找集群中的其他节点。为此,它使用SpringCloud的DiscoveryClient和Registration。这些分别用于收集远程命令路由信息和维护本地信息。检索两者最直接的方法是使用EnableDiscoveryClient注解您的应用程序。 收集和存储命令路由信息围绕着SpringCloud的ServiceInstances。Registration只是本地的ServiceInstance,而DiscoveryClient提供了API来查找远程ServiceInstance。此外,正是ServiceInstance为我们提供了检索节点功能所需的信息(例如URI)。 NoteSpringCloud的心跳需求 使用SpringCloudCommandRouter时,请确保您的Spring应用程序启用了心跳事件。SpringCloud应用程序发布的心跳事件是检查DiscoveryClient中的ServiceInstances集是否已更改的触发器。此外,它还用于验证已知节点的命令路由功能是否已更改。 因此,如果心跳事件被禁用,您的实例将不再使用当前的命令路由功能进行更新。如果是这样,这将在命令路由期间引起问题。 存储本地功能和发现ServiceInstance的远程功能的逻辑在CapabilityDiscoveryMode中维护。因此,CapabilityDiscoveryMode为我们提供了实际检索它可以处理的ServiceInstance的命令集(如果有的话)的方法。CapabilityDiscoveryMode提供的唯一完整实现是RestCapabilityDiscoveryMode,使用RestTemplate和ServiceInstanceURI来调用可配置的端点。该端点通向MemberCapabilitiesController,后者又在该实例的RestCapabilityDiscoveryMode上公开MemberCapabilities。 CapabilityDiscoveryMode存在装饰器,提供两个附加功能:IgnoreListingDiscoveryMode一个CapabilityDiscoveryMode装饰器,它在检索MemberCapabilities失败时会将给定的ServiceInstance放在一个列表中,以供将来验证时忽略。因此,它有效地从集合中删除了可发现的ServiceInstances。AcceptAllCommandsDiscoveryMode一个CapabilityDiscoveryMode装饰器,无论此实例可以作为命令处理什么,都表明它可以处理任何事情。如果系统中的节点是同质的(也就是说,每个人都可以处理相同的命令集),这个装饰器就会派上用场。 Registration、DiscoveryClient和CapabilityDiscoveryMode可以说是SpringCloudCommandRouter的核心。但是,您可以为此路由器配置一些额外的东西,如下所示:RoutingStrategy负责决定哪个节点一致地接收命令的组件。默认情况下,使用AnnotationRoutingStrategy(有关更多信息,请参阅分发命令总线)。ServiceInstance过滤器此Predicate用于过滤掉通过DiscoveryClient检索到的ServiceInstance。例如,它允许删除已知不处理任何命令消息的实例。如果您在SpringCloudDiscovery服务中设置了多个服务,这可能很有用,而您不想在命令处理中考虑这些服务。ConsistentHashChangeListener如果新节点已添加到已知命令处理程序集中,添加一致的哈希更改侦听器可为您提供执行特定任务的机会。 Note每个节点的不同命令能力 不需要所有节点都具有相同的命令处理程序集。您可以将不同的段完全用于不同的命令类型。分布式命令总线将始终选择一个节点将命令分派给支持该特定类型命令的节点。在节点之间发送命令 CommandBusConnector负责根据给定的路由从一个节点到另一个节点发送命令。这个扩展提供了SpringHttpCommandBusConnector,它使用普通的REST来发送命令。 创建此服务时有三个硬性要求和一个可选配置:本地CommandBus这个localsegment是将命令分发到本地JVM的命令总线。因此,当SpringHttpCommandBusConnector接收到来自外部的命令时,或者如果它接收到对自己有意义的命令时,就会调用它。RestOperations用于将命令消息发布到另一个实例的服务。在大多数情况下,RestTemplate用于此目的。SerializerSerializer用于在发送命令消息之前对其进行序列化,并在接收到命令消息时对其进行反序列化。Executor(可选)Executor用于处理传入的命令和调度命令。默认为DirectExecutor实例。配置此扩展 如果您也在使用SpringCloud,那么您将使用SpringBoot的可能性很高。随着配置的进行,这将选择使用axonspringcloudspringbootstarter依赖项来自动检索所有必需的bean。在任何一种情况下,您的应用程序都应该被标记为通过SpringCloud将其启用为可发现的服务。例如,这可以通过使用EnableDiscoveryClient注解主类来完成。 仍然有很多可自定义的组件。有关一些建议,请查看以下示例: 自定义bean配置:CustomSpringBootapp,enablingaDiscoveryClientandRegistrationthroughEnableDiscoveryClientEnableDiscoveryClientSpringBootApplicationpublicclassMyApplication{publicstaticvoidmain(String〔〕args){SpringApplication。run(MyApplication。class,args);}BeanpublicCapabilityDiscoveryModecapabilityDiscoveryMode(RestTemplaterestTemplate,Serializerserializer){returnRestCapabilityDiscoveryMode。builder()。restTemplate(restTemplate)。serializer(serializer)Allowschangingtheendpointusedtofindmembercapabilities。messageCapabilitiesEndpoint(custommessageinformationendpoint)。build();}BeanpublicCommandRouterspringCloudCommandRouter(DiscoveryClientdiscoveryClient,RegistrationlocalServiceInstance,CapabilityDiscoveryModecapabilityDiscoveryMode){returnSpringCloudCommandRouter。builder()。discoveryClient(discoveryClient)。routingStrategy(newAnnotationRoutingStrategy())。localServiceInstance(localServiceInstance)。capabilityDiscoveryMode(capabilityDiscoveryMode)。serviceInstanceFilter(customServiceInstancefilter)。consistentHashChangeListener(ConsistentHashchangelistener)。build();}OnlyrequiredifAxonSpringBootStarterisnotusedBeanQualifier(localSegment)publicCommandBuslocalSegment(){returnSimpleCommandBus。builder()。build();}BeanpublicCommandBusConnectorspringHttpCommandBusConnector(Qualifier(localSegment)CommandBuslocalSegment,RestOperationsrestOperations,Serializerserializer){returnSpringHttpCommandBusConnector。builder()。localCommandBus(localSegment)。restOperations(restOperations)。serializer(serializer)。executor(customExecutor)。build();}BeanPrimarypublicDistributedCommandBusdistributedCommandBus(CommandRoutercommandRouter,CommandBusConnectorcommandBusConnector){returnDistributedCommandBus。builder()。commandRouter(commandRouter)。connector(commandBusConnector)。build();}} SpringBootAutoConfiguration:需要启用DistributedCommandBusaxon。distributed。enabledtrue定义用于此segment的负载系数。默认为100axon。distributed。loadfactor100定义使用的CapabilityDiscoveryMode。默认为RESTaxon。distributed。springcloud。moderest定义用于从中检索成员功能的端点。默认为membercapabilitiesaxon。distributed。springcloud。restmodeurlmycustomendpoint定义是否应该修饰CapabilityDiscoveryMode以忽略有故障的ServiceInstancesaxon。distributed。springcloud。enableignorelistingtrue定义是否应该修饰CapabilityDiscoveryMode以接受所有类型的命令axon。distributed。springcloud。enableacceptallcommandstrue