卡利充值:.Net Core Configuration Etcd数据源

admin 3周前 (11-04) 科技 380 8

前言

    .Net Core为我们提供了一套壮大的Configuration设置系统,使用简朴扩展性强。通过这套设置系统我们可以将Json、Xml、Ini等数据源加载到程序中,也可以自己扩展其他形式的存储源。今天我们要做的就是通过自界说的方式为其扩展Etcd数据源操作。

作甚Etdc

    在使用etcd之前我们先先容一下Etcd,我信赖许多同砚都早有耳闻。Etcd是一款高可用、强一致的分布式KV存储系统,它内部接纳raft协议作为一致性算法,自己也是基于GO语言开发的,最新版本为v3.4.9,详细版本下载地址可参阅官方GitHub地址。信赖领会过K8S的同砚对这个一定不生疏,它是K8S的数据治理系统。官方地址为https://etcd.io/。
    在此之前,我信赖人人已经领会过许多存储系统了,Etcd到底能实现了什么功效呢?其一用于设置中央和服务发现,再者也可以实现分布式锁和新闻系统。它自己就是基于目录型存储,而且内部有一套壮大的Watch机制可以监听针对节点和数据的操作转变,每次对节点的事务操作都市有对于的版本信息。

Etcd VS Zookeeper

通过上面的先容是不是感受和Zookeeper有点类似呢,网上有许多许多关于Etcd和Zookeeper的对比文章,大致如下可以获得以下结论

功效 Etcd Zookeeper
分布式锁 有(接纳节点版本号信息) 有(接纳暂且节点和顺序暂且节点)
watcher
一致性算法 raft zab
选举
元数据(metadata)存储
应用场景 Etcd Zookeeper
公布与订阅(设置中央) 有(不限次Watch) 有(一次性触发的,需要重新注册Watch)
软负载平衡
命名服务(Naming Service)
服务发现 有(基于租约节点) 有(基于暂且节点)
分布式通知/协调
集群治理与Master选举
分布式锁
分布式行列
说白了就是Zookeeper醒目的活,Etcd也醒目。那既然有了Zookeeper为啥还要选择Etcd,主要基于以下缘故原由
  • 更轻量级(Etcd基于GO语言开发,Zookeeper基于Java开发)、更易用(开箱即用)
  • 高负载下的稳固读写
  • 数据模型的多版本并发控制
  • 稳固的watcher功效,通知订阅者监听值的转变(Zookeeper基于数据的监听是一次性的,每次监听完成还需重新注册)
  • 客户端协议使用GRPC协议,支持语言更普遍
一言以蔽之,就是不仅实现了Zookeeper的功效,还在许多方面吊打Zookeeper,这么壮大的器械忍不住都要试一试。

在.Net Core中使用Etcd

    在Nuget上可以搜索到许多.Net Core的Etcd客户端驱动程序,我使用了下载量最多的一个名字叫dotnet-etcd的驱动包,顺便找到了它在GayHub上,不好意思手滑打错了GitHub上的项目地址,也许学习了一下基本的使用方式。实在我们连系Configuration设置这一块,只需要两个功效。一个是Get获取数据,另一个是Watch节点转变(更新数据会用到)。个人认为,前期有目有界限的学习照样异常总要的。

Configuration扩展Etcd

前面我们讲到过自界说扩展Configuration是异常利便的,信赖领会过Configuration相关源码的小伙伴们已经异常熟悉了,大致总结一下分为三步:

  • 编写IConfigurationBuilder扩展方式,我们这里叫AddEtcd
  • 编写实现IConfigurationSource的设置源信息类,我们这里叫EtcdConfigurationSource
  • 编写继续自ConfigurationProvider的ConfigurationSource的设置数据提供类,我们这里叫EtcdConfigurationProvider
由于微软已经给我们提供了一部分便利,以是编写起来照样异常的简朴的。好了,接下来我们最先编写详细的实现代码,重点的地方我会在代码中注释说明。
首先是界说扩展类EtcdConfigurationExtensions,这个类是针对IConfigurationBuilder的扩展方式,实现如下
public static class EtcdConfigurationExtensions
{
    /// <summary>
    /// AddEtcd扩展方式
    /// </summary>
    /// <param name="serverAddress">Etcd地址</param>
    /// <param name="path">读取路径</param>
    /// <returns></returns>
    public static IConfigurationBuilder AddEtcd(this IConfigurationBuilder builder, string serverAddress,string path)
    {
        return AddEtcd(builder, serverAddress:serverAddress, path: path,reloadOnChange: false);
    }

