This module implements generic a libcluster Consul Strategy.
- Supports Agent HTTP API, Catalog HTTP API and Health HTTP API
- Supports multisites (i.e. multiple datacenters), including taking them dynamically by listing all datacenters available.
There are multiple ways to configure the Consul strategy on libcluster:
config :libcluster,
topologies: [
consul_example: [
strategy: Cluster.Strategy.Consul,
config: [
# The base agent URL.
base_url: "http://consul.service.dc1.consul:8500",
# If authentication is needed, set the access token here.
access_token: "036c943f00594d9f97c10dec7e48ff19",
# Nodes list will be refreshed using Consul on each interval (in µs).
# Defaults to 5 seconds.
polling_interval: 10_000,
# The Consul endpoints used to fetch service nodes.
list_using: [
# If you want to use the Agent HTTP API as specified in
# https://www.consul.io/api/agent.html
Cluster.Strategy.Consul.Agent,
# If you want to use the Health HTTP Endpoint as specified in
# https://www.consul.io/api/health.html
{Cluster.Strategy.Consul.Health, [passing: true]},
# If you want to use the Catalog HTTP API as specified in
# https://www.consul.io/api/catalog.html
Cluster.Strategy.Consul.Catalog,
# If you want to join nodes from multiple datacenters, do:
{Cluster.Strategy.Consul.Multisite, [
datacenters: ["dc1", "dc2", "dc3", ...],
endpoints: [
... further endpoints ...
]
]},
# You can also list all datacenters:
{Cluster.Strategy.Consul.Multisite, [
datacenters: :all,
endpoints: [
... further endpoints ...
]
]},
]
# All configurations below are defined as default for all
# children endpoints.
# Datacenter parameter while querying.
dc: "dc1",
# The default service for children endpoints specifications.
service: [name: "service_name"],
# NOTE:
# Alternatively one could specify id for the service using
# service: [id: "service_id"]
# The keyword list should contain only one of them, either id or name.
# This is the node basename, the Name (first) part of an Erlang
# node name (before the @ part. If not specified, it will assume
# the same name as the current running node.
# The final node name will be "node_basename@<host_or_ip>"
node_basename: "app_name"
]]]Generic response of the Consul endpoints includes respective service's hostname of the node as well as it's IP. It is possible to establish connection using hostname exclusively by using following configuration. To retrieve only passing services :passing can be set to true which might be ignored if the API endpoint does not support health status. Default options use IP address of the node to establish connection
{Cluster.Strategy.Consul.Agent, [expected: :host, passing: true]}The Agent API comes with options to use id or name for service. Using id option gets the information about service directly using /agent/service/:service_id route. Whereas name option fetches the service using /agent/health/service/name/:service_name. Using id based service discovery ignores the service health status parameters.
The Catalog API Endpoint strictly requires the :name option to be specified with :service option. As Catalog API does not support any health status queries, It also ignores the :passing option.
The Health API Endpoint strictly requires the :name option to be specified with :service option. It supports :passing option in the query parameters.
def deps do
[
{:libcluster_consul, "~> 1.0.0"}
]
endYou can determine the latest version by running mix hex.info libcluster_consul in your shell, or by going to the libcluster_consul page on Hex.pm.
Documentation can be generated with ExDoc and published on HexDocs. Once published, the docs can be found at https://hexdocs.pm/libcluster_consul.
- Previously utilised
:service_nameoption has been changed to:servicewhich takes in either[id: service_id]or[name: "service_name"]. Please read through the respective endpoint requirements for further information. - Additional options can be specified to use
hostnamefor establishing connection between nodes.:passingoption can be used along with Agent Endpoint as well. - Multi-Datacenter Endpoint configurations should also follow the above changes in their respective configurations.