有勇气的牛排博客

Consul分布式服务发现与配置管理工具


进群口令:博客

1 Consul 简介

Consul 是 HashiCorp 开源的一款 分布式服务发现与配置管理工具,在微服务架构中应用广泛。主要由以下功能:

1、服务发现(Service Discovery)

  • 服务注册:应用启动时将自己的IP、端口、健康检查等信息注册到 Consul。
  • 服务发现:其他应用通过 Consul 查找目标付服务(类似电话簿)。

2、健康检查(Health Check)

  • 支持 HTTP、TCP、gRPC、脚本等多种方式。
  • 当服务异常时从注册列表剔除。

3、Key/Value存储(KV Store)

  • 提供一个分布式 KV 存储,可以保存配置、动态参数。
  • 类似 etcd、ZooKeeper 的配置管理功能。

4、多数据中心支持

  • 可以跨多个数据中心运行,支持跨集群服务发现。

5、安全

  • 内置 ACL 权限控制mTLS加密,保证通信安全。

2 Consul 架构

Consul 由多个组件组成:

1、Agent(代理)

每个节点(服务器)都需要运行一个 Consul Agent,分为:

  • Server节点:保存数据、负责一致性协议(Raft),至少3个(推荐3/5节点)
  • Clinet节点:只负责转发请求给 Server,开销小。

2、Raft 协议

  • Server 节点使用 Raft 协议来保证一致性。

3、DNS & HTTP API

  • Consul 提供 DNS 接口(默认8600端口)和 HTTP API(默认 8500端口)

3 安装

3.1 docker测试版

开发模式启动

docker pull consul:1.15
docker run -d --name=consul \ -p 8500:8500 \ -p 8600:8600/udp \ consul:1.15 agent -dev -client=0.0.0.0

然后访问:

  • Web UI: http://192.168.56.20:8500
  • DNS 接口: udp://192.168.56.20:8600

Consul Web控制面板

3.2 开发模式启动(单机测试)

consul agent -dev -ui

-dev:单节点模式,方便测试。