    /// <summary>
    /// AddEtcd扩展方式
    /// </summary>
    /// <param name="serverAddress">Etcd地址</param>
    /// <param name="path">读取路径</param>
    /// <param name="reloadOnChange">若是数据发送改变是否刷新</param>
    /// <returns></returns>
    public static IConfigurationBuilder AddEtcd(this IConfigurationBuilder builder, string serverAddress, string path, bool reloadOnChange)
    {
        return AddEtcd(builder,options => {
            options.Address = serverAddress;
            options.Path = path;
            options.ReloadOnChange = reloadOnChange;
        });
    }

    public static IConfigurationBuilder AddEtcd(this IConfigurationBuilder builder, Action<EtcdOptions> options)
    {
        EtcdOptions etcdOptions = new EtcdOptions();
        options.Invoke(etcdOptions);
        return builder.Add(new EtcdConfigurationSource { EtcdOptions = etcdOptions });
    }
}

这里我还界说了一个EtcdOptions的POCO,用于承载读取Etcd的设置属性

public class EtcdOptions
{
    /// <summary>
    /// Etcd地址
    /// </summary>
    public string Address { get; set; }

    /// <summary>
    /// Etcd接见用户名
    /// </summary>
    public string UserName { get; set; }

    /// <summary>
    /// Etcd接见密码
    /// </summary>
    public string PassWord { get; set; }

    /// <summary>
    /// Etcd读取路径
    /// </summary>
    public string Path { get; set; }

    /// <summary>
    /// 数据调换是否刷新读取
    /// </summary>
    public bool ReloadOnChange { get; set; }
}

接下来我们界说EtcdConfigurationSource,这个类异常简朴就是返回一个设置提供工具

public class EtcdConfigurationSource : IConfigurationSource
{
    public EtcdOptions EtcdOptions { get; set; }

    public IConfigurationProvider Build(IConfigurationBuilder builder)
    {
        return new EtcdConfigurationProvider(EtcdOptions);
    }
}

真正的读取操作都在EtcdConfigurationProvider里

public class EtcdConfigurationProvider : ConfigurationProvider
{
    private readonly string _path;
    private readonly bool _reloadOnChange;
    private readonly EtcdClient _etcdClient;

    public EtcdConfigurationProvider(EtcdOptions options)
    {
        //实例化EtcdClient
        _etcdClient = new EtcdClient(options.Address,username: options.UserName,password: options.PassWord);
        _path = options.Path;
        _reloadOnChange = options.ReloadOnChange;
    }

    /// <summary>
    /// 重写加载方式
    /// </summary>
    public override void Load()
    {
        //读取数据
        LoadData();
        //数据发生转变是否重新加载
        if (_reloadOnChange)
        {
            ReloadData();
        }
    }

    private void LoadData()
    {
        //读取Etcd里的数据
        string result = _etcdClient.GetValAsync(_path).GetAwaiter().GetResult();
        if (string.IsNullOrEmpty(result))
        {
            return;
        }
        //转换一下数据结构,这里我使用的是json花样
        //读取的数据只要赋值到Data属性上即可,IConfiguration真正读取的数据就是存储到Data的字典数据
        Data = ConvertData(result);
    }

    private IDictionary<string,string> ConvertData(string result)
    {
        byte[] array = Encoding.UTF8.GetBytes(result);
        MemoryStream stream = new MemoryStream(array);
        //JsonConfigurationFileParser是将json数据转换为Configuration可读取的结构(复制JsonConfiguration类库里的)
        return JsonConfigurationFileParser.Parse(stream);
    }

    private void ReloadData()
    {
        WatchRequest request = new WatchRequest()
        {
            CreateRequest = new WatchCreateRequest()
            {
                //需要转换一个花样,由于etcd v3版本的接口都包含在grpc的界说中
                Key = ByteString.CopyFromUtf8(_path)
            }
        };
        //监听Etcd节点转变,获取调换数据,更新设置
        _etcdClient.Watch(request, rsp =>
        {
            if (rsp.Events.Any())
            {
                var @event = rsp.Events[0];
                //需要转换一个花样,由于etcd v3版本的接口都包含在grpc的界说中
                Data = ConvertData(@event.Kv.Value.ToStringUtf8());
                //需要挪用ConfigurationProvider的OnReload方式触发ConfigurationReloadToken通知
                //这样才能对使用Configuration的类发送数据调换通知
                //好比IOptionsMonitor就是通过ConfigurationReloadToken通知调换数据的
                OnReload();
            }
        });
    }
}

使用方式如下

builder.AddEtcd("http://127.0.0.1:2379", "service/mydemo", true);

