Skip to content

Etcd 配置源

Etcd 是一个分布式键值存储系统,常用于服务发现和配置管理。

安装

bash
dotnet add package Apq.Cfg.Etcd

快速开始

csharp
using Apq.Cfg;
using Apq.Cfg.Etcd;

var cfg = new CfgBuilder()
    .AddJson("config.json", level: 0, writeable: false)
    .AddEtcd(options =>
    {
        options.Endpoints = new[] { "localhost:2379" };
        options.KeyPrefix = "/app/config/";
        options.EnableHotReload = true;
    }, level: 10)
    .Build();

// 读取配置
var value = cfg.Get("Database:Host");

// 订阅配置变更
cfg.ConfigChanges.Subscribe(e =>
{
    foreach (var (key, change) in e.Changes)
    {
        Console.WriteLine($"配置变更: {key} = {change.NewValue}");
    }
});

配置选项

选项类型默认值说明
Endpointsstring[]["localhost:2379"]Etcd 服务端点列表
Usernamestring?null用户名(可选)
Passwordstring?null密码(可选)
CaCertPathstring?nullCA 证书路径(用于 TLS)
ClientCertPathstring?null客户端证书路径(用于 mTLS)
ClientKeyPathstring?null客户端私钥路径(用于 mTLS)
KeyPrefixstring/config/KV 键前缀
EnableHotReloadbooltrue是否启用热重载
ConnectTimeoutTimeSpan10 秒连接超时时间
ReconnectIntervalTimeSpan5 秒重连间隔
DataFormatEtcdDataFormatKeyValue配置数据格式
SingleKeystring?null当 DataFormat 为 Json 时的单个 key

数据格式

KeyValue 模式(默认)

每个 Etcd KV 键对应一个配置项:

/config/Database/Host = "localhost"
/config/Database/Port = "5432"
/config/App/Name = "MyApp"
csharp
.AddEtcd(options =>
{
    options.KeyPrefix = "/config/";
    options.DataFormat = EtcdDataFormat.KeyValue;
})

JSON 模式

单个 key 存储 JSON 格式的配置:

/config/app-config = {"Database":{"Host":"localhost","Port":5432}}
csharp
.AddEtcd(options =>
{
    options.KeyPrefix = "/config/";
    options.DataFormat = EtcdDataFormat.Json;
    options.SingleKey = "app-config";
})

热重载

启用 EnableHotReload 后,配置源会使用 Etcd 的 Watch API 监听配置变更:

csharp
.AddEtcd(options =>
{
    options.EnableHotReload = true;
})

认证

用户名/密码认证

csharp
.AddEtcd(options =>
{
    options.Endpoints = new[] { "localhost:2379" };
    options.Username = "root";
    options.Password = "your-password";
})

TLS 认证

csharp
.AddEtcd(options =>
{
    options.Endpoints = new[] { "localhost:2379" };
    options.CaCertPath = "/path/to/ca.crt";
})

mTLS 认证

csharp
.AddEtcd(options =>
{
    options.Endpoints = new[] { "localhost:2379" };
    options.CaCertPath = "/path/to/ca.crt";
    options.ClientCertPath = "/path/to/client.crt";
    options.ClientKeyPath = "/path/to/client.key";
})

多端点高可用

支持配置多个 Etcd 端点实现高可用:

csharp
.AddEtcd(options =>
{
    options.Endpoints = new[]
    {
        "etcd1:2379",
        "etcd2:2379",
        "etcd3:2379"
    };
})

多层级配置

Etcd 配置源可以与其他配置源组合使用:

csharp
var cfg = new CfgBuilder()
    .AddJson("config.json", level: 0, writeable: false)           // 基础配置
    .AddJson("config.local.json", level: 1, writeable: false)     // 本地覆盖
    .AddEtcd(options =>                                            // Etcd 远程配置(最高优先级)
    {
        options.Endpoints = new[] { "etcd:2379" };
        options.KeyPrefix = "/myapp/";
    }, level: 10)
    .Build();

依赖

下一步

基于 MIT 许可发布