-ui:启用 Web UI(http://127.0.0.1:8500)。

4 常用命令

4.1 查看节点

consul members

4.2 KV存储

consul kv put redis/config "maxmemory=256mb" consul kv get redis/config consul kv delete redis/config

4.3 调试命令(在 Consul server/agent 节点上)

# 列出某服务的健康检查状态 curl -H "X-Consul-Token:<TOKEN>" http://<CONSUL_HOST>:8500/v1/health/checks/<service-name> # 列出 agent 管理的 checks curl -H "X-Consul-Token:<TOKEN>" http://<CONSUL_HOST>:8500/v1/agent/checks # 在 consul 节点上直接测试目标地址(是否能访问) curl http://192.168.56.20:8080/health # 如果这条在 consul 节点不能通,HTTP 检查必失败 # 查看服务列表(catalog) curl -H "X-Consul-Token:<TOKEN>" http://<CONSUL_HOST>:8500/v1/catalog/services

5 API

5.1 服务注册

5.1.1 user-service.json

{ "ID": "user-service-1", "Name": "user-service", "Tags": ["v1"], "Address": "192.168.56.20", "Port": 8080, "Check": { "TCP": "192.168.56.20:8080", "Interval": "10s", "Timeout": "5s" } }

TCP: Consul 会尝试连接 192.168.182.184:8080

Interval: 每 10 秒检查一次。

Timeout: 5 秒超时。

5.1.2 注册命令

curl -X PUT \ -H "X-Consul-Token: 1d0204f4-73e6-bba4-8136-1db4bb689970" \ --data @user-service.json \ http://192.168.56.20:8500/v1/agent/service/register

5.2 健康检查

curl -H "X-Consul-Token: 1d0204f4-73e6-bba4-8136-1db4bb689970" \ http://192.168.56.20:8500/v1/health/checks/user-service

6 第三方调用

6.1 Python 微服务注册与发现

Python Consul 微服务注册与发现

7 健康检查介绍

7.1 HTTP 检查

原理:agent向指定 URL 发 HTTP请求,按返回码判定。支持 Method、Header、Body、TLS配置

{ "ID": "user-service-1", "Name": "user-service", "Address": "192.168.56.20", "Port": 8080, "Check": { "HTTP": "http://192.168.56.20:8080/health", // 要访问的 URL "Method": "GET", // 默认 GET,可改成 POST/PUT "Header": {"X-Env": ["prod","v1"]}, // 可带多个 header 值 "Body": "", // 可带 body(如果 Method 非 GET) "Interval": "10s", // 每 10 秒检查一次(必须) "Timeout": "3s", // 单次请求超时(建议 < Interval) "DisableRedirects": true, // 是否跟随 3xx 重定向 "TLSSkipVerify": false, // 若 https,是否跳过证书校验(谨慎) "DeregisterCriticalServiceAfter": "30m" // 若持续 critical 超过 30m,则自动注销服务 } }

需要确认的是http://192.168.56.20:8080/health能被正常访问。

7.2 TCP 检查(跨语言)

原理:尝试在 host:port 简历TCP连接,能连上 passing (用于只有端口监听,但没有 HTTP 的场景)。

{ "ID": "user-service-1", "Name": "user-service", "Address": "192.168.56.20", "Port": 8080, "Check": { "TCP": "192.168.56.20:8080", "Interval": "10s", "Timeout": "2s", "DeregisterCriticalServiceAfter": "1h" } }

7.3 Script/Args 检查 (在 agent 节点执行脚本)

原理:agent在本机执行命令,依据命令,依据命令退出码判断(0→passing)。

适合检查本机状态、系统级别依赖,或需要复杂判断的场景。

{ "ID": "disk-check", "Name": "disk-space", "Check": { "Args": ["/usr/local/bin/check_disk.sh", "--warn=80"], "Interval": "30s", "Timeout": "10s", "Notes": "Check local disk usage" } }

注意

  • Args/Script 在 agent 节点上执行:脚本必须存在并可执行。
  • 在容器化场景下,若 agent 在容器里运行,脚本必须存在于 agent 容器或使用 Docker exec(有 dockercontainerid 字段可用)。

7.4 TTL检查(应用主动上报)

原理:定义 TTL(比如 "30s"),应用必须在 TTL 到期前通过 HTTP PUT 调用 agent 的 /v1/agent/check/pass/:check_id(或 warn/fail)来告知健康;若超时未上报 → critical。适合短期、内部状态推送(例:数据库复制状态、外部依赖汇报)。

{ "ID": "user-service-ttl", "Name": "user-service", "Address": "192.168.56.20", "Port": 8080, "Check": { "TTL": "30s", "DeregisterCriticalServiceAfter": "10m" } }

应用上报命令:

# 标记 passing(每隔 20s 或更短时间上报一次) curl -X PUT -H "X-Consul-Token: <TOKEN>" \ http://192.168.56.20:8500/v1/agent/check/pass/service:user-service-ttl

优点:应用自己有最多话语权;适合复杂内部状态。

7.5 gRPC / H2PING / UDP / 其他(高级)

  • gRPC:支持使用 gRPC 健康协议进行检查(字段 GRPC, GRPCUseTLS 等)。适合原生 gRPC 服务。
  • H2Ping:对 HTTP/2 服务进行 ping 检查(有 H2PingUseTLS / TLSSkipVerify)。
  • UDP / Docker Exec / OS Service checks:Consul 在不同版本/部署中逐步支持更多检查类型(eg. dockercontainerid、os_service)。使用前查当前 Consul 版本文档。

8 使用场景

  • 微服务架构中的服务注册与发现。
  • 配置中心(替代 etcd/ZooKeeper)。
  • 多数据中心服务治理。
  • 与 Kubernetes 继承,做服务网格(Consul Connect)。

评论区

×
×