Consul - based cluster manager that is plugable into Vert.x ecosystem. Consul is a distributed, highly available, and data center aware solution to connect and configure applications across dynamic, distributed infrastructure.
As we all know Vert.x cluster managers are pluggable and so far we have 6 cluster manager implementations:
- Hazelcast - based: https://vertx.io/docs/vertx-hazelcast/java/
- Apache Zookeeper - based: https://vertx.io/docs/vertx-zookeeper/java/
- Apache Ignite - based: https://vertx.io/docs/vertx-ignite/java/
- JGroups - based: https://github.com/vert-x3/vertx-jgroups
- Atomix - based : https://github.com/atomix/atomix-vertx
- Infinispan - based : https://github.com/vert-x3/vertx-infinispan
If you are already using Consul along with Vert.x within your system - it might be a good fit to use Consul directly as main manager for :
- discovery and group membership of Vert.x nodes in a cluster Maintaining cluster wide topic subscriber lists (so we know which nodes are interested in which event bus addresses)
- distributed map support;
- distributed locks;
- distributed counters;
Note : Cluster managers do not handle the event bus inter-node transport, this is done directly by Vert.x with TCP connections.
Current consul cluster manager implementation is fully based on vertx-consul-client and vertx-core.
Version compatibility matrix
| Cluster manager | Vert.x | 
|---|---|
| 0.1.0 | 3.6.0 | 
| 0.2.0 | 3.6.1 | 
| 0.3.0 | 3.6.2 | 
| 0.4.0 | 3.6.3 | 
| 1.0.0 | 3.7.0 | 
| 1.1.0 | 3.7.1 | 
| 1.2.0 | 3.8.0 | 
| 1.2.1 | 3.8.1 | 
| 1.2.2 | 3.8.2 | 
| 3.9.1 | 3.9.1 | 
compile 'io.reactiverse:consul-cluster-manager:${cluster-manager-version}'<dependency>
  <groupId>io.reactiverse</groupId>
  <artifactId>consul-cluster-manager</artifactId>
  <version>${cluster-manager-version}</version>
</dependency>There's more than one way to create an instance of consul cluster manager.
- Defaut one:
ConsulClusterManager consulClusterManager = new ConsulClusterManager(); // Consul agent should be running then on localhost:8500. 
- Excplicilty specifying configuration:
JsonObject options = new JsonObject()
.put("host", "consulAgentHost") // host on which consul agent is running, if not specified default host will be used which is "localhost".
.put("port", consulAgentPort) // port on wich consul agent is runing, if not specified default port will be used which is "8500".
/*
 * There's an option to utilize built-in internal caching.
 * @{Code false} - enable internal caching of event bus subscribers - this will give us better latency but stale reads (stale subsribers) might appear.
 * @{Code true} - disable internal caching of event bus subscribers - this will give us stronger consistency in terms of fetching event bus subscribers,
 * but this will result in having much more round trips to consul kv store where event bus subs are being kept.
 */
.put("preferConsistency", false)
/*
 * Option to provide custom service name which is visible on web ui
 */
.put("serviceName", "my-custom-service")
/*
 * There's also an option to specify explictly host address on which given cluster manager will be operating on.
 * By defult InetAddress.getLocalHost().getHostAddress() will be executed.
 * Linux systems enumerate the loopback network interface the same way as regular LAN network interfaces, but the JDK
 * InetAddress.getLocalHost method does not specify the algorithm used to select the address returned under such circumstances, and will
 * often return the loopback address, which is not valid for network communication.
 */
 .put("nodeHost", "10.0.0.1");
 // consul client options can be additionally specified as needed.
ConsulClusterManager consulClusterManager = new ConsulClusterManager(options);
- Once cluster manager instance is created we can easily create clustered vertx. Voilà!
VertxOptions vertxOptions = new VertxOptions();
vertxOptions.setClusterManager(consulClusterManager);
Vertx.clusteredVertx(vertxOptions, res -> {
    if (res.succeeded()) {
	    // clustered vertx instance has been successfully created!
	    Vertx vertx = res.result();
	} else {
	    // something went wrong :(
	}
}
- Compliant with ONLY Vert.x 3.6.0+ release.
- The limit on a key's value size of any of the consul maps is 512KB.