官网:https://developer.hashicorp.com/consul/install
安装
# 下载(以 1.15.4 版本为例,替换为最新版本)
wget https://releases.hashicorp.com/consul/1.15.4/consul_1.15.4_linux_amd64.zip
# 解压
unzip consul_1.15.4_linux_amd64.zip
# 移动到 PATH 目录
sudo mv consul /usr/local/bin/
# 验证
consul --version
命令
以下是 Consul 常用的命令,涵盖了服务注册、发现、配置管理等核心功能:
基础操作
启动 Consul 代理
# 开发模式(单节点,数据存于内存) consul agent -dev # 允许外部访问(如同一局域网内的其他设备) consul agent -dev -client=0.0.0.0 # 服务器模式(生产环境) consul agent -server -bootstrap-expect=3 -data-dir=/path/to/data -node=node1 -bind=192.168.1.101 -client=0.0.0.0
查看代理状态
consul members # 查看集群成员 consul info # 查看代理详细信息 consul operator raft list-peers # 查看Raft集群状态
停止代理
consul leave # 优雅退出(通知集群)
服务管理
注册服务(命令行方式)
consul services register -name=web -address=127.0.0.1 -port=8080
通过配置文件注册服务
# 创建配置文件(如service-web.json)后加载 consul services register service-web.json # 示例 { "service": { "name": "web-service", // 服务名称(必填) "id": "web-service-1", // 服务唯一ID(可选,默认自动生成) "address": "192.168.1.201", // 服务IP(可选,默认绑定的IP) "port": 8080, // 服务端口 "tags": ["v1", "api"], // 标签(用于过滤) "check": { // 健康检查 "http": "http://192.168.1.201:8080/health", // 检查URL "interval": "10s", // 检查间隔 "timeout": "5s" // 超时时间 } } }
通过api注册
curl -X PUT http://localhost:8500/v1/agent/service/register -d '{ "Name": "order-service", "Address": "192.168.1.202", "Port": 9090, "Check": { "TCP": "192.168.1.202:9090", "Interval": "5s" } }'
查询服务
consul services list # 列出所有服务 consul catalog service web # 查看web服务详情 consul health check for service web # 查看服务健康检查 # 查看指定服务的健康实例 curl http://localhost:8500/v1/health/service/web-service?passing
注销服务
consul services deregister -id=web-1
健康检查
添加健康检查
consul checks register -name=web-check -service=web -http=http://localhost:8080/health -interval=10s
查看检查状态
consul catalog checks # 列出所有检查 consul health checks web # 查看指定服务的检查
KV 存储(配置管理)
基本操作
consul kv put config/web/port 8080 # 写入键值 consul kv get config/web/port # 读取键值 consul kv delete config/web/port # 删除键值 # 示例:存储配置(键为 config/app1/timeout,值为 30s) curl -X PUT http://localhost:8500/v1/kv/config/app1/timeout -d "30s" # 读取单个配置 curl http://localhost:8500/v1/kv/config/app1/timeout?raw # 返回 "30s" # 读取前缀为 config/app1 的所有配置(递归) curl http://localhost:8500/v1/kv/config/app1?recurse # 客户端监听配置(长轮询) curl http://localhost:8500/v1/kv/config/app1?recurse&wait=60s # 等待60秒,若期间有变化则立即返回
批量操作
consul kv get -recurse config/ # 递归查询 consul kv put -flags=42 config/version 1.0 # 带版本标记
分布式锁
# Consul 提供分布式锁功能,通过 kv 接口实现 # 获取锁(创建一个带 Session 的键) # 1. 创建 Session SESSION=$(curl -X PUT http://localhost:8500/v1/session/create -d '{"Name": "mylock"}' | jq -r .ID) # 2. 尝试获取锁(只有当键不存在时才创建,返回 true 表示成功) curl -X PUT http://localhost:8500/v1/kv/locks/mylock?acquire=$SESSION -d "owner=service1" # 3. 释放锁 curl -X PUT http://localhost:8500/v1/kv/locks/mylock?release=$SESSION
配置与集群
重新加载配置
consul reload # 重新加载配置文件
加入集群
# 新节点加入已有集群 consul join 192.168.1.101 192.168.1.102 # 节点 1(服务器) consul agent -server -bootstrap-expect=3 -data-dir=/opt/consul -node=server-1 -bind=192.168.1.101 -client=0.0.0.0 # 节点 2(服务器) consul agent -server -bootstrap-expect=3 -data-dir=/opt/consul -node=server-2 -bind=192.168.1.102 -client=0.0.0.0 -join=192.168.1.101 # 节点 3(服务器) consul agent -server -bootstrap-expect=3 -data-dir=/opt/consul -node=server-3 -bind=192.168.1.103 -client=0.0.0.0 -join=192.168.1.101 # -server:以服务器模式启动(参与选举和数据存储)。 # -bootstrap-expect=3:期望集群中有 3 个服务器节点。 # -data-dir:数据持久化目录。 # -bind:节点绑定的 IP(需局域网可见)。 # -join:加入已启动的节点。
备份与恢复
consul snapshot save backup.snap # 创建快照 consul snapshot restore backup.snap # 恢复快照
访问控制
生成 ACL 令牌
consul acl bootstrap # 初始化ACL(首次运行) consul acl token create -policy-name=my-policy # 创建令牌
查看令牌
consul acl token list
常用命令
注:使用时可通过consul <command> -h
查看具体命令的帮助文档,例如consul agent -h
获取代理启动的详细参数说明。
dotnet集成cunsul
服务注册
using Consul;
using Microsoft.AspNetCore.Builder;
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
var consulClient = new ConsulClient(c =>
{
c.Address = new Uri(ConfigHelper.ConsulAddress); // Consul 地址
});
var serviceName = ConfigHelper.ConsulServiceName; // 服务名称
var registration = new AgentServiceRegistration
{
ID = serviceName + "-" + ConfigHelper.ConsulServiceAddress.Replace("https://","").Replace("http://","") + "-" + ConfigHelper.ConsulServicePort, // 唯一ID
Name = serviceName, // 服务名称
Address = ConfigHelper.ConsulServiceAddress, // 服务IP(实际部署用真实IP)
Port = ConfigHelper.ConsulServicePort, // 服务端口
Check = new AgentServiceCheck
{
HTTP = $"{ConfigHelper.ConsulServiceAddress}:{ConfigHelper.ConsulServicePort}{ConfigHelper.ConsulHealthUrl}" , // 健康检查地址
Interval = TimeSpan.FromSeconds(ConfigHelper.ConsulHealthInterval), // 检查间隔
Timeout = TimeSpan.FromSeconds(ConfigHelper.ConsulHealthTimeout) // 超时时间
}
};
// 注册服务
await consulClient.Agent.ServiceRegister(registration);
// 应用停止时注销服务
app.Lifetime.ApplicationStopping.Register(async () =>
{
await consulClient.Agent.ServiceDeregister(serviceId);
});
// 健康检查接口
app.MapGet("/health", () => "Healthy");
app.Run();
获取健康实例
// 从 Consul 获取健康的服务实例
var consulClient = new ConsulClient(c => c.Address = new Uri("http://localhost:8500"));
var queryResult = await consulClient.Health.Service("web-service", null, true);
var healthyServices = queryResult.Response.Select(s => $"{s.Service.Address}:{s.Service.Port}").ToList();
// 随机选择一个实例(简单负载均衡)------------可扩展为轮询/权重/Hash等方式
var random = new Random();
var selectedService = healthyServices[random.Next(healthyServices.Count)];
Console.WriteLine($"调用服务:{selectedService}");