2014-04-11 00:41:49 +00:00
---
layout: "intro"
page_title: "Registering Services"
sidebar_current: "gettingstarted-services"
2014-10-19 23:40:10 +00:00
description: |-
2015-03-13 18:56:58 +00:00
In the previous step, we ran our first agent, saw the cluster members (well, our cluster member), and queried that node. Now, we'll register our first service and query that service.
2014-04-11 00:41:49 +00:00
---
# Registering Services
2015-03-13 18:56:58 +00:00
In the previous step, we ran our first agent, saw the cluster members (well,
our cluster _member_ ), and queried that node. In this guide, we'll register
our first service and query that service.
2014-04-11 02:06:10 +00:00
## Defining a Service
2014-04-14 19:38:24 +00:00
A service can be registered either by providing a
2015-03-13 18:56:58 +00:00
[service definition ](/docs/agent/services.html ) or by making the appropriate
calls to the [HTTP API ](/docs/agent/http.html ).
2014-04-14 19:38:24 +00:00
2015-03-13 18:56:58 +00:00
A service definition is the most common way to register services, so we'll
use that approach for this step. We'll be building on the agent configuration
we covered in the [previous step ](/intro/getting-started/agent.html ).
2014-04-14 19:38:24 +00:00
2015-03-13 18:56:58 +00:00
First, create a directory for Consul configuration. Consul loads all
configuration files in the configuration directory, so a common convention
on Unix systems is to name the directory something like `/etc/consul.d`
(the `.d` suffix implies "this directory contains a set of configuration
files").
2014-04-11 02:06:10 +00:00
2014-10-19 23:40:10 +00:00
```text
2014-04-14 19:38:24 +00:00
$ sudo mkdir /etc/consul.d
2014-04-11 02:06:10 +00:00
```
2015-03-13 18:56:58 +00:00
Next, we'll write a service definition configuration file. Let's
2014-04-14 19:38:24 +00:00
pretend we have a service named "web" running on port 80. Additionally,
2015-03-13 18:56:58 +00:00
we'll give it a tag we can use as an additional way to query the service:
2014-04-11 02:06:10 +00:00
2014-10-19 23:40:10 +00:00
```text
2014-04-14 19:38:24 +00:00
$ echo '{"service": {"name": "web", "tags": ["rails"], "port": 80}}' \
>/etc/consul.d/web.json
```
2015-03-13 18:56:58 +00:00
Now, restart the agent, providing the configuration directory:
2014-04-14 19:38:24 +00:00
2014-10-19 23:40:10 +00:00
```text
2015-03-13 18:56:58 +00:00
$ consul agent -server -bootstrap-expect 1 -data-dir /tmp/consul \
-config-dir /etc/consul.d
2014-04-11 02:06:10 +00:00
==> Starting Consul agent...
...
[INFO] agent: Synced service 'web'
...
```
2014-04-14 19:38:24 +00:00
You'll notice in the output that it "synced" the web service. This means
that it loaded the information from the configuration.
2015-03-13 18:56:58 +00:00
If you wanted to register multiple services, you could create multiple
service definition files in the Consul configuration directory.
2014-04-11 02:06:10 +00:00
## Querying Services
2015-03-13 18:56:58 +00:00
Once the agent is started and the service is synced, we can query the
2014-04-14 19:38:24 +00:00
service using either the DNS or HTTP API.
2014-04-11 02:06:10 +00:00
2014-04-14 19:38:24 +00:00
### DNS API
2014-04-11 02:06:10 +00:00
2015-03-13 18:56:58 +00:00
Let's first query our service using the DNS API. For the DNS API, the
DNS name for services is `NAME.service.consul` . By default, all DNS names
are always in the `consul` namespace, though
[this is configurable ](/docs/agent/options.html#domain ). The `service`
subdomain tells Consul we're querying services, and the `NAME` is the name
of the service.
For the web service we registered, these conventions and settings yield a
fully-qualified domain name of `web.service.consul` :
2014-04-11 02:06:10 +00:00
2014-10-19 23:40:10 +00:00
```text
2014-04-11 02:06:10 +00:00
$ dig @127 .0.0.1 -p 8600 web.service.consul
2014-04-14 19:38:24 +00:00
...
2014-04-11 02:06:10 +00:00
;; QUESTION SECTION:
;web.service.consul. IN A
;; ANSWER SECTION:
web.service.consul. 0 IN A 172.20.20.11
```
2015-03-13 18:56:58 +00:00
As you can see, an `A` record was returned with the IP address of the node on
which the service is available. `A` records can only hold IP addresses.
You can also use the DNS API to retrieve the entire address/port pair as a
`SRV` record:
2014-04-11 02:06:10 +00:00
2014-10-19 23:40:10 +00:00
```text
2014-04-14 19:38:24 +00:00
$ dig @127 .0.0.1 -p 8600 web.service.consul SRV
...
2014-04-11 02:06:10 +00:00
;; QUESTION SECTION:
2014-04-14 19:38:24 +00:00
;web.service.consul. IN SRV
2014-04-11 02:06:10 +00:00
;; ANSWER SECTION:
2014-04-14 19:38:24 +00:00
web.service.consul. 0 IN SRV 1 1 80 agent-one.node.dc1.consul.
2014-04-11 02:06:10 +00:00
;; ADDITIONAL SECTION:
2014-04-14 19:38:24 +00:00
agent-one.node.dc1.consul. 0 IN A 172.20.20.11
2014-04-11 02:06:10 +00:00
```
2015-03-13 18:56:58 +00:00
The `SRV` record says that the web service is running on port 80 and exists on
the node `agent-one.node.dc1.consul.` . An additional section is returned by the
DNS with the `A` record for that node.
2014-04-14 19:38:24 +00:00
Finally, we can also use the DNS API to filter services by tags. The
format for tag-based service queries is `TAG.NAME.service.consul` . In
the example below, we ask Consul for all web services with the "rails"
2015-03-13 18:56:58 +00:00
tag. We get a successful response since we registered our service with
that tag:
2014-04-14 19:38:24 +00:00
2014-10-19 23:40:10 +00:00
```text
2014-04-24 12:08:13 +00:00
$ dig @127 .0.0.1 -p 8600 rails.web.service.consul
2014-04-14 19:38:24 +00:00
...
;; QUESTION SECTION:
;rails.web.service.consul. IN A
;; ANSWER SECTION:
rails.web.service.consul. 0 IN A 172.20.20.11
```
### HTTP API
In addition to the DNS API, the HTTP API can be used to query services:
2014-10-19 23:40:10 +00:00
```text
2014-04-14 19:38:24 +00:00
$ curl http://localhost:8500/v1/catalog/service/web
2015-03-13 18:56:58 +00:00
[{"Node":"agent-one","Address":"172.20.20.11","ServiceID":"web", \
"ServiceName":"web","ServiceTags":["rails"],"ServicePort":80}]
2014-04-14 19:38:24 +00:00
```
## Updating Services
Service definitions can be updated by changing configuration files and
sending a `SIGHUP` to the agent. This lets you update services without
any downtime or unavailability to service queries.
2015-03-13 18:56:58 +00:00
Alternatively, the HTTP API can be used to add, remove, and modify services
2014-04-14 19:38:24 +00:00
dynamically.
2015-03-13 18:56:58 +00:00
## Next Steps
We've now configured a single agent and registered a service. This is good
progress, but let's explore the full value of Consul by [setting up our
first cluster](/intro/getting-started/join.html)!