Consul入门03 - 注册服务

在前面的步骤,咱们运行了第一个代理,看到了集群的成员,而且查询了节点信息。在这篇指南里,咱们将注册咱们第一个服务而且查询这个服务。html

定义一个服务

一个服务可以经过提供一个服务定义或者调用适当的HTTP API来注册。node

服务定义是最通用的注册服务方法,那么咱们将使用这种方法来注册服务。咱们将建构一个代理配置,前面的步骤已经描述过。web

首先,为Consul配置建立一个目录。Consul装载配置目录中全部的配置文件,一般在Unix系统中惯例是创建以名为 /etc/consul.d 的目录( .d 后缀暗示这个目录包含了一些配置文件的集合)。json

$ sudo mkdir /etc/consul.d

下一步,咱们将建立一个服务定义配置文件。咱们假设咱们有一个名为“web"服务,它运行在80端口。另外咱们为它设置一个标记,那么咱们就能够经过它来查询到这个服务:bash

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

如今,咱们重启代理,并提供配置目录参数:dom

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

你会注意到在输出中"synced service 'web'"。这意味着代理已经从配置文件中装载了该服务定义,而且已经成功注册该服务到服务目录中。curl

若是你想注册多个服务,你能够在Consul配置目录中建立多个服务定义文件。url

查询服务

一旦代理启动而且服务已经同步,咱们就可使用DNS或者HTTP API来查询服务了。代理

DNS API

让咱们首先使用DNS API查询咱们的服务。对于DNS API,服务的DNS名称是 NAME.service.consul 。默认全部的DNS名称都是在 consul 名称空间下,固然这个是可配置的service 子域名告诉Consul咱们正在查询服务,而且 NAME 就是要查询的服务的名称。code

对于咱们注册的web服务,对应的查询设置就是 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

你能够看到,一个带了节点的IP地址的 A 记录被返回了,它就是可用的服务。 A 记录只能包含IP地址。

你也可使用DNS API来获取完整的地址/端口的 SRV 记录:

$ 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

SRV 记录显示了web服务证运行在节点 Armons-MacBook-Air.node.dc1.consul. 的80端口上。额外的部分和 A 记录返回的内容同样。

最后,咱们可使用DNS API基于标记来过滤服务,基于标记的服务查询的格式是 TAG.NAME.service.consul 。 在下面的例子里,咱们请求Consul查询全部含"rails"标记的web服务。咱们获得了咱们注册的带有该标记的服务的响应:

$ 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 API

除了DNS API,HTTP API也能够用于服务查询:

$ 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}]

该目录API返回了指定节点以及指定的服务信息。就像咱们立刻要看到了健康检测,一般咱们的查询只是查询那些健康的实例,这些实例都是经过了健康检测的。这也是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 信号给代理。这可让代理更新服务而无需中止代理或者让服务查询时服务不可用。

能够选择HTTP API来动态地增长,删除,以及更改服务。

下一步

咱们如今配置了一个单代理,而且注册了一个服务。进展很是不错,可是下一步咱们会展现Consul里最有价值的特性,[设置咱们第一个集群]()!

相关文章
相关标签/搜索