Administrator
发布于 2025-08-08 / 8 阅读
0
0

consul教程

官网: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 常用的命令,涵盖了服务注册、发现、配置管理等核心功能:

基础操作

  1. 启动 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
  2. 查看代理状态

    consul members          # 查看集群成员
    consul info             # 查看代理详细信息
    consul operator raft list-peers  # 查看Raft集群状态
  3. 停止代理

    consul leave            # 优雅退出(通知集群)

服务管理

  1. 注册服务(命令行方式)

    consul services register -name=web -address=127.0.0.1 -port=8080
  2. 通过配置文件注册服务

    # 创建配置文件(如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"  // 超时时间
        }
      }
    }
  3. 通过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"
      }
    }'
  4. 查询服务

    consul services list             # 列出所有服务
    consul catalog service web       # 查看web服务详情
    consul health check for service web  # 查看服务健康检查
    ​
    # 查看指定服务的健康实例
    curl http://localhost:8500/v1/health/service/web-service?passing
  5. 注销服务

    consul services deregister -id=web-1

健康检查

  1. 添加健康检查

    consul checks register -name=web-check -service=web -http=http://localhost:8080/health -interval=10s
  2. 查看检查状态

    consul catalog checks           # 列出所有检查
    consul health checks web        # 查看指定服务的检查

KV 存储(配置管理)

  1. 基本操作

    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秒,若期间有变化则立即返回
  2. 批量操作

    consul kv get -recurse config/       # 递归查询
    consul kv put -flags=42 config/version 1.0  # 带版本标记
  3. 分布式锁

    # 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

配置与集群

  1. 重新加载配置

    consul reload           # 重新加载配置文件
  2. 加入集群

    # 新节点加入已有集群
    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:加入已启动的节点。
  3. 备份与恢复

    consul snapshot save backup.snap    # 创建快照
    consul snapshot restore backup.snap # 恢复快照

访问控制

  1. 生成 ACL 令牌

    consul acl bootstrap                 # 初始化ACL(首次运行)
    consul acl token create -policy-name=my-policy  # 创建令牌
  2. 查看令牌

    consul acl token list

常用命令

consul members

查看集群节点列表

consul info

查看节点详细信息

consul kv put <key> <value>

存储键值对

consul kv get <key>

获取键值对

consul kv delete <key>

删除键值对

consul leave

优雅退出节点

注:使用时可通过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}");



评论