顺便给人人推荐一个Etcd可视化治理工具ETCD Manager,以便更好的学习Etcd。
到这里,基本上就竣事了,是不是异常简朴。主要照样Configuration自己的设计思绪对照清晰,以是实现起来也不费劲。

总结

    以上代码都已经上传了我的GitHub,该堆栈还扩展了其他数据源的读取好比Consul、Properties文件、Yaml文件的读取,实现思绪也都大致相似,有兴趣的同砚可以自行查阅。由于主要是解说实现思绪,可能许多细节并未做处置还望见谅。若是有疑问或者更好的建议,迎接谈论区交流指导。

,

www.allbetgaming.net

欢迎进入欧博平台网站(www.aLLbetgame.us),www.aLLbetgame.us开放欧博平台网址、欧博注册、欧博APP下载、欧博客户端下载、欧博游戏等业务。

allbet声明:该文看法仅代表作者自己,与本平台无关。转载请注明:卡利充值:.Net Core Configuration Etcd数据源

网友评论

  • (*)

最新评论

  • 欧博ALLBET网址 2020-12-31 00:05:18 回复

    欧博开户www.allbetgame.us欢迎进入欧博开户平台(Allbet Game),欧博开户平台开放欧博会员开户、欧博代理开户、欧博电脑客户端下载、欧博手机版下载等业务。一气呵成看完

    1
    • 联博接口 2021-01-18 18:36:21 回复

      @欧博ALLBET网址 电银付APP下载(9cx.net)是官方网上推广平台。在线自动销售电银付激活码、电银付POS机。提供电银付安装教程、电银付使用教程、电银付APP使用教程、电银付APP安装教程、电银付APP下载等技术支持。面对全国推广电银付加盟、电银付大盟主、电银付小盟主业务。真实,希望继续更

    • @欧博ALLBET网址 【明报专讯】近期股市受压,上市公司私有化流动陆续有来。高盛揭晓讲述称,自吴光正家族提出将会德丰(0020)私有化以来,不时有投资者询问,另有那些股份具潜在私有化价值。该行估量,尖沙咀置业(0247)及信和置业(0083)、恒隆团体(0010)及恒隆地产(0101),以及文华东方,均具备私有化条件。高盛更指出,按会德丰获私有化的情形,归纳出的主要特征是,大股东持股逾55%、被私有化者净欠债少于10%、私有化后可简化架构、大股东已往两年增持被私有化的公司逾1%,加上股价显示差过全球金融危机时,便有潜力被私有化。潜水党冒泡,不错

  • 【明报专讯】歌手陈慧敏今年9月展开「100天旅程」挑战,独自到巴基斯坦、印度、伊朗及埃及等地旅游,在开罗更被非礼,遭当地一名男子以按摩为由强解胸围扣,幸好及时脱险;她辗转到土现已加入我的最爱

    2
    • @收购usdt(www.usdt8.vip) 记者李玟仪/综合报导大陆女星杨幂拥有前凸后翘好身材,亮丽的外型加上D罩杯魔鬼身材,穿着打扮成为时下年轻人模仿的对象。只不过自从7月被民众拍到一张体态不佳的照片后,她时不时被同事让我来的

      • @aLLbet(www.aLLbetgame.us) While the fatwa issued by Ayatollah Ruhollah Khomeini over Rushdie’s novel “The Satanic Verses” has for some time not been part of daily discourse in Iran, the clerical leadership under his successor Ayatollah Ali Khamenei also did nothing to indicate it no longer stood and on occasions underlined the decree was still valid.强烈推荐!贼好看

  • 发言人又指,香港的对外电讯市场生长蓬勃,现时共营运11个对外海底通讯光缆系统、20条陆上光缆和11个通讯卫星毗邻世界各地。香港已装备的容量达每秒89.6太比特(Tbps),只占总设计容量的一小部分(约11%),预计现时和筹建中的对外电讯容量足以应付香港中长期的需求。 成为你的粉丝了

    3
  • 菜宝钱包(caibao.it)是使用TRC-20协议的Usdt第三方支付平台,Usdt收款平台、Usdt自动充提平台、usdt跑分平台。免费提供入金通道、Usdt钱包支付接口、Usdt自动充值接口、Usdt无需实名寄售回收。菜宝Usdt钱包一键生成Usdt钱包、一键调用API接口、一键无实名出售Usdt。有想法呀

    4

文章归档

    站点信息

    • 文章总数:10108
    • 页面总数:0
    • 分类总数:8
    • 标签总数:2344
    • 评论总数:6843
    • 浏览总数:714768