在前面的步驟,咱們運行了第一個代理,看到了集羣的成員,而且查詢了節點信息。在這篇指南里,咱們將註冊咱們第一個服務而且查詢這個服務。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裏最有價值的特性,[設置咱們第一個集羣]()!