consul/website/source/intro/getting-started/services.html.markdown

3.0 KiB

layout page_title sidebar_current
intro Registering Services gettingstarted-services

Registering Services

In the previous page, we created a simple cluster. Although the cluster members could see each other, there were no registered services. In this page, we'll modify our client to export a service.

Defining a Service

A service can be registered either by providing a service definition, or by making the appropriate calls to the HTTP API. First we start by providing a simple service definition. We will by using the same setup as in the last page. On the second node, we start by creating a simple configuration:

$ sudo mkdir /etc/consul
$ echo '{"service": {"name": "web", "tags": ["rails"], "port": 80}}' | sudo tee /etc/consul/web.json

We now restart the second agent, providing the configuration directory as well as the first node to re-join:

$ consul agent -data-dir /tmp/consul -node=agent-two -serf-bind=172.20.20.11 -server-addr=172.20.20.11:8300 -advertise=172.20.20.11 -config-dir /etc/consul/
==> Starting Consul agent...
...
    [INFO] agent: Synced service 'web'
...

Querying Services

Once the agent gets started, we should see a log output indicating that the web service has been synced with the Consul servers. We can first check using the HTTP API:

$ curl http://localhost:8500/v1/catalog/service/web
[{"Node":"agent-two","Address":"172.20.20.11","ServiceID":"web","ServiceName":"web","ServiceTags":["rails"],"ServicePort":80}]

We can also do a simple DNS lookup for any nodes providing the web service:

$ dig @127.0.0.1 -p 8600 web.service.consul

; <<>> DiG 9.8.1-P1 <<>> @127.0.0.1 -p 8600 web.service.consul
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 1204
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; WARNING: recursion requested but not available

;; QUESTION SECTION:
;web.service.consul.		IN	A

;; ANSWER SECTION:
web.service.consul.	0	IN	A	172.20.20.11

We can also filter on tags, here only requesting services matching the rails tag, and specifically requesting SRV records:

$ dig @127.0.0.1 -p 8600 rails.web.service.consul SRV

; <<>> DiG 9.8.1-P1 <<>> @127.0.0.1 -p 8600 rails.web.service.consul SRV
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 45798
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available

;; QUESTION SECTION:
;rails.web.service.consul.	IN	SRV

;; ANSWER SECTION:
rails.web.service.consul. 0	IN	SRV	1 1 80 agent-two.node.dc1.consul.

;; ADDITIONAL SECTION:
agent-two.node.dc1.consul. 0	IN	A	172.20.20.11

This shows how simple it is to get started with services. Service definitions can be updated by changing configuration files and sending a SIGHUP to the agent. Alternatively the HTTP API can be used to add, remove and modify services dynamically.