Consul(服务全生命周期治) 单节点部署测试以及脚本制作示例(v1.21.2)

Consul 服务治理与健康检查指南

1. 基础配置准备

  • 创建 /etc/consul.d 作为服务注册的配置文件目录
  • 创建 consul-base.hcl 作为 Consul 服务本身的配置文件

Consul 是由 HashiCorp(知名基础设施自动化工具厂商,代表产品如 Terraform、Vagrant)开发的一款开源服务网格(Service Mesh)与服务治理工具,核心定位是解决分布式系统中“服务如何发现、配置如何同步、流量如何安全管控”三大核心问题,尤其适用于微服务、云原生架构场景。

一、Consul 的核心功能

Consul 的功能围绕“服务全生命周期治理”设计,核心模块可分为四大类:

1. 服务发现(Service Discovery)

这是 Consul 最基础的功能,解决“分布式系统中,服务A如何找到服务B”的问题。

  • 工作原理

    1. 服务(如“支付服务”“订单服务”)启动时,主动向 Consul 注册自身信息(IP、端口、健康状态检查方式等);
    2. 其他服务(如“用户服务”)需要调用“支付服务”时,向 Consul 发送查询请求;
    3. Consul 根据服务注册信息和健康检查结果,返回可用的“支付服务”实例列表(自动过滤故障实例)。
  • 价值:替代传统“硬编码IP”或“静态配置文件”,实现服务地址动态管理,适应微服务频繁扩容、缩容的场景。

2. 健康检查(Health Checking)

保障服务发现的“准确性”,避免将请求转发到故障服务。

  • 支持的检查类型

    • 基础检查:TCP端口连通性(如检查8080端口是否存活)、HTTP接口(如访问/health接口判断返回码是否为200);
    • 自定义检查:执行Shell脚本(如检查日志是否有错误)、定时执行命令(如检查数据库连接)。
  • 机制:Consul 定期执行检查,若服务连续失败(可配置阈值),则将其标记为“不健康”,并从服务列表中剔除;恢复后自动重新加入。

3. 键值存储(Key-Value Store, KV Store)

用于分布式配置管理,解决“多服务、多实例如何同步配置”的问题。

  • 典型场景

    • 全局配置:如数据库连接地址、API密钥、限流阈值等,只需在 Consul KV 中修改一次,所有依赖服务自动感知更新;
    • 环境区分:通过KV路径区分环境(如/config/prod/db/config/test/db),避免配置文件混乱。
  • 特点:支持配置版本控制、监听机制(服务可订阅KV变更,实时更新本地配置,无需重启)。

4. 服务分段(Service Segmentation,原“服务网格”核心)

实现服务间通信的安全管控,替代传统的网络防火墙(基于IP的管控),更适配微服务“动态IP”场景。

  • 核心能力
    • 身份认证:为每个服务分配唯一“服务身份”(基于TLS证书),确保只有授权服务能通信;
    • 访问控制:通过“意向(Intentions)”规则定义服务间的访问权限(如“允许订单服务调用支付服务,拒绝用户服务直接调用支付服务”);
    • 流量加密:默认通过TLS加密服务间的TCP流量,防止数据泄露或篡改。

二、Consul 的技术特性

  1. 分布式与高可用

    • 基于 Raft 一致性协议 实现集群管理,支持多节点部署(至少3个节点,避免单点故障);
    • 支持 多数据中心(Multi-Datacenter):跨地域的服务可通过 Consul 互联(如北京机房的服务发现上海机房的服务),无需复杂的跨域网络配置。
  2. 易用性

    • 提供简洁的 CLI 命令(如consul agent启动节点、consul services register注册服务);
    • 内置 Web UI(默认端口8500),可直观查看服务列表、健康状态、KV配置等。
  3. 多语言与多平台支持

    • 支持主流编程语言(Go、Java、Python、Node.js等)的SDK,方便服务集成;
    • 可运行在 Linux、Windows、macOS 及 Kubernetes 等容器编排平台(提供 Consul K8s 插件)。

三、Consul 与同类工具的对比

分布式系统中,部分工具也提供“服务发现”或“配置管理”功能,Consul 的核心优势是“全功能集成”(无需组合多个工具)。

