前文我们已经简单介绍 Consul 的安装和启动了,本篇我们来开始在 consul 中注册和使用 service
定义 service
Service 可以通过 service 定义或者 API 调用进行注册,但是使用配置文件定义是最通用的形式。
首先创建一个目录用来存放配置文件,Consul 会从配置目录中加载所有配置文件,一种在 unix 系统中通用的做法是在定义一个 /etc/consul.d
目录。
1 | mkdir consul.d |
然后创建一个文件用来存放我们定义的服务,在这个配置中我们还提供了一个 tag 用来做服务查询:
1 | $ echo '{"service": {"name": "web", "tags": ["python"], "port": 8888}}' | tee consul.d/web.json |
这里我们定义了名称是 web 并且跑在 8888 端口的 web 服务。
重启 agent 并且提供配置目录:
1 | consul agent -dev -node=zhaoyongqiang -config-dir=consul.d |
注意输出包含了 “synced” the web service,consul 已经成功把定义的服务导入 service catlog 了。
查询服务
一旦服务注册之后,我们就可以使用 DNS 或者 HTTP 的方式查询 service 了。
DNS 查询
服务注册之后可以通过 DNS 进行服务查询,service 的 DNS name 是 NAME.service.consul,默认情况下所有的 DNS names 总是在 consul namespace 中,namespace 可以进行 配置 ,service 的 subdomain 用来告知 Consul 我们需要查询的 service 名称,在这里就是 NAME:
1 | dig @127.0.0.1 -p 8600 web.service.consul |
可以看到一个带有节点 ip 的 record 会返回,record 只能 hold IP address。
我们也可以通过 DNS 查询完整的 address/port pair:
1 | ± % dig @127.0.0.1 -p 8600 web.service.consul SRV |
SRV 记录表明 web service 在端口 8888 上并且存在于 zhaoyongqiang.node.dc1.consul 这个节点上。
我们也可以使用 tag 过滤需要出现的 web service,形如 TAG.NAME.service.consul,比如使用我们定义 service 时使用的 tag python:
1 | dig @127.0.0.1 -p 8600 python.web.service.consul |
HTTP 查询
除了 DNS 也可以使用 HTTP 的方式查询 web service
1 | ± % curl http://localhost:8500/v1/catalog/service/web |
http api 可以返回所有定义了该服务的节点信息,稍后我们在 health checks 会看到,通常情况下你指向查询健康状态是 passing 的实例节点。
1 | curl 'http://localhost:8500/v1/health/service/web?passing' |
更新 service
service 更新可以通过重新定义配置文件或者 HTTP 接口进行更新,更新配置文件可以向 agent 发送 SIGHUP 来达到不重启服务而更新配置的目的。