axon-springcloudmodule is available on the classpath. The easiest way is to include the Spring Cloud starter (
axon-springcloud-spring-boot-starter) from this extension to your project.
SpringHttpCommandBusConnector. The former is the
CommandRouterand latter the
CommandBusConnector, both used by the
DistributedCommandBusto enable command distribution.
SpringCloudCommandRouteruses Spring Cloud's discovery mechanism to find the other nodes in the cluster. To that end it uses the
Registrationfrom Spring Cloud. These are respectively used to gather remote command routing information and maintain local information. The most straightforward way to retrieve both is by annotating your application with
Registrationis just the local
ServiceInstance, whereas the
DiscoveryClientprovides the API to find remote
ServiceInstances. Furthermore, it is the
ServiceInstancewhich provides us with the required information (e.g. the URI) to retrieve a node's capabilities.
Spring Cloud's Heartbeat RequirementWhen using the
SpringCloudCommandRouter, make sure your Spring application has heartbeat events enabled. The heartbeat events published by a Spring Cloud application are the trigger to check if the set of
ServiceInstances from the
DiscoveryClienthas been changed. Additionally, it is used to validate whether the command routing capabilities for known nodes has been altered.Thus, if heartbeat events are disabled, your instance will no longer be updated with the current command routing capabilities. If so, this will cause issues during command routing.
ServiceInstanceis maintained in the
CapabilityDiscoveryMode. It is thus the
CapabilityDiscoveryModewhich provides us the means to actually retrieve a
ServiceInstance's set of commands it can handle (if any). The sole full implementation provided of the
CapabilityDiscoveryMode, is the
RestCapabilityDiscoveryMode, using a
ServiceInstanceURI to invoke a configurable endpoint. This endpoint leads to the
MemberCapabilitiesControllerwhich in turn exposes the
RestCapabilityDiscoveryModeof that instance.
CapabilityDiscoveryMode, providing two additional features:
CapabilityDiscoveryModedecorator which on failure of retrieving the
MemberCapabilitieswill place the given
ServiceInstanceon a list to be ignored for future validation. It thus effectively removes discoverable
ServiceInstances from the set.
CapabilityDiscoveryModedecorator which regardless of what this instance can handle as commands, state it can handle anything. This decorator comes in handy if the nodes in the system are homogeneous (aka, everybody can handle the same set of commands).
CapabilityDiscoveryModeare arguably the heart of the
SpringCloudCommandRouter. There are, however, a couple of additional things you can configure for this router, which are the following:
RoutingStrategy- The component in charge of deciding which of the nodes receives the commands consistently. By default, a
AnnotationRoutingStrategyis used (see Distributing the Command Bus for more).
ServiceInstancefilter - This
Predicateis used to filter out
ServiceInstances retrieved through the
DiscoveryClient. For example, it allows the removal of instances which are known to not handle any command messages. This might be useful if you have several services within the Spring Cloud Discovery Service set up, which you do not ever want to take into account for command handling.
ConsistentHashChangeListener- Adding a consistent hash change listener provides you with the opportunity to perform a specific task if new nodes have been added to the known command handlers set.
Differing Command Capabilities per NodeIt is not required for all nodes to have the same set of command handlers. You may use different segments for different command types altogether. The Distributed Command Bus will always choose a node to dispatch a command to the one that has support for that specific type of command.
CommandBusConnectoris in charge of sending commands, based on a given route, from one node to another. This extension to that end provides the
SpringHttpCommandBusConnector, which uses plain REST for sending commands.
CommandBus- This "local segment" is the command bus which dispatches commands into the local JVM. It is thus invoked when the
SpringHttpCommandBusConnectorreceives a command from the outside, or if it receives a command which is meant for itself.
RestOperations- The service used to POST a command message to another instance. In most situations the
RestTemplateis used for this.
Serializer- The serializer is used to serialize the command messages before they are sent over and deserialize when they are received.
Executor(optional) - The
Executoris used to handle incoming commands and to dispatch commands. Defaults to a
axon-springcloud-spring-boot-starterdependency to automatically retrieve all required beans. In either case, your application should be marked to enable it as a discoverable service through Spring Cloud. This can, for example, be done by annotating the main class with