日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

.Net Core Configuration Etcd数据源

發布時間:2023/12/4 asp.net 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 .Net Core Configuration Etcd数据源 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

??? .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的對比文章,大致如下可以得到以下結論

功能EtcdZookeeper
分布式鎖有(采用節點版本號信息)有(采用臨時節點和順序臨時節點)
watcher
一致性算法raftzab
選舉
元數據(metadata)存儲
應用場景EtcdZookeeper
發布與訂閱(配置中心)有(不限次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文件的讀取,實現思路也都大致相似,有興趣的同學可以自行查閱。由于主要是講解實現思路,可能許多細節并未做處理還望見諒。如果有疑問或者更好的建議,歡迎評論區交流指導。

總結

以上是生活随笔為你收集整理的.Net Core Configuration Etcd数据源的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。