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

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 微服务注册与发现

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",
"Method": "GET",
"Header": {"X-Env": ["prod","v1"]},
"Body": "",
"Interval": "10s",
"Timeout": "3s",
"DisableRedirects": true,
"TLSSkipVerify": false,
"DeregisterCriticalServiceAfter": "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)。
<h2><a id="1_Consul__0"></a>1 Consul 简介</h2>
<p><strong>Consul</strong> 是 HashiCorp 开源的一款 <strong>分布式服务发现与配置管理工具</strong>,在微服务架构中应用广泛。主要由以下功能:</p>
<p>1、<strong>服务发现(Service Discovery)</strong></p>
<ul>
<li>服务注册:应用启动时将自己的IP、端口、健康检查等信息注册到 Consul。</li>
<li>服务发现:其他应用通过 Consul 查找目标付服务(类似电话簿)。</li>
</ul>
<p>2、<strong>健康检查(Health Check)</strong></p>
<ul>
<li>支持 HTTP、TCP、gRPC、脚本等多种方式。</li>
<li>当服务异常时从注册列表剔除。</li>
</ul>
<p>3、<strong>Key/Value存储(KV Store)</strong></p>
<ul>
<li>提供一个分布式 KV 存储,可以保存配置、动态参数。</li>
<li>类似 etcd、ZooKeeper 的配置管理功能。</li>
</ul>
<p>4、<strong>多数据中心支持</strong></p>
<ul>
<li>可以跨多个数据中心运行,支持跨集群服务发现。</li>
</ul>
<p>5、<strong>安全</strong></p>
<ul>
<li>内置 <strong>ACL 权限控制</strong>、<strong>mTLS加密</strong>,保证通信安全。</li>
</ul>
<h2><a id="2_Consul__27"></a>2 Consul 架构</h2>
<p>Consul 由多个组件组成:</p>
<p><strong>1、Agent(代理)</strong></p>
<p>每个节点(服务器)都需要运行一个 Consul Agent,分为:</p>
<ul>
<li>Server节点:保存数据、负责一致性协议(Raft),至少3个(推荐3/5节点)</li>
<li>Clinet节点:只负责转发请求给 Server,开销小。</li>
</ul>
<p><strong>2、Raft 协议</strong></p>
<ul>
<li>Server 节点使用 Raft 协议来保证一致性。</li>
</ul>
<p><strong>3、DNS & HTTP API</strong></p>
<ul>
<li>Consul 提供 DNS 接口(默认8600端口)和 HTTP API(默认 8500端口)</li>
</ul>
<h2><a id="3__46"></a>3 安装</h2>
<h3><a id="31_docker_48"></a>3.1 docker测试版</h3>
<p>开发模式启动</p>
<pre><div class="hljs"><code class="lang-shell">docker pull consul:1.15
</code></div></pre>
<pre><div class="hljs"><code class="lang-shell">docker run -d --name=consul \
-p 8500:8500 \
-p 8600:8600/udp \
consul:1.15 agent -dev -client=0.0.0.0
</code></div></pre>
<p>然后访问:</p>
<ul>
<li>Web UI: <code>http://192.168.56.20:8500</code></li>
<li>DNS 接口: <code>udp://192.168.56.20:8600</code></li>
</ul>
<p><img src="https://static.couragesteak.com/article/2570d905c84c211cd1e655ef7da8184c.png" alt="Consul Web控制面板" /></p>
<h3><a id="32__70"></a>3.2 开发模式启动(单机测试)</h3>
<pre><div class="hljs"><code class="lang-shell">consul agent -dev -ui
</code></div></pre>
<p><code>-dev</code>:单节点模式,方便测试。</p>
<p><code>-ui</code>:启用 Web UI(http://127.0.0.1:8500)。</p>
<h2><a id="4__80"></a>4 常用命令</h2>
<h3><a id="41__82"></a>4.1 查看节点</h3>
<pre><div class="hljs"><code class="lang-shell">consul members
</code></div></pre>
<h3><a id="42_KV_88"></a>4.2 KV存储</h3>
<pre><div class="hljs"><code class="lang-shell">consul kv put redis/config "maxmemory=256mb"
consul kv get redis/config
consul kv delete redis/config
</code></div></pre>
<h3><a id="43__Consul_serveragent__96"></a>4.3 调试命令(在 Consul server/agent 节点上)</h3>
<pre><div class="hljs"><code class="lang-shell"><span class="hljs-meta"># </span><span class="language-bash">列出某服务的健康检查状态</span>
curl -H "X-Consul-Token:<TOKEN>" http://<CONSUL_HOST>:8500/v1/health/checks/<service-name>
<span class="hljs-meta">
# </span><span class="language-bash">列出 agent 管理的 checks</span>
curl -H "X-Consul-Token:<TOKEN>" http://<CONSUL_HOST>:8500/v1/agent/checks
<span class="hljs-meta">
# </span><span class="language-bash">在 consul 节点上直接测试目标地址(是否能访问)</span>
curl http://192.168.56.20:8080/health # 如果这条在 consul 节点不能通,HTTP 检查必失败
<span class="hljs-meta">
# </span><span class="language-bash">查看服务列表(catalog)</span>
curl -H "X-Consul-Token:<TOKEN>" http://<CONSUL_HOST>:8500/v1/catalog/services
</code></div></pre>
<h2><a id="5_API_112"></a>5 API</h2>
<h3><a id="51__114"></a>5.1 服务注册</h3>
<h4><a id="511_userservicejson_116"></a>5.1.1 user-service.json</h4>
<pre><div class="hljs"><code class="lang-json"><span class="hljs-punctuation">{</span>
<span class="hljs-attr">"ID"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"user-service-1"</span><span class="hljs-punctuation">,</span>
<span class="hljs-attr">"Name"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"user-service"</span><span class="hljs-punctuation">,</span>
<span class="hljs-attr">"Tags"</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">[</span><span class="hljs-string">"v1"</span><span class="hljs-punctuation">]</span><span class="hljs-punctuation">,</span>
<span class="hljs-attr">"Address"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"192.168.56.20"</span><span class="hljs-punctuation">,</span>
<span class="hljs-attr">"Port"</span><span class="hljs-punctuation">:</span> <span class="hljs-number">8080</span><span class="hljs-punctuation">,</span>
<span class="hljs-attr">"Check"</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">{</span>
<span class="hljs-attr">"TCP"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"192.168.56.20:8080"</span><span class="hljs-punctuation">,</span>
<span class="hljs-attr">"Interval"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"10s"</span><span class="hljs-punctuation">,</span>
<span class="hljs-attr">"Timeout"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"5s"</span>
<span class="hljs-punctuation">}</span>
<span class="hljs-punctuation">}</span>
</code></div></pre>
<p><code>TCP</code>: Consul 会尝试连接 <code>192.168.182.184:8080</code>。</p>
<p><code>Interval</code>: 每 10 秒检查一次。</p>
<p><code>Timeout</code>: 5 秒超时。</p>
<h4><a id="512__139"></a>5.1.2 注册命令</h4>
<pre><div class="hljs"><code class="lang-shell">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
</code></div></pre>
<h3><a id="52__148"></a>5.2 健康检查</h3>
<pre><div class="hljs"><code class="lang-shell">curl -H "X-Consul-Token: 1d0204f4-73e6-bba4-8136-1db4bb689970" \
http://192.168.56.20:8500/v1/health/checks/user-service
</code></div></pre>
<h2><a id="6__155"></a>6 第三方调用</h2>
<h3><a id="61_Python__157"></a>6.1 Python 微服务注册与发现</h3>
<p><img src="https://static.couragesteak.com/article/7a81a9a2b479012ffd606fbc505f66a7.png" alt="Python Consul 微服务注册与发现" /></p>
<h2><a id="7__161"></a>7 健康检查介绍</h2>
<h3><a id="71_HTTP__163"></a>7.1 HTTP 检查</h3>
<p>原理:agent向指定 URL 发 HTTP请求,按返回码判定。支持 Method、Header、Body、TLS配置</p>
<pre><div class="hljs"><code class="lang-json"><span class="hljs-punctuation">{</span>
<span class="hljs-attr">"ID"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"user-service-1"</span><span class="hljs-punctuation">,</span>
<span class="hljs-attr">"Name"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"user-service"</span><span class="hljs-punctuation">,</span>
<span class="hljs-attr">"Address"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"192.168.56.20"</span><span class="hljs-punctuation">,</span>
<span class="hljs-attr">"Port"</span><span class="hljs-punctuation">:</span> <span class="hljs-number">8080</span><span class="hljs-punctuation">,</span>
<span class="hljs-attr">"Check"</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">{</span>
<span class="hljs-attr">"HTTP"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"http://192.168.56.20:8080/health"</span><span class="hljs-punctuation">,</span> <span class="hljs-comment">// 要访问的 URL</span>
<span class="hljs-attr">"Method"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"GET"</span><span class="hljs-punctuation">,</span> <span class="hljs-comment">// 默认 GET,可改成 POST/PUT</span>
<span class="hljs-attr">"Header"</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">{</span><span class="hljs-attr">"X-Env"</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">[</span><span class="hljs-string">"prod"</span><span class="hljs-punctuation">,</span><span class="hljs-string">"v1"</span><span class="hljs-punctuation">]</span><span class="hljs-punctuation">}</span><span class="hljs-punctuation">,</span> <span class="hljs-comment">// 可带多个 header 值</span>
<span class="hljs-attr">"Body"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">""</span><span class="hljs-punctuation">,</span> <span class="hljs-comment">// 可带 body(如果 Method 非 GET)</span>
<span class="hljs-attr">"Interval"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"10s"</span><span class="hljs-punctuation">,</span> <span class="hljs-comment">// 每 10 秒检查一次(必须)</span>
<span class="hljs-attr">"Timeout"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"3s"</span><span class="hljs-punctuation">,</span> <span class="hljs-comment">// 单次请求超时(建议 < Interval)</span>
<span class="hljs-attr">"DisableRedirects"</span><span class="hljs-punctuation">:</span> <span class="hljs-keyword">true</span><span class="hljs-punctuation">,</span> <span class="hljs-comment">// 是否跟随 3xx 重定向</span>
<span class="hljs-attr">"TLSSkipVerify"</span><span class="hljs-punctuation">:</span> <span class="hljs-keyword">false</span><span class="hljs-punctuation">,</span> <span class="hljs-comment">// 若 https,是否跳过证书校验(谨慎)</span>
<span class="hljs-attr">"DeregisterCriticalServiceAfter"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"30m"</span> <span class="hljs-comment">// 若持续 critical 超过 30m,则自动注销服务</span>
<span class="hljs-punctuation">}</span>
<span class="hljs-punctuation">}</span>
</code></div></pre>
<p>需要确认的是<code>http://192.168.56.20:8080/health</code>能被正常访问。</p>
<h3><a id="72_TCP__189"></a>7.2 TCP 检查(跨语言)</h3>
<p>原理:尝试在 <code>host:port</code> 简历TCP连接,能连上 passing (用于只有端口监听,但没有 HTTP 的场景)。</p>
<pre><div class="hljs"><code class="lang-json"><span class="hljs-punctuation">{</span>
<span class="hljs-attr">"ID"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"user-service-1"</span><span class="hljs-punctuation">,</span>
<span class="hljs-attr">"Name"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"user-service"</span><span class="hljs-punctuation">,</span>
<span class="hljs-attr">"Address"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"192.168.56.20"</span><span class="hljs-punctuation">,</span>
<span class="hljs-attr">"Port"</span><span class="hljs-punctuation">:</span> <span class="hljs-number">8080</span><span class="hljs-punctuation">,</span>
<span class="hljs-attr">"Check"</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">{</span>
<span class="hljs-attr">"TCP"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"192.168.56.20:8080"</span><span class="hljs-punctuation">,</span>
<span class="hljs-attr">"Interval"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"10s"</span><span class="hljs-punctuation">,</span>
<span class="hljs-attr">"Timeout"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"2s"</span><span class="hljs-punctuation">,</span>
<span class="hljs-attr">"DeregisterCriticalServiceAfter"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"1h"</span>
<span class="hljs-punctuation">}</span>
<span class="hljs-punctuation">}</span>
</code></div></pre>
<h3><a id="73_ScriptArgs___agent__208"></a>7.3 Script/Args 检查 (在 agent 节点执行脚本)</h3>
<p>原理:agent在本机执行命令,依据命令,依据命令退出码判断(0→passing)。</p>
<p>适合检查本机状态、系统级别依赖,或需要复杂判断的场景。</p>
<pre><div class="hljs"><code class="lang-json"><span class="hljs-punctuation">{</span>
<span class="hljs-attr">"ID"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"disk-check"</span><span class="hljs-punctuation">,</span>
<span class="hljs-attr">"Name"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"disk-space"</span><span class="hljs-punctuation">,</span>
<span class="hljs-attr">"Check"</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">{</span>
<span class="hljs-attr">"Args"</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">[</span><span class="hljs-string">"/usr/local/bin/check_disk.sh"</span><span class="hljs-punctuation">,</span> <span class="hljs-string">"--warn=80"</span><span class="hljs-punctuation">]</span><span class="hljs-punctuation">,</span>
<span class="hljs-attr">"Interval"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"30s"</span><span class="hljs-punctuation">,</span>
<span class="hljs-attr">"Timeout"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"10s"</span><span class="hljs-punctuation">,</span>
<span class="hljs-attr">"Notes"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"Check local disk usage"</span>
<span class="hljs-punctuation">}</span>
<span class="hljs-punctuation">}</span>
</code></div></pre>
<p><strong>注意</strong>:</p>
<ul>
<li><code>Args</code>/<code>Script</code> 在 agent 节点上执行:脚本必须存在并可执行。</li>
<li>在容器化场景下,若 agent 在容器里运行,脚本必须存在于 agent 容器或使用 Docker exec(有 dockercontainerid 字段可用)。</li>
</ul>
<h3><a id="74_TTL_232"></a>7.4 TTL检查(应用主动上报)</h3>
<p><strong>原理</strong>:定义 <code>TTL</code>(比如 <code>"30s"</code>),应用必须在 TTL 到期前通过 HTTP PUT 调用 agent 的 <code>/v1/agent/check/pass/:check_id</code>(或 warn/fail)来告知健康;若超时未上报 → critical。适合短期、内部状态推送(例:数据库复制状态、外部依赖汇报)。</p>
<pre><div class="hljs"><code class="lang-json"><span class="hljs-punctuation">{</span>
<span class="hljs-attr">"ID"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"user-service-ttl"</span><span class="hljs-punctuation">,</span>
<span class="hljs-attr">"Name"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"user-service"</span><span class="hljs-punctuation">,</span>
<span class="hljs-attr">"Address"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"192.168.56.20"</span><span class="hljs-punctuation">,</span>
<span class="hljs-attr">"Port"</span><span class="hljs-punctuation">:</span> <span class="hljs-number">8080</span><span class="hljs-punctuation">,</span>
<span class="hljs-attr">"Check"</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">{</span>
<span class="hljs-attr">"TTL"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"30s"</span><span class="hljs-punctuation">,</span>
<span class="hljs-attr">"DeregisterCriticalServiceAfter"</span><span class="hljs-punctuation">:</span> <span class="hljs-string">"10m"</span>
<span class="hljs-punctuation">}</span>
<span class="hljs-punctuation">}</span>
</code></div></pre>
<p>应用上报命令:</p>
<pre><div class="hljs"><code class="lang-shell"><span class="hljs-meta"># </span><span class="language-bash">标记 passing(每隔 20s 或更短时间上报一次)</span>
curl -X PUT -H "X-Consul-Token: <TOKEN>" \
http://192.168.56.20:8500/v1/agent/check/pass/service:user-service-ttl
</code></div></pre>
<p><strong>优点</strong>:应用自己有最多话语权;适合复杂内部状态。</p>
<h3><a id="75_gRPC__H2PING__UDP___259"></a>7.5 gRPC / H2PING / UDP / 其他(高级)</h3>
<ul>
<li><strong>gRPC</strong>:支持使用 gRPC 健康协议进行检查(字段 <code>GRPC</code>, <code>GRPCUseTLS</code> 等)。适合原生 gRPC 服务。</li>
<li><strong>H2Ping</strong>:对 HTTP/2 服务进行 ping 检查(有 <code>H2PingUseTLS</code> / <code>TLSSkipVerify</code>)。</li>
<li><strong>UDP / Docker Exec / OS Service checks</strong>:Consul 在不同版本/部署中逐步支持更多检查类型(eg. dockercontainerid、os_service)。使用前查当前 Consul 版本文档。</li>
</ul>
<h2><a id="8__265"></a>8 使用场景</h2>
<ul>
<li>微服务架构中的服务注册与发现。</li>
<li>配置中心(替代 etcd/ZooKeeper)。</li>
<li>多数据中心服务治理。</li>
<li>与 Kubernetes 继承,做服务网格(Consul Connect)。</li>
</ul>
评论区