Skip to main content

Vert.x Discovery Backend - Zookeeper

The service discovery has a plug-able backend using the ServiceDiscoveryBackend SPI.

This is an implementation of the SPI based on Apache Zookeeper.

Using the Zookeeper backend

To use the Zookeeper backend, add the following dependency to the dependencies section of your build descriptor:

  • Maven (in your pom.xml):

<dependency>
  <groupId>io.vertx</groupId>
  <artifactId>vertx-service-discovery-backend-zookeeper-scala_2.12</artifactId>
  <version>3.5.0</version>
</dependency>
  • Gradle (in your build.gradle file):

compile 'io.vertx:vertx-service-discovery-backend-zookeeper-scala_2.12:3.5.0'

Be aware that you can have only a single implementation of the SPI in your classpath. If none, the default backend is used.

Configuration

There is a single mandatory configuration attribute: connection. Connection is the Zookeeper connection string.

Here is an example:

ServiceDiscovery.create(vertx, ServiceDiscoveryOptions()
  .setBackendConfiguration(new io.vertx.core.json.JsonObject().put("connection", "127.0.0.1:2181"))
)

Additionally you can configure:

  • maxRetries: the number of connection attempt, 3 by default

  • baseSleepTimeBetweenRetries: the amount of milliseconds to wait between retries (exponential backoff strategy). 1000 ms by default.

  • connectionTimeoutMs: the connection timeout in milliseconds. Defaults to 1000.

  • canBeReadOnly : whether or not the backend support the read-only mode (defaults to false)

  • basePath: the Zookeeper path in which the service records are stored. Default to /services.

  • ephemeral: whether or not the created nodes are ephemeral nodes (see https://zookeeper.apache.org/doc/r3.4.5/zookeeperOver.html#Nodes+and+ephemeral+nodes). false by default

  • guaranteed: whether or not to guarantee the node deletion even in case of failure. false by default

ServiceDiscovery.create(vertx, ServiceDiscoveryOptions()
  .setBackendConfiguration(new io.vertx.core.json.JsonObject().put("connection", "127.0.0.1:2181").put("ephemeral", true).put("guaranteed", true).put("basePath", "/services/my-backend"))
)

How are stored the records

The records are stored in individual nodes structured as follows:

basepath (/services/)
   |
   |- record 1 registration id => the record 1 is the data of this node
   |- record 2 registration id => the record 2 is the data of this node