工具 核心能力 优势 劣势
Consul 服务发现+健康检查+KV+服务分段 功能全、多数据中心支持好 资源占用略高(相比单一功能工具)
etcd 分布式KV(侧重配置)+服务发现 轻量、性能好(适合K8s场景) 无内置健康检查、服务分段功能
ZooKeeper 分布式协调(侧重一致性) 成熟稳定(Hadoop/Spark依赖) 配置复杂、不支持多数据中心
Nacos 服务发现+配置管理 国产、中文文档丰富、易用性高 服务分段能力较弱,生态不如Consul

四、Consul 的典型应用场景

  1. 微服务架构:管理数百个微服务的注册、发现、配置同步,如电商系统(订单、支付、库存服务的协同);
  2. 云原生部署:在 Kubernetes 集群中,作为“服务网格”替代 Istio(轻量场景),或补充 K8s Service 的功能(如跨集群服务发现);
  3. 多地域部署:跨国、跨机房的业务,通过 Consul 多数据中心功能实现全球服务互联;
  4. DevOps 自动化:结合 Terraform 等工具,实现“基础设施即代码(IaC)”与“服务配置”的联动。

五、如何快速体验 Consul?

  1. 安装
  1. 启动单机节点(开发模式,仅用于测试):

    1
    consul agent -dev  # 启动开发模式,自动创建单节点集群
  2. 访问 Web UI:打开浏览器访问 http://localhost:8500,即可看到 Consul 控制台,尝试注册一个测试服务或添加KV配置。

  3. 启动文件:
    将启动文件放在/etc/consul.d/目录下,在启动时指定 -config-dir=/etc/consul.d/,例如pm2 start "./consul agent -config-dir=/etc/consul.d/ -client=0.0.0.0 --bind=10.1.8.7 -server -bootstrap-expect=1" --name "consul"

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    data_dir = "/var/lib/consul"
    client_addr = "0.0.0.0"
    enable_script_checks = true
    bind_addr = "你的IP地址,如果是公网,则填写内网地址"
    ui_config {
    enabled = true
    }#启动ui界面
    #=======下面的配置可选=====
    acl = {
    enabled = true
    default_policy = "deny"
    enable_token_persistence = true
    }

    总结:Consul 是一款“一站式”的分布式服务治理工具,通过整合服务发现、健康检查、配置管理、安全管控,解决了微服务和云原生架构中的核心痛点,是现代分布式系统中不可或缺的基础设施组件之一。

六、Consul 安装步骤

准备工作

  • 获取 consul 的二进制可执行文件
    consul二进制文件示意图

    上传到服务器后,会得到一个二进制可执行文件
    服务器上的consul文件

启动参数

开发者模式启动 consul:

1
./consul agent -dev -client=0.0.0.0

访问 http://consulIP:8500 即可打开 Consul Web 控制台
Consul Web UI界面

七、服务注册与健康检查示例

以 MySQL 为例

制作监控检查脚本,将脚本存放在 /etc/consul.d 目录下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
service {
name = "MySQL-Service"
id = "MySQL-TengXuny"
address = "你的MySQL连接地址"
port = 3306
# 注意:如果生成过bootstrap或策略,注册服务时建议显式指定token参数
# token = "填入bootstarp_token"
tags = ["master", "TengxYun"]
check {
name = "MySQL-Check"
tcp = "你的MySQL连接地址:3306"
interval = "15s" # 检查间隔
timeout = "5s" # 超时时间
}
}

注册成功后在 Consul UI 中显示的 MySQL 服务状态

MySQL服务在Consul中的状态

HTTP 检查示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
service {
name = "BlogHexoServer"
id = "HexoBlog"
address = "127.0.0.1"
port = 4000
# token = "填入bootstarp_token"
tags = ["blog","hexo"]
check {
name = "Hexobloghttp-check"
http = "http://127.0.0.1:4000" # 健康检查的HTTP接口
interval = "15s"
timeout = "5s"
status = "200-299" # 期望的HTTP状态码范围
}
}

HTTP服务在Consul中的健康检查状态

Hexo博客服务健康检查状态

八. 生成Bootstrap(token令牌)

  • 全局令牌

    在 Consul 中,consul acl bootstrap 命令用于初始化 ACL(Access Control List)系统,生成全局唯一的初始管理令牌(bootstrap token)。该令牌拥有最高权限(global-management 策略),可用于后续配置 ACL 规则、创建其他令牌等操作。在后续的操作中需要携带此token,直到三权分立,将bootstarp生成的权限分散给不同的局部token,但,全局token仍然存在

    1
    consul acl bootstrap