一架梯子,一头程序猿,仰望星空!

Consul 服务查询


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定义的服务域名。