Consul支持两种接口查询我们注册的服务信息,http api或者DNS查询。
通过http接口查询
1.查询指定的服务
api格式:
http://localhost:8500/v1/catalog/service/服务名
例子:
查询web服务的所有地址信息
curl http://localhost:8500/v1/catalog/service/web
返回:
[
{
"ID": "f9f81742-421d-a102-93ea-fb9c04d2f66d",
"Node": "jogindembp", // 节点机器名字
"Address": "127.0.0.1", // 服务地址
"Datacenter": "dc1", // 数据中心名字
....忽略...
"ServiceKind": "",
"ServiceID": "web",
"ServiceName": "web", // 服务名
"ServiceTags": [
"rails"
],
...忽略...
"ServicePort": 80, // 服务端口
}
]
上面例子返回的结果是没有健康检查的结果,不知道服务地址是否可用。
2.仅查询可用的服务地址
下面查询服务信息,仅返回可用的服务信息,这个需要配合健康检查功能使用,后续有专门的章节介绍健康检查。
api格式:
http://localhost:8500/v1/health/service/服务名?passing
在Url后面增加一个passing参数代表,查询可用的服务地址。
例子:
查询web服务,可用的服务信息。
curl 'http://localhost:8500/v1/health/service/web?passing'
返回结果:
[
{
"Node": {
"Address": "127.0.0.1", // 节点地址
"Datacenter": "dc1",
..忽略...
},
"Service": { // 服务信息
"ID": "web",
"Service": "web",
"Tags": [
"rails"
],
"Address": "", // 服务地址,没有配置,取上面的节点地址
"Port": 80, // 服务端口号
...忽略...
},
"Checks": [ // 健康检查结果,可以配置多种健康检查,所以可能会存在多个结果
{
"CheckID": "api", // 定义的检查id
"Status": "passing", //passing代表可用, warning 代表警告, critical 代表不可用.
..忽略....
}
]
}
]
3.查询注册中心的服务目录
通过这个接口,我们可以查询consul目前注册了那些服务。
api格式:
http://localhost:8500/v1/catalog/services
例子:
请求api后,返回当前注册中心,注册的所有服务清单。
{
"consul": [],
"web": [
"rails"
]
}
目前注册中心,只有两个服务web和consul
通过DNS查询
consul支持通过dns查询服务信息,dns只能返回可用的服务地址。
下面我们通过dig命令,执行dns查询请求。
提示:macos系统默认自带了dig命令,其他系统可以网上找一下安装dig命令。
例子:
查询web服务的地址。
dig @127.0.0.1 -p 8600 web.service.consul
参数说明:
- @127.0.0.1 - 指定dns服务器地址,就是我们consul的agent地址,本地安装了agent使用127.0.0.1即可
- p - 指定dns服务的端口,consul默认使用的是8600
web.service.consul是需要查询的域名。
consul服务的域名规则:
服务名.service.consul
也就是,consul默认会为服务配置本地域名。
下面是执行dig命令后输出的结果:
; <<>> DiG 9.10.6 <<>> @127.0.0.1 -p 8600 web.service.consul
...忽略....
// QUESTION SECTION代表我们的查询请求
// 这里代表查询web.service.consul.这个域名的A记录信息。
;; QUESTION SECTION:
;web.service.consul. IN A
// ANSWER SECTION 代表查询结果,查询不到就是空的
;; ANSWER SECTION:
// 这里查询到一条A记录,ip地址是127.0.0.1
web.service.consul. 0 IN A 127.0.0.1
...忽略...
上面dig命令,默认查询的是DNS的A记录,只能查询到Ip地址,查询不到端口号,我们可以通过查询DNS的SRV记录,获取完整的服务地址(ip和端口号)
例子:
dig @127.0.0.1 -p 8600 web.service.consul SRV
命令,最后面多了一个SRV,代表查询DNS的SRV记录
输出:
查询结果跟之前的命令差不多,下面仅显示关键信息。
...忽略...
;; ANSWER SECTION:
// 80 代表端口号
web.service.consul. 0 IN SRV 1 1 80 jogindembp.node.dc1.consul.
;; ADDITIONAL SECTION:
// 下面是服务的ip地址
jogindembp.node.dc1.consul. 0 IN A 127.0.0.1
jogindembp.node.dc1.consul. 0 IN TXT "consul-network-segment="
...忽略...
提示:我们这里只是通过dig命令演示dns请求,项目中,不会使用dig命令发送dns请求,然后解析dig返回的结果,项目中可以使用dns客户端库,设置下dns服务的地址和端口,直接查询服务的域名即可;如果你的服务是web服务,甚至可以配置本地dns服务器,自动解析consul定义的服务域名。