目录
Consul 提供了两种主要的操作方式:命令行工具(CLI) 和 HTTP API,它们功能相似但适用场景不同。下面详细解析两者的使用方式、核心功能及区别:
一、Consul 命令行工具(CLI)
Consul 命令行工具是与 Consul 交互的主要方式,适合手动操作、脚本自动化等场景。
核心命令分类
服务与节点管理
consul catalog nodes
:列出所有节点consul catalog services
:列出所有服务consul service register <配置文件>
:注册服务(配置文件为 JSON/HCL 格式)consul service deregister <服务ID>
:注销服务
KV 存储操作
consul kv get <键>
:获取键值consul kv put <键> <值>
:设置键值consul kv delete <键>
:删除键consul kv get -recurse
:递归列出所有键值
健康检查
consul health checks <服务名>
:查看服务的健康检查consul health service -passing <服务名>
:只查看健康的服务实例
集群管理
consul members
:查看集群成员consul operator raft list-peers
:查看 Raft 集群领导者信息consul join <节点IP>
:加入集群
ACL 权限管理
consul acl token create
:创建 ACL Tokenconsul acl policy create -name <名称> -rules <规则文件>
:创建权限策略
命令行使用特点
- 便捷性:无需手动构造 HTTP 请求,适合终端直接操作。
- 参数统一:所有命令支持
-token
(指定 ACL Token)、-datacenter
(指定数据中心)等通用参数。 - 版本差异:部分命令(如
consul catalog service
)在旧版本中可能不存在,需用consul health service
替代。
二、Consul HTTP API
Consul 所有功能均通过 HTTP API 暴露,适合程序(如 Java、Python 等)与 Consul 集成。默认端口为 8500
,基础路径为 http://<consul地址>:8500/v1/
。
核心 API 分类
服务与节点 API
- 列出所有服务:
GET /v1/catalog/services
- 查看特定服务:
GET /v1/catalog/service/<服务名>
- 注册服务:
PUT /v1/agent/service/register
(请求体为 JSON 配置) - 注销服务:
PUT /v1/agent/service/deregister/<服务ID>
- 列出所有服务:
KV 存储 API
- 获取键值:
GET /v1/kv/<键>
- 设置键值:
PUT /v1/kv/<键>
(请求体为值) - 删除键:
DELETE /v1/kv/<键>
- 递归列出键:
GET /v1/kv/?recurse
- 获取键值:
健康检查 API
- 查看服务健康状态:
GET /v1/health/service/<服务名>
- 只看健康实例:
GET /v1/health/service/<服务名>?passing
- 查看服务健康状态:
集群管理 API
- 查看集群成员:
GET /v1/agent/members
- 查看 Raft 状态:
GET /v1/operator/raft/configuration
- 查看集群成员:
API 使用特点
- 通用性:不受语言限制,任何能发 HTTP 请求的程序都可调用。
- 灵活性:支持更复杂的查询参数(如过滤、递归等)。
- 认证方式:通过请求头
X-Consul-Token: <token>
传递 ACL 权限。
三、命令行与 API 的对应关系
功能场景 | 命令行示例 | API 示例 |
---|---|---|
查看服务实例 | consul health service kafka |
GET /v1/health/service/kafka |
获取 KV 键值 | consul kv get config/db/port |
GET /v1/kv/config/db/port |
注册服务 | consul service register service.json |
PUT /v1/agent/service/register (带JSON体) |
查看集群成员 | consul members |
GET /v1/agent/members |
四、选择建议
- 手动操作/脚本:优先用命令行(如
consul kv get
、consul catalog services
),简单直接。 - 程序集成:必须用 HTTP API(如 Java 代码通过
HttpClient
调用)。 - 跨版本兼容:API 兼容性更好(命令行可能随版本增删子命令)。
五、示例:查询 Kafka 服务(带认证)
命令行方式
# 查看 Kafka 服务健康实例(带 ACL Token)
consul health service kafka -token=c5d69a-5f19-469b-0543-eecc66
API 方式
# 用 curl 调用 API(带 Token 头)
curl http://127.0.0.1:8500/v1/health/service/kafka \
-H "X-Consul-Token: c5d69a-5f19-469b-0543-eecc66"
通过以上两种方式,均可获取 Kafka 服务的实例列表、IP、端口及健康状态等信息。
要在 Consul 中配置 Prometheus 服务发现,需要完成两个核心步骤:在 Consul 中注册服务 和 配置 Prometheus 从 Consul 发现目标。以下是详细操作流程:
一、在 Consul 中注册服务
首先需要将你的业务服务注册到 Consul(可以是 API 服务、数据库等需要被 Prometheus 监控的目标)。注册方式有两种:
1. 通过配置文件注册(推荐)
创建一个服务配置文件(如 prometheus-targets.json
或 .hcl
),定义服务信息:
{
"service": {
"name": "api-service", // 服务名称(Prometheus 会根据此名称发现)
"id": "api-service-1", // 服务唯一ID(同一服务多个实例需不同)
"address": "192.168.1.100", // 服务IP地址
"port": 8080, // 服务端口(Prometheus 采集指标的端口)
"tags": ["metrics-path=/metrics"], // 可选:指定指标路径(默认/metrics)
"check": { // 健康检查(可选,确保服务可用)
"http": "http://192.168.1.100:8080/health",
"interval": "10s"
}
}
}
通过 Consul 命令注册:
consul services register prometheus-targets.json
2. 通过 API 注册
直接发送 HTTP 请求注册服务:
curl -X PUT http://127.0.0.1:8500/v1/agent/service/register \
-H "Content-Type: application/json" \
-d '{
"Name": "db-service",
"Address": "192.168.1.101",
"Port": 9090,
"Tags": ["metrics-path=/prometheus"]
}'
二、配置 Prometheus 从 Consul 发现服务
修改 Prometheus 配置文件(prometheus.yml
),添加 Consul 服务发现规则:
scrape_configs:
# 配置一个基于 Consul 的采集任务
- job_name: 'consul-services' # 任务名称(自定义)
# 启用 Consul 服务发现
consul_sd_configs:
- server: '127.0.0.1:8500' # Consul 服务器地址(如果有 ACL,需添加 token)
# 若 Consul 启用 ACL,添加以下配置
# token: 'your-consul-acl-token'
services: [] # 空数组表示发现所有服务,也可指定特定服务如 ["api-service"]
# 过滤规则(可选,只采集需要的服务)
relabel_configs:
# 1. 只保留标签中包含 "metrics-path" 的服务
- source_labels: [__meta_consul_service_tag]
regex: .*metrics-path=.*
action: keep
# 2. 从服务标签中提取 metrics 路径(如标签 "metrics-path=/custom")
- source_labels: [__meta_consul_service_tag]
regex: .*metrics-path=([^;]+)
target_label: __metrics_path__
replacement: $1
# 3. 给采集的指标添加服务名称标签
- source_labels: [__meta_consul_service]
target_label: service_name
三、核心配置说明
consul_sd_configs
:定义 Consul 连接信息server
:Consul 代理地址(默认127.0.0.1:8500
)services
:指定要发现的服务名称(空数组表示所有服务)token
:Consul ACL Token(若启用了权限控制)
relabel_configs
:数据重标签(处理服务元数据)__meta_consul_service
:Consul 服务名称__meta_consul_address
:服务IP地址__meta_consul_port
:服务端口__meta_consul_service_tag
:服务标签(可用于传递指标路径等信息)
四、验证配置
重启 Prometheus 使配置生效:
systemctl restart prometheus
访问 Prometheus UI(默认
http://localhost:9090
),在 Status → Targets 中查看是否成功发现服务。
五、示例:只发现特定服务
如果只想让 Prometheus 发现 api-service
和 db-service
,修改配置:
consul_sd_configs:
- server: '127.0.0.1:8500'
services: ["api-service", "db-service"] # 只发现这两个服务
通过以上步骤,Prometheus 会自动从 Consul 同步服务列表,并根据服务的 IP、端口和标签动态调整采集目标,实现服务的自动发现和监控。