在前面的步骤,咱们运行了第一个代理,看到了集群的成员,而且查询了节点信息。在这篇指南里,咱们将注册咱们第一个服务而且查询这个服务。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名称是 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
除了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里最有价值的特性,[设置咱们第一个集群]()!