注册服务


在前边的步骤中,我们已经跑起来第一个Agent,看到了集群成员,并且查询了那个节点。在这篇文章,我们将注册第一个服务并且查询这个服务。

定义服务

注册服务可以通过提供一个服务定义的方式,还可以通过调用HTTP API的方式。

服务定义是注册服务的最常见方式,我们将在这一步使用这个方法。我们将在前边步骤中介绍的Agent配置中来构建它。

首先,为Consul配置创建一个目录,Consul会从此目录中加载所有的配置文件。在Unix系统中一个通用的目录命名约定类似于这样:/etc/consul.d(后缀.d表明这个目录包含一组配置文件)。

$ sudo mkdir /etc/consul.d

下一步,我们将编写一个服务定义配置文件。我们假设有一个叫做“web”的服务运行在80端口。此外,我们给它一个标签,我们可以使用这个标签作为一个附加的方式来查询这个服务。

$ echo '{"service": {"name": "web", "tags": ["rails"], "port": 80}}' \
	>/etc/consul.d/web.json

现在,重启Agent,并提供配置目录:

$ consul agent -dev -config-dir /etc/consul.d
==> Starting Consul agent...
...
	[INFO] agent: Synced service 'web'
...

你会注意到输出中Agent已经同步Web服务。这意味着Agent已经从配置文件中加载了服务定义,并且已经成功的注册到服务条目。

如果你想注册多个服务,你可以在Consul配置目录中创建多个服务定义文件。

查询服务

一旦Agent启动并且服务被同步,我们就可以使用DNS或者HTTP API的方式来查询服务。

DNS接口

首先使用DNS接口来查询我们的服务。对于DNS接口,服务的DNS名称是NAME.service.consul。默认情况下,所有的DNS名称都在consul命名空间下,当然这也是可配置的。子域名service告诉Consul我们正在查询服务,然后NAME是服务的名字。

对于我们注册的服务,这些约定和设置产出一个完全合格的域名:web.service.consul。

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

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

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

正如你看到的,一个A记录返回,带着服务可用节点的IP地址。A记录只能承载IP地址。

你也可以使用DNS接口为SVR记录来检索全部的地址/端口对:

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

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

;; ANSWER SECTION:
web.service.consul. 0   IN  SRV 1 1 80 Armons-MacBook-Air.node.dc1.consul.

;; ADDITIONAL SECTION:
Armons-MacBook-Air.node.dc1.consul. 0 IN A  172.20.20.11

SVR记录告诉我们web服务运行在80端口,并且存在于节点Armons-MacBook-Air.node.dc1.consul.之上。一个附加的部分被DNS返回,包含这个节点的A记录。

最后,我们还可以在使用DNS接口时通过标签来过滤服务。基于标签的服务查询格式是:TAG.NAME.service.consul。在下边的例子中,我们请求Consul提供具有rails标签的所有服务。我们会得到一个成功的响应,因为我们已经使用这个标签注册了我们的服务:

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

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

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

HTTP接口

除了DNS接口,还可以使用HTTP接口来查询服务。

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

接口catelog返回指定服务的所有宿主节点。但是你通常只想要获取到通过健康检查的健康实例。这也正是DNS内部在做的。下边将只查询健康的实例:

$ curl 'http://localhost:8500/v1/health/service/web?passing'
[{"Node":"Armons-MacBook-Air","Address":"172.20.20.11","Service":{ \
	"ID":"web", "Service":"web", "Tags":["rails"],"Port":80}, "Checks": ...}]

更新服务

可以通过更改配置文件,然后发送一个SIGHUP给Agent,来更新服务定义。这让你可以在没有停机时间或服务查询不可用的情况下来更新服务。

此外,Http接口还可以动态的添加、移除和修改服务。

下一步

我们现在已经配置了一个单个的Agent,并且注册了一个服务。进展不错,后面将建立我们的第一个集群,来探索Consul的完整价值。