本手册根据官方资料整理,暂时只收集了最基本最常用的那部分。
由于作者水平有限,涉及企业版和高级功能的接口用法,请您参阅:https://www.consul.io/api-docs 。
代理相关接口:
通常情况下,服务和健康检测是向代理注册的,由代理承担与集群保持数据同步的责任。
代理管理:
查看代理所在主机信息:
返回代理所在主机的运行信息(CPU、内存、硬盘),输出内容视平台不同会有所变化。
用法:
curl \
http://127.0.0.1:8500/v1/agent/host
返回:
格式为application/json,内容为具体的json消息体。
举例:
curl \
http://127.0.0.1:8500/v1/agent/host \
| python -m json.tool
输出:
{
"CollectionTime": 1639329563697223479,
"Errors": null,
"CPU": [
{
......略
}
],
"Disk": {
......略
},
"Host": {
......略
},
"Memory": {
......略
}
}
查看所有代理成员列表:
返回本地代理在集群中看到的成员列表。
相关命令:
consul members
本接口实现的效果与consul members命令相同。
用法:
curl \
http://127.0.0.1:8500/v1/agent/members
返回:
格式为application/json,内容为具体的json消息体。
举例:
curl \
http://127.0.0.1:8500/v1/agent/members \
| python -m json.tool
输出:
[
{
"Addr": "192.168.56.101",
"DelegateCur": 4,
"DelegateMax": 5,
"DelegateMin": 2,
"Name": "node1",
"Port": 8301,
"ProtocolCur": 2,
"ProtocolMax": 5,
"ProtocolMin": 1,
"Status": 1,
"Tags": {
"acls": "0",
"bootstrap": "1",
"build": "1.11.1:2c56447e",
"dc": "dc1",
"ft_fs": "1",
"ft_si": "1",
"id": "ec3c13cf-6c38-7643-3305-44fe559fea3c",
"port": "8300",
"raft_vsn": "3",
"role": "consul",
"segment": "",
"vsn": "2",
"vsn_max": "3",
"vsn_min": "2",
"wan_join_port": "8302"
}
}
]
读取本地代理的配置信息:
返回当前代理的配置及相关库版本、网络地址和运动状态信息。
相关命令:
consul info
本接口输出的Stats部分与consul info输出相同。
用法:
curl \
http://127.0.0.1:8500/v1/agent/self
返回:
格式为application/json,内容为具体的json消息体。
举例:
curl \
http://127.0.0.1:8500/v1/agent/self \
| python -m json.tool
输出:
{
"Config": {
"Datacenter": "dc1",
"NodeID": "ec3c13cf-6c38-7643-3305-44fe559fea3c",
"NodeName": "node1",
"PrimaryDatacenter": "dc1",
"Revision": "2c56447e",
"Server": true,
"Version": "1.11.1"
},
"Coord": {
"Adjustment": 0,
"Error": 1.5,
"Height": 1e-05,
"Vec": [0,0,0,0,0,0,0,0]
},
"Member": {
"Addr": "192.168.56.101",
"DelegateCur": 4,
"DelegateMax": 5,
"DelegateMin": 2,
"Name": "node1",
"Port": 8301,
"ProtocolCur": 2,
"ProtocolMax": 5,
"ProtocolMin": 1,
"Status": 1,
"Tags": {
"acls": "0",
"bootstrap": "1",
"build": "1.11.1:2c56447e",
"dc": "dc1",
"ft_fs": "1",
"ft_si": "1",
"id": "ec3c13cf-6c38-7643-3305-44fe559fea3c",
"port": "8300",
"raft_vsn": "3",
"role": "consul",
"segment": "",
"vsn": "2",
"vsn_max": "3",
"vsn_min": "2",
"wan_join_port": "8302"
}
},
"Meta": {
"consul-network-segment": ""
},
"DebugConfig": {
......略
},
"Stats": {
......略
}
}
重新加载配置:
相关命令:
consul reload
本接口实现的效果与consul reload命令相同。
用法:
curl \
--request PUT \
http://127.0.0.1:8500/v1/agent/reload
返回:
不输出任何信息。
举例:
curl \
--request PUT \
http://127.0.0.1:8500/v1/agent/reload
输出:
无
启用/禁用代理维护模式:
在维护模式下,节点将被标记为不可用,并且不会出现在 DNS 或 API 查询中。此 API 调用是幂等的。
维护模式是持久的,但会在代理重新启动时自动恢复到正常状态。
相关命令:
consul maint -enable/-disable
本接口实现的效果与consul maint -enable/-disable命令相同。
用法:
curl \
--request PUT \
http://127.0.0.1:8500/v1/agent/maintenance?enable=状态&reason=文字描述
参数:
enable:指定是启用还是禁用维护模式。以URL方式提供。
reason:指定一个文本字符串,解释将节点置于维护模式的原因。以URL方式提供。
返回:
不输出任何信息。
举例:
curl \
--request PUT \
'http://127.0.0.1:8500/v1/agent/maintenance?enable=true&reason=For+API+docs'
输出:
无
监听代理日志流:
代理以chunked的方式阻塞连接,持续推送日志流,直到连接关闭。
相关命令:
consul monitor
本接口实现的效果与consul monitor命令相同。
用法:
curl \
http://127.0.0.1:8500/v1/agent/monitor
参数:
loglevel:指定包含要筛选的日志级别的文本字符串,默认为info。以URL方式提供。
logjson:指定是否以 JSON 格式输出日志,默认为false。以URL方式提供。
返回:
格式视logjson参数而定,默认为文本行。
举例:
curl \
http://127.0.0.1:8500/v1/agent/monitor
输出:
2021-12-13T02:29:26.772+0800 [INFO] agent: Node entered maintenance mode
2021-12-13T02:29:26.772+0800 [INFO] agent: Synced check: check=_node_maintenance
2021-12-13T02:29:40.739+0800 [INFO] agent: Node left maintenance mode
2021-12-13T02:29:40.741+0800 [INFO] agent: Deregistered check: check=_node_maintenance
配置代理加入集群:
相关命令:
consul join
本接口实现的效果与consul join命令相同。
用法:
curl \
--request PUT \
http://127.0.0.1:8500/v1/agent/join/:address
参数:
wan:指定尝试通过 WAN 池加入,默认为false。以URL方式提供。
返回:
输出操作结果信息。
举例:
curl \
--request PUT \
http://127.0.0.1:8500/v1/agent/join/1.2.3.4
配置代理正常退出:
通知本代理从集群中脱离,并且其它代理也会从自己的成员列表中删除自己。操作完成后,代理退出。
相关命令:
consul leave
本接口实现的效果与consul leave命令相同。
用法:
curl \
--request PUT \
http://127.0.0.1:8500/v1/agent/leave
返回:
不输出任何信息。
举例:
curl \
--request PUT \
http://127.0.0.1:8500/v1/agent/leave
输出:
无
强制移除故障代理:
当某个代理发生故障后,集群会标识该代理不可用,并且会尝试恢复该代理。可以使用本命令强制移故障代理。
相关命令:
consul force-leave
本接口实现的效果与consul force-leave命令相同。
用法:
curl \
--request PUT \
http://127.0.0.1:8500/v1/agent/force-leave/:node
参数:
prune:指定是否从成员列表中强制删除节点,默认为false。以URL方式提供。
wan:指定只应从 WAN 池中删除代理,默认为false。以URL方式提供。
返回:
不输出任何信息。
举例:
curl \
--request PUT \
http://127.0.0.1:8500/v1/agent/force-leave/node1
输出:
无
健康检测:
支持系统级和应用级健康检测的管理。
如果健康检测与服务相关联,则认为它是应用级,否则为系统级。系统级健康检测主要关注节点的健康状态,而应用级则主要关注服务实例的健康状态。
健康检测可以在配置文件中定义,也可以在运行时通过HTTP接口添加。通过HTTP接口创建的健康检测也会在该结点进行持久化。
支持多种健康检测类型,包括:
- 定时脚本检测
调用外部应用程序来执行健康状况检测,以适当的退出代码退出,并可能产生一些输出。输出限制为4KB,大于4kb的输出将被截断。
默认情况下,脚本检查将配置30秒的超时时间,超时后Consul将尝试强制终止检测脚本和它产生的任何子进程。
在Consul 0.9.0和更高版本中,代理必须配置-enable-script-checks=true以启用脚本检测。 - 定时HTTP检测
调用HTTP向指定的URL发送请求,服务的状态取决于HTTP响应代码:任何2xx代码都被视为检测通过,429是太多请求的警告,其他任何状态码都代表检测失败。
默认情况下,HTTP检查是GET请求,除非method字段指定了不同的方法。可以通过header字段来设置其它header字段信息,以字符串列表映射的形式设置。
同样的,输出限制为4KB,大于4kb的输出将被截断。HTTP检查也支持SSL。默认要求有效的SSL证书,可以通过设置TLSSkipVerify为true关闭证书检查。 - 定时TCP检测
调用TCP连接对指定的IP:PORT地址进行检测,服务的状态取决于连接尝试是否成功。 - 定时TTL检测
TTL检测会在TTL时间内保留上次的检测状态,检测状态必须通过HTTP接口定期更新,如果外部系统无法在给定的TTL内更新状态,则检查设置为失败状态。
这个检测机制依靠应用程序直接报告其健康状况。例如,健康的应用程序可以定期向HTTP端点发送状态更新;如果应用程序失败,TTL将过期,健康检查进入危险状态。
获取本地代理的健康检测列表:
用法:
curl \
http://127.0.0.1:8500/v1/agent/checks
参数:
filter:指定用于在返回数据之前筛选查询结果的表达式,默认为空。以URL方式提供。
返回:
格式为application/json,内容为具体的json消息体。
举例:
curl \
http://127.0.0.1:8500/v1/agent/checks \
| python -m json.tool
输出:
{
"mem": {
"CheckID": "mem",
"CreateIndex": 0,
"Definition": {},
"ExposedPort": 0,
"Interval": "10s",
"ModifyIndex": 0,
"Name": "Memory utilization",
"Node": "node1",
"Notes": "",
"Output": "fork/exec /usr/local/bin/check_mem.py: no such file or directory",
"ServiceID": "",
"ServiceName": "",
"ServiceTags": [],
"Status": "critical",
"Timeout": "5s",
"Type": "script"
}
}
向本地代理注册健康检测:
用法:
curl \
--request PUT \
--data @payload.json \
http://127.0.0.1:8500/v1/agent/check/register
参数:
Name:指定健康检测项的名称,必填项。
ID:此健康检测项的唯一ID,默认为空,可由代理自动生成,可选项。
Notes:指定人类可识别的字符串。
Interval:指定运行此健康检测的频率。这是脚本、HTTP、TCP等类型所必需的。
Timeout:指定脚本、HTTP、TCP或其它检查的超时时间,默认10S。
DeregisterCriticalServiceAfter:指定健康检测失败后,超过多长时间取消注册。
Args:指定一个用于脚本检测的命令行参数列表。
HTTP:指定一个HTTP URL的检测,默认为空。
Method:指定HTTP的请求方法,默认为GET。
Body:指定HTTP的请求消息体,默认为空。
Header:指定HTTP的附加请求头,默认为空。
TLSSkipVerify:对HTTPS来说,指定忽略证书检查,默认false。
TCP:指定一个IP:PORT进行连接检测,默认为空。
TTL:指定一个TTL检测,默认10S。
返回:
成功无输出,失败返回错误描述。
举例:
下面增加一个脚本检查。
编辑载体文件payload.json,内容如下:
{
"ID": "mem",
"Name": "Memory utilization",
"DeregisterCriticalServiceAfter": "90m",
"Args": ["/usr/local/bin/check_mem.py", "-limit", "256MB"],
"Interval": "10s",
"Timeout": "5s"
}
执行命令:
curl \
--request PUT \
--data @payload.json \
http://127.0.0.1:8500/v1/agent/check/register
输出:
无
从本地代理注销指定健康检测:
用法:
curl \
--request PUT \
http://127.0.0.1:8500/v1/agent/check/deregister/:check_id
参数:
check_id:指定要取消注册的检查的唯一ID,如果ID不存在,则不执行任何操作。
返回:
成功无输出,失败返回错误描述。
举例:
curl \
--request PUT \
http://127.0.0.1:8500/v1/agent/check/deregister/mem
输出:
无
重置TTL健康检测:
用法:
curl \
--request PUT \
http://127.0.0.1:8500/v1/agent/check/pass/:check_id
参数:
check_id:指定要取消注册的健康检测的唯一ID,如果ID不存在,则不执行任何操作。
note:指定人类可读的描述。以URL方式提供。
返回:
成功无输出,失败返回错误描述。
举例:
curl \
--request PUT \
http://127.0.0.1:8500/v1/agent/check/pass/ttl
输出:
无
TTL检测只能用于TTL类型,使用下面的载体文件创建TTL检测:
{
"ID": "ttl",
"Name": "ttl check",
"DeregisterCriticalServiceAfter": "90m",
"TTL": "30s"
}
本地服务管理:
同健康检测一样,可以通过配置文件添加服务,也可以通过HTTP接口动态添加。
获取本地代理注册的所有服务列表:
如果服务有定义应用内健康检测,此接口响应并不展示。
查看应用内健康检测需要使用健康检测相关接口。
用法:
curl \
http://127.0.0.1:8500/v1/agent/services
参数:
filter:指定用于在返回数据之前筛选查询结果的表达式。以URL方式提供。
返回:
格式为application/json,内容为具体的json消息体。
举例:
curl \
http://127.0.0.1:8500/v1/agent/services \
| python -m json.tool
输出:
{
"web1": {
"Address": "",
"Datacenter": "dc1",
"EnableTagOverride": false,
"ID": "web1",
"Meta": {},
"Port": 80,
"Service": "web",
"Tags": [
"rails"
],
"Weights": {
"Passing": 1,
"Warning": 1
}
}
}
获取本地某个服务ID的完整服务定义:
同样的,本接口也不返回应用内健康检测定义。
用法:
curl \
http://127.0.0.1:8500/v1/agent/service/:service_id
返回:
格式为application/json,内容为具体的json消息体。
举例:
curl \
http://127.0.0.1:8500/v1/agent/service/web1 \
| python -m json.tool
输出:
{
"Address": "",
"ContentHash": "57d9f57dcdf58e5c",
"Datacenter": "dc1",
"EnableTagOverride": false,
"ID": "web1",
"Meta": {},
"Port": 80,
"Service": "web",
"Tags": [
"rails"
],
"Weights": {
"Passing": 1,
"Warning": 1
}
}
获取本地指定服务名的所有实例运行状况:
用法:
curl \
http://localhost:8500/v1/agent/health/service/name/:service_name
参数:
format:指定返回的消息格式,支持JSON(json)和纯文本(text),默认为JSON。以URL方式提供。
返回:
格式视format参数而定。
举例:
curl \
http://localhost:8500/v1/agent/health/service/name/web \
| python -m json.tool
输出:
[
{
"AggregatedStatus": "passing",
"Checks": [],
"Service": {
"Address": "",
"Datacenter": "dc1",
"EnableTagOverride": false,
"ID": "web1",
"Meta": {},
"Port": 80,
"Service": "web",
"Tags": [
"rails"
],
"Weights": {
"Passing": 1,
"Warning": 1
}
}
}
]
获取本地指定服务ID的实例运行状况:
用法:
curl \
http://localhost:8500/v1/agent/health/service/id/:service_id
参数:
format:指定返回的消息格式,支持JSON(json)和纯文本(text),默认为JSON。以URL方式提供。
返回:
格式视format参数而定。
举例:
curl \
http://localhost:8500/v1/agent/health/service/id/web1 \
| python -m json.tool
输出:
{
"AggregatedStatus": "passing",
"Checks": [],
"Service": {
"Address": "",
"Datacenter": "dc1",
"EnableTagOverride": false,
"ID": "web1",
"Meta": {},
"Port": 80,
"Service": "web",
"Tags": [
"rails"
],
"Weights": {
"Passing": 1,
"Warning": 1
}
}
}
向本地代理注册/更新服务:
将具有可选运行状况检查的服务添加/更新到本地代理。
代理负责管理其本地服务的状态,并将有关其本地服务的更新发送到服务器,以使全局编录保持同步。
相关命令:
consul services register
本接口实现的效果与consul services register命令相同。
用法:
curl \
--request PUT \
--data @payload.json \
http://127.0.0.1:8500/v1/agent/service/register?replace-existing-checks=true
参数:
replace-existing-checks:对请求进行检查,删除没有健康检查的部分。以URL方式提供。
Name:指定服务名称,必选。
ID:指定服务ID,如果未指定,默认为服务名称。
Tags:指定标记,用于筛选。
Address:指定服务的地址。
Port:指定服务的端口。
Meta:指定 KV 元数据。
Weights:指定服务的权重。
Check:指定健康检测。具体设置请参考健康检测部分。
返回:
成功无输出,失败返回错误描述。
举例:
编辑载体文件payload.json,内容如下:
{
"Name": "redis",
"ID": "redis1",
"Tags": ["primary", "v1"],
"Address": "127.0.0.1",
"Port": 6379,
"Meta": {
"redis_version": "4.0"
},
"EnableTagOverride": false,
"Check": {
"DeregisterCriticalServiceAfter": "30m",
"Args": ["/usr/local/bin/check_redis.py"],
"Interval": "10s",
"Timeout": "5s"
},
"Weights": {
"Passing": 10,
"Warning": 1
}
}
执行命令:
curl \
--request PUT \
--data @payload.json \
http://127.0.0.1:8500/v1/agent/service/register?replace-existing-checks=true
输出:
无
从本地代理中移除指定服务:
服务移除后,其相关的健康检查也一并被清理。
相关命令:
consul services deregister
本接口实现的效果与consul services deregister命令相同。
用法:
curl \
--request PUT \
http://127.0.0.1:8500/v1/agent/service/deregister/:service_id
返回:
成功无输出,失败返回错误描述。
举例:
curl \
--request PUT \
http://127.0.0.1:8500/v1/agent/service/deregister/redis1
输出:
无
启用/禁用某个服务的维护模式:
相关命令:
consul maint -enable/-disable -service=service_id
本接口实现的效果与consul maint -enable/-disable -service=service_id命令相同。
用法:
curl \
--request PUT \
http://127.0.0.1:8500/v1/agent/service/maintenance/:service_id?enable=true&reason=For+the+docs
参数:
enable:指定是启用还是禁用维护模式。以URL方式提供。
reason:指定一个文本字符串,解释将节点置于维护模式的原因。以URL方式提供。
返回:
成功无输出,失败返回错误描述。
举例:
curl \
--request PUT \
'http://127.0.0.1:8500/v1/agent/service/maintenance/web?enable=true&reason=For+the+docs'
输出:
无
目录相关接口:
获取所有数据中心列表:
相关命令:
consul catalog datacenters
本接口输出与consul catalog datacenters输出相同。
用法:
curl \
http://127.0.0.1:8500/v1/catalog/datacenters
返回:
格式为application/json,内容为具体的json消息体。
举例:
curl \
http://127.0.0.1:8500/v1/catalog/datacenters
输出:
["dc1"]
获取在指定数据中心注册的节点:
相关命令:
consul catalog nodes
本接口输出与consul catalog nodes输出相同。
用法:
curl \
http://127.0.0.1:8500/v1/catalog/nodes
参数:
dc:指定要操作的数据中心,默认为当前代理所属的数据中心。以URL方式提供。
near:指定一个中心节点,按平均通信往返时间排序。以URL方式提供。
filter:指定用于在返回数据之前筛选查询结果的表达式。以URL方式提供。
返回:
格式为application/json,内容为具体的json消息体。
举例:
curl \
http://127.0.0.1:8500/v1/catalog/nodes \
| python -m json.tool
输出:
[
{
"Address": "192.168.56.101",
"CreateIndex": 5,
"Datacenter": "dc1",
"ID": "ec3c13cf-6c38-7643-3305-44fe559fea3c",
"Meta": {
"consul-network-segment": ""
},
"ModifyIndex": 7,
"Node": "node1",
"TaggedAddresses": {
"lan": "192.168.56.101",
"lan_ipv4": "192.168.56.101",
"wan": "192.168.56.101",
"wan_ipv4": "192.168.56.101"
}
}
]
获取在指定数据中心注册的服务:
仅仅列出注册的服务名称,不包括服务ID列表。
相关命令:
consul catalog services
本接口输出与consul catalog services输出相同。
用法:
curl \
http://127.0.0.1:8500/v1/catalog/services
参数:
dc:指定要操作的数据中心,默认为当前代理所属的数据中心。以URL方式提供。
返回:
格式为application/json,内容为具体的json消息体。
举例:
curl \
http://127.0.0.1:8500/v1/catalog/services \
| python -m json.tool
输出:
{
"consul": [],
"web": [
"rails"
]
}
获取在指定数据中心注册的指定服务的实例列表:
用法:
curl \
http://127.0.0.1:8500/v1/catalog/service/:service_name
参数:
dc:指定要操作的数据中心,默认为当前代理所属的数据中心。以URL方式提供。
near:指定一个中心节点,按平均通信往返时间排序。以URL方式提供。
filter:指定用于在返回数据之前筛选查询结果的表达式。以URL方式提供。
返回:
格式为application/json,内容为具体的json消息体。
举例:
curl \
http://127.0.0.1:8500/v1/catalog/service/web \
| python -m json.tool
输出:
[
{
"Address": "192.168.56.101",
"CreateIndex": 8,
"Datacenter": "dc1",
"ID": "ec3c13cf-6c38-7643-3305-44fe559fea3c",
"ModifyIndex": 8,
"Node": "node1",
"NodeMeta": {
"consul-network-segment": ""
},
"ServiceAddress": "",
"ServiceConnect": {},
"ServiceEnableTagOverride": false,
"ServiceID": "web1",
"ServiceKind": "",
"ServiceMeta": {},
"ServiceName": "web",
"ServicePort": 80,
"ServiceProxy": {
"Expose": {},
"MeshGateway": {},
"Mode": ""
},
"ServiceSocketPath": "",
"ServiceTags": [
"rails"
],
"ServiceWeights": {
"Passing": 1,
"Warning": 1
},
"TaggedAddresses": {
"lan": "192.168.56.101",
"lan_ipv4": "192.168.56.101",
"wan": "192.168.56.101",
"wan_ipv4": "192.168.56.101"
}
}
]
获取在指定节点上注册的服务的实例列表:
用法:
curl \
http://127.0.0.1:8500/v1/catalog/node/:node
参数:
dc:指定要操作的数据中心,默认为当前代理所属的数据中心。以URL方式提供。
filter:指定用于在返回数据之前筛选查询结果的表达式。以URL方式提供。
返回:
格式为application/json,内容为具体的json消息体。
举例:
curl \
http://127.0.0.1:8500/v1/catalog/node/node1 \
| python -m json.tool
输出:
{
"Node": {
"Address": "192.168.56.101",
"CreateIndex": 5,
"Datacenter": "dc1",
"ID": "ec3c13cf-6c38-7643-3305-44fe559fea3c",
"Meta": {
"consul-network-segment": ""
},
"ModifyIndex": 7,
"Node": "node1",
"TaggedAddresses": {
"lan": "192.168.56.101",
"lan_ipv4": "192.168.56.101",
"wan": "192.168.56.101",
"wan_ipv4": "192.168.56.101"
}
},
"Services": {
"consul": {
"Address": "",
"Connect": {},
"CreateIndex": 5,
"EnableTagOverride": false,
"ID": "consul",
"Meta": {
"non_voter": "false",
"raft_version": "3",
"read_replica": "false",
"serf_protocol_current": "2",
"serf_protocol_max": "5",
"serf_protocol_min": "1",
"version": "1.11.1"
},
"ModifyIndex": 5,
"Port": 8300,
"Proxy": {
"Expose": {},
"MeshGateway": {},
"Mode": ""
},
"Service": "consul",
"Tags": [],
"Weights": {
"Passing": 1,
"Warning": 1
}
},
"web": {
"Address": "",
"Connect": {},
"CreateIndex": 8,
"EnableTagOverride": false,
"ID": "web1",
"Meta": null,
"ModifyIndex": 8,
"Port": 80,
"Proxy": {
"Expose": {},
"MeshGateway": {},
"Mode": ""
},
"Service": "web",
"Tags": [
"rails"
],
"Weights": {
"Passing": 1,
"Warning": 1
}
}
}
}
健康检测相关接口:
获取指定节点上的健康检测列表:
用法:
curl \
http://127.0.0.1:8500/v1/health/node/:node
参数:
dc:指定要操作的数据中心,默认为当前代理所属的数据中心。以URL方式提供。
filter:指定用于在返回数据之前筛选查询结果的表达式。以URL方式提供。
返回:
格式为application/json,内容为具体的json消息体。
举例:
curl \
http://127.0.0.1:8500/v1/health/node/node1 \
| python -m json.tool
输出:
[
{
"CheckID": "serfHealth",
"CreateIndex": 5,
"Definition": {},
"ExposedPort": 0,
"Interval": "",
"ModifyIndex": 5,
"Name": "Serf Health Status",
"Node": "node1",
"Notes": "",
"Output": "Agent alive and reachable",
"ServiceID": "",
"ServiceName": "",
"ServiceTags": [],
"Status": "passing",
"Timeout": "",
"Type": ""
}
]
获取指定服务名的健康检测列表:
用法:
curl \
http://127.0.0.1:8500/v1/health/checks/:service_name
参数:
dc:指定要操作的数据中心,默认为当前代理所属的数据中心。以URL方式提供。
near:指定一个中心节点,按平均通信往返时间排序。以URL方式提供。
node-meta:指定格式为 的所需节点元数据键/值对。此参数可以多次指定,并将结果筛选到具有指定键/值对的节点。以URL方式提供。
filter:指定用于在返回数据之前筛选查询结果的表达式。以URL方式提供。
返回:
格式为application/json,内容为具体的json消息体。
举例:
curl \
http://127.0.0.1:8500/v1/health/checks/web \
| python -m json.tool
输出:
[
{
"CheckID": "service:web1",
"CreateIndex": 40362,
"Definition": {},
"ExposedPort": 0,
"Interval": "",
"ModifyIndex": 40362,
"Name": "Service 'web' check",
"Node": "node1",
"Notes": "",
"Output": "Get "http://localhost:8080": dial tcp [::1]:8080: connect: connection refused",
"ServiceID": "web1",
"ServiceName": "web",
"ServiceTags": [
"rails"
],
"Status": "critical",
"Timeout": "",
"Type": "http"
}
]
获取指定服务名的所有服务实例列表:
用法:
curl \
http://127.0.0.1:8500/v1/health/service/:service_name
参数:
dc:指定要操作的数据中心,默认为当前代理所属的数据中心。以URL方式提供。
near:指定一个中心节点,按平均通信往返时间排序。以URL方式提供。
filter:指定用于在返回数据之前筛选查询结果的表达式。以URL方式提供。
passing:指定服务器应仅返回所有检查都处于该状态的节点,默认false。以URL方式提供。
返回:
格式为application/json,内容为具体的json消息体。
举例:
curl \
http://127.0.0.1:8500/v1/health/service/web?passing \
| python -m json.tool
输出:
[
{
"Checks": [
{
"CheckID": "serfHealth",
"CreateIndex": 5,
"Definition": {},
"ExposedPort": 0,
"Interval": "",
"ModifyIndex": 5,
"Name": "Serf Health Status",
"Node": "node1",
"Notes": "",
"Output": "Agent alive and reachable",
"ServiceID": "",
"ServiceName": "",
"ServiceTags": [],
"Status": "passing",
"Timeout": "",
"Type": ""
}
],
"Node": {
"Address": "192.168.56.101",
"CreateIndex": 5,
"Datacenter": "dc1",
"ID": "ec3c13cf-6c38-7643-3305-44fe559fea3c",
"Meta": {
"consul-network-segment": ""
},
"ModifyIndex": 7,
"Node": "node1",
"TaggedAddresses": {
"lan": "192.168.56.101",
"lan_ipv4": "192.168.56.101",
"wan": "192.168.56.101",
"wan_ipv4": "192.168.56.101"
}
},
"Service": {
"Address": "",
"Connect": {},
"CreateIndex": 8,
"EnableTagOverride": false,
"ID": "web1",
"Meta": null,
"ModifyIndex": 8,
"Port": 80,
"Proxy": {
"Expose": {},
"MeshGateway": {},
"Mode": ""
},
"Service": "web",
"Tags": [
"rails"
],
"Weights": {
"Passing": 1,
"Warning": 1
}
}
}
]
获取指定状态的所有健康检查列表:
用法:
curl \
http://127.0.0.1:8500/v1/health/state/:state
参数:
dc:指定要操作的数据中心,默认为当前代理所属的数据中心。以URL方式提供。
near:指定一个中心节点,按平均通信往返时间排序。以URL方式提供。
node-meta:指定格式为 的所需节点元数据键/值对。此参数可以多次指定,并将结果筛选到具有指定键/值对的节点。以URL方式提供。
filter:指定用于在返回数据之前筛选查询结果的表达式。以URL方式提供。
返回:
格式为application/json,内容为具体的json消息体。
举例:
curl \
http://127.0.0.1:8500/v1/health/state/passing \
| python -m json.tool
输出:
[
{
"CheckID": "serfHealth",
"CreateIndex": 5,
"Definition": {},
"ExposedPort": 0,
"Interval": "",
"ModifyIndex": 5,
"Name": "Serf Health Status",
"Node": "node1",
"Notes": "",
"Output": "Agent alive and reachable",
"ServiceID": "",
"ServiceName": "",
"ServiceTags": [],
"Status": "passing",
"Timeout": "",
"Type": ""
}
]
KV操作相关接口:
可用于分布式服务配置存储。
但是需要注意各个数据中心之间的KV是不同步的,并且每个KV的值大小限制为512KB。
写入KV操作:
相关命令:
consul kv put
本接口实现的效果与consul kv put命令相同。
用法:
curl \
--request PUT \
--data @contents \
http://127.0.0.1:8500/v1/kv/:key
或
curl \
--request PUT \
--data-binary @contents \
http://127.0.0.1:8500/v1/kv/:key
参数:
dc:指定要操作的数据中心,默认为当前代理所属的数据中心。以URL方式提供。
cas:指定CAS操作。以URL方式提供。
flags:附加标志。以URL方式提供。
acquire:提供要在锁定获取操作中使用的会话ID。以URL方式提供。
release:提供要在释放操作中使用的会话ID。以URL方式提供。
返回:
格式为application/json,成功内容为true,失败为false。
举例:
curl \
--request PUT \
--data 123 \
http://127.0.0.1:8500/v1/kv/test
输出:
true
读取KV操作:
相关命令:
consul kv get
本接口实现的效果与consul kv get命令相同。
用法:
curl \
http://127.0.0.1:8500/v1/kv/:key
参数:
dc:指定要操作的数据中心,默认为当前代理所属的数据中心。以URL方式提供。
recurrse:指定查找是否应为递归查找并视为前缀而不是文本匹配项,默认为false。以URL方式提供。
返回:
格式为application/json。
举例:
curl \
http://127.0.0.1:8500/v1/kv/test \
| python -m json.tool
输出:
[
{
"CreateIndex": 21883,
"ModifyIndex": 21883,
"LockIndex": 0,
"Key": "test",
"Value": "MTIz",
"Flags": 0
}
]
说明:
CreateIndex:表示创建条目时间的内部索引值。
ModifyIndex:表示修改条目时间的内部索引值。
LockIndex:表示锁定条目时间的内部索引值。
Key:键名。
Value:Base64编码后的键值。
Flags:附加标志。
删除KV操作:
相关命令:
consul kv delete
本接口实现的效果与consul kv delete命令相同。
用法:
curl \
--request DELETE \
http://127.0.0.1:8500/v1/kv/:key
参数:
dc:指定要操作的数据中心,默认为当前代理所属的数据中心。以URL方式提供。
cas:指定CAS操作。以URL方式提供。
recurse:指定删除具有指定前缀的所有键,否则将仅删除完全匹配的密钥,默认为false。以URL方式提供。
返回:
格式为application/json,成功内容为true,失败为false。
举例:
curl \
--request DELETE \
http://127.0.0.1:8500/v1/kv/test
输出:
true
会话操作相关接口:
会话机制可用于构建分布式锁。
会话作为节点、健康检查和KV数据之间的绑定层,旨在提供粒度锁定。
一个会话可以同时关联多个对象。
当发生以下情形时,会话会被销毁:
- 会话关联的节点销毁
- 关联的任一健康检测注销
- 关联的任一健康检测进入Critical状态
- 会话被显示删除
- 会话TTL到期
会话被销毁后,根据创建会话时指定的行为执行相应的动作。
创建会话:
用法:
curl \
--request PUT \
--data @payload.json \
http://127.0.0.1:8500/v1/session/create
参数:
Name:指定会话的可读名称。
Node:指定节点的名称,必须引用已注册的节点。
LockDelay:指定锁定延迟的持续时间。
Behavior:控制会话无效时要采取的行为。可选值:release(默认)、delete。
release——导致任何持有的锁被释放。
delete——导致删除任何持有的锁。
TTL:指定会话的持续时间(介于 10 秒和 86400 秒之间)。如果提供,则在 TTL 到期之前未续订会话,则该会话将失效。
返回:
格式为application/json,成功内容为创建的UUID。
举例:
准备负载文件payload.json,内容如下:
{
"LockDelay": "10s",
"Name": "sess1",
"Node": "node1",
"Behavior": "delete",
"TTL": "60s"
}
执行:
curl \
--request PUT \
--data @payload.json \
http://127.0.0.1:8500/v1/session/create
输出:
{"ID":"c8615b6c-55c7-bc7d-1a71-4e427269d6ac"}
删除会话:
销毁具有给定名称的会话。如果会话 UUID 格式不正确,则返回错误。
如果会话 UUID 不存在或已过期,则仍返回 200(操作是幂等的)。
用法:
curl \
--request PUT \
http://127.0.0.1:8500/v1/session/destroy/:uuid
参数:
dc:指定要操作的数据中心,默认为当前代理所属的数据中心。以URL方式提供。
返回:
格式为application/json,成功内容为true,失败为false。
举例:
curl \
--request PUT \
http://127.0.0.1:8500/v1/session/destroy/c8615b6c-55c7-bc7d-1a71-4e427269d6ac
输出:
true
续订会话:
用法:
curl \
--request PUT \
http://127.0.0.1:8500/v1/session/renew/:uuid
参数:
dc:指定要操作的数据中心,默认为当前代理所属的数据中心。以URL方式提供。
返回:
格式为application/json,如果会话存在返回json内容,否则返回[]。
举例:
curl \
--request PUT \
http://127.0.0.1:8500/v1/session/renew/c8615b6c-55c7-bc7d-1a71-4e427269d6ac
输出:
[
{
"Behavior": "delete",
"CreateIndex": 23154,
"ID": "c8615b6c-55c7-bc7d-1a71-4e427269d6ac",
"LockDelay": 10000000000,
"ModifyIndex": 23154,
"Name": "sess1",
"Node": "node1",
"NodeChecks": [
"serfHealth"
],
"ServiceChecks": null,
"TTL": "60s"
}
]
读取会话信息:
用法:
curl \
http://127.0.0.1:8500/v1/session/info/:uuid
参数:
dc:指定要操作的数据中心,默认为当前代理所属的数据中心。以URL方式提供。
返回:
格式为application/json,如果会话存在返回json内容,否则返回[]。
举例:
curl \
http://127.0.0.1:8500/v1/session/info/c8615b6c-55c7-bc7d-1a71-4e427269d6ac \
| python -m json.tool
输出:
[
{
"Behavior": "delete",
"CreateIndex": 23095,
"ID": "c8615b6c-55c7-bc7d-1a71-4e427269d6ac",
"LockDelay": 10000000000,
"ModifyIndex": 23095,
"Name": "sess1",
"Node": "node1",
"NodeChecks": [
"serfHealth"
],
"ServiceChecks": null,
"TTL": "60s"
}
]
获取指定节点的会话列表:
用法:
curl \
http://127.0.0.1:8500/v1/session/node/:node
参数:
dc:指定要操作的数据中心,默认为当前代理所属的数据中心。以URL方式提供。
返回:
格式为application/json,如果会话存在返回json内容,否则返回[]。
举例:
curl \
http://127.0.0.1:8500/v1/session/node/node1
输出:
[
{
"Behavior": "delete",
"CreateIndex": 23128,
"ID": "2b932f71-711c-bdd3-c7b6-3f3c8cacf0a6",
"LockDelay": 10000000000,
"ModifyIndex": 23128,
"Name": "sess1",
"Node": "node1",
"NodeChecks": [
"serfHealth"
],
"ServiceChecks": null,
"TTL": "60s"
}
]
获取所有会话列表:
用法:
curl \
http://127.0.0.1:8500/v1/session/list
参数:
dc:指定要操作的数据中心,默认为当前代理所属的数据中心。以URL方式提供。
返回:
格式为application/json,如果会话存在返回json内容,否则返回[]。
举例:
curl \
http://127.0.0.1:8500/v1/session/list
输出:
[
{
"Behavior": "delete",
"CreateIndex": 23140,
"ID": "ef73ad18-af5a-1bbb-e317-9e33e30cd304",
"LockDelay": 10000000000,
"ModifyIndex": 23140,
"Name": "sess1",
"Node": "node1",
"NodeChecks": [
"serfHealth"
],
"ServiceChecks": null,
"TTL": "60s"
}
]
分布式锁的应用:
步骤:
- 创建会话,指定TTL超时时间和超时操作行为release。
这里指定超时时间是为了防止死锁。 - 创建或更新KV,并使用acquire参数关联上一步返回的会话ID。
这里会尝试以加锁的方式占用会话,如果入锁成功,则创建或更新KV,并将二者建立关联。 - 如果上一步执行失败,命令并不会阻塞,需延时一段时间主动尝试,直到操作成功。
- 在超时时间内,锁的持有者用完锁,主动释放锁。
- 在超时时间内,如果锁的持有者想继续持有锁,需主动续租会话。
举例:
准备载体文件payload.json,内容如下:
{
"LockDelay": "10s",
"Name": "sess1",
"Node": "node1",
"Behavior": "release",
"TTL": "300s"
}
执行命令创建会话:
curl \
--request PUT \
--data @payload.json \
http://127.0.0.1:8500/v1/session/create
输出:
{"ID":"050f54b7-0ef6-97d6-212f-02144fce45a5"}
然后继续执行命令创建KV:
curl \
--request PUT \
--data 123 \
http://127.0.0.1:8500/v1/kv/test?acquire=050f54b7-0ef6-97d6-212f-02144fce45a5
输出:
true
若想释放锁执行命令:
curl \
--request PUT \
--data 123 \
http://127.0.0.1:8500/v1/kv/test?release=050f54b7-0ef6-97d6-212f-02144fce45a5
若想续租会话执行命令:
curl \
--request PUT \
http://127.0.0.1:8500/v1/session/renew/050f54b7-0ef6-97d6-212f-02144fce45a5 \
| python -m json.tool
需续租约的分布式配置应用:
步骤:
- 创建会话,指定TTL超时时间和超时操作行为delete。
- 创建或更新KV,并使用acquire参数关联上一步返回的会话ID。
- 定期续订会话,若没有及时续订,则超时后会话和KV均被删除。
举例:
准备载体文件payload.json,内容如下:
{
"LockDelay": "10s",
"Name": "sess1",
"Node": "node1",
"Behavior": "delete",
"TTL": "300s"
}
执行命令创建会话:
curl \
--request PUT \
--data @payload.json \
http://127.0.0.1:8500/v1/session/create
输出:
{"ID":"87288297-6e53-d5d2-f592-a1e599c0fef5"}
然后继续执行命令创建KV:
curl \
--request PUT \
--data 123 \
http://127.0.0.1:8500/v1/kv/test?acquire=87288297-6e53-d5d2-f592-a1e599c0fef5
输出:
true
继续执行命令续租:
curl \
--request PUT \
http://127.0.0.1:8500/v1/session/renew/87288297-6e53-d5d2-f592-a1e599c0fef5 \
| python -m json.tool
输出:
[
{
"Behavior": "delete",
"CreateIndex": 23237,
"ID": "87288297-6e53-d5d2-f592-a1e599c0fef5",
"LockDelay": 10000000000,
"ModifyIndex": 23237,
"Name": "sess1",
"Node": "node1",
"NodeChecks": [
"serfHealth"
],
"ServiceChecks": null,
"TTL": "300s"
}
]
读取会话信息:
curl \
http://127.0.0.1:8500/v1/session/info/87288297-6e53-d5d2-f592-a1e599c0fef5 \
| python -m json.tool
输出与会话续租输出相同,略。
读取KV:
curl \
http://127.0.0.1:8500/v1/kv/test \
| python -m json.tool
输出:
[
{
"CreateIndex": 23244,
"Flags": 0,
"Key": "test",
"LockIndex": 1,
"ModifyIndex": 23244,
"Session": "87288297-6e53-d5d2-f592-a1e599c0fef5",
"Value": "MTIz"
}
]
可以看到KV有关联LockIndex和Session。