最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

.Net Core自定義配置源從配置中心讀取配置的方法

 更新時(shí)間:2019年03月06日 09:06:53   作者:Agile.Zhou  
這篇文章主要給大家介紹了關(guān)于.Net Core自定義配置源從配置中心讀取配置的相關(guān)資料,文中通過(guò)示例代碼以及圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

前言

配置,幾乎所有的應(yīng)用程序都離不開(kāi)它。.Net Framework時(shí)代我們使用App.config、Web.config,到了.Net Core的時(shí)代我們使用appsettings.json,這些我們?cè)偈煜げ贿^(guò)了。然而到了容器化、微服務(wù)的時(shí)代,這些本地文件配置有的時(shí)候就不太合適了。當(dāng)你把本地部署的服務(wù)搬到docker上后,你會(huì)發(fā)現(xiàn)要修改一個(gè)配置文件變的非常麻煩。你不得不通過(guò)宿主機(jī)進(jìn)入容器內(nèi)部來(lái)修改文件,也許容器內(nèi)還不帶vi等編輯工具,你連看都不能看,改都不能。更別說(shuō)當(dāng)你啟動(dòng)多個(gè)容器實(shí)例來(lái)做分布式應(yīng)用的時(shí)候,一個(gè)個(gè)去修改容器的配置,這簡(jiǎn)直要命了。

因?yàn)檫@些原因,所以“配置中心”就誕生了。配置中心是微服務(wù)的基礎(chǔ)設(shè)施,它對(duì)配置進(jìn)行集中的管理并對(duì)外暴露接口,當(dāng)應(yīng)用程序需要的時(shí)候通過(guò)接口讀取。配置通常為Key/Value模式,然后通過(guò)http接口暴露。好了,配置中心不多說(shuō)了,感覺(jué)要偏了,這次是介紹怎么自定義一個(gè)配置源從配置中心讀取配置。廢話不多說(shuō)直接上代碼吧。

模擬配置中心

我們新建一個(gè)asp.net core webapi站點(diǎn)來(lái)模擬配置中心服務(wù),端口配置到5000,并添加相應(yīng)的controller來(lái)模擬配置中心對(duì)外的接口。

  [Route("api/[controller]")]
 [ApiController]
 public class ConfigsController : ControllerBase
 {
  public List<KeyValuePair<string,string>> Get()
  {
   var configs = new List<KeyValuePair<string, string>>();
   configs.Add(new KeyValuePair<string, string>("SecretKey","1238918290381923"));
   configs.Add(new KeyValuePair<string, string>("ConnectionString", "user=123;password=123;server=."));

   return configs;
  }
 }

添加一個(gè)configscontroller,并修改Get方法,返回2個(gè)配置鍵值對(duì)。

訪問(wèn)下/api/configs看下返回是否正確

自定義配置源

從現(xiàn)在開(kāi)始我們真正開(kāi)始來(lái)定義一個(gè)自定義的配置源然后當(dāng)程序啟動(dòng)的時(shí)候從配置中心讀取配置文件信息,并提供給后面的代碼使用配置。

新建一個(gè)asp.net core mvc站點(diǎn)來(lái)模擬客戶端程序。

MyConfigProvider

 public class MyConfigProvider : ConfigurationProvider
 {
  /// <summary>
  /// 嘗試從遠(yuǎn)程配置中心讀取配置信息
  /// </summary>
  public async override void Load()
  {
   var response = "";
   try
   {
    var serverAddress = "http://localhost:5000";
    var client = new HttpClient();
    client.BaseAddress = new Uri(serverAddress);
    response = await client.GetStringAsync("/api/configs");
   }
   catch (Exception ex)
   {
    //write err log
   }

   if (string.IsNullOrEmpty(response))
   {
    throw new Exception("Can not request configs from remote config center .");
   }

   var configs = JsonConvert.DeserializeObject<List<KeyValuePair<string, string>>>(response);

   Data = new ConcurrentDictionary<string, string>();

   configs.ForEach(c =>
   {
    Data.Add(c);
   });
  }
 
 }

新建一個(gè)MyConfigProvider的類,這個(gè)類從ConfigurationProvider繼承,并重寫其中的Load方法。使用HttpClient從配置中心讀取信息后,進(jìn)行反序列化,并把配置轉(zhuǎn)換為字典。這里注意一下,雖然Data的類型為IDictionary<string,string>,但是這里實(shí)例化對(duì)象的時(shí)候使用了ConcurrentDictionary<string, string>類,因?yàn)镈ictionary<string,string>是非線程安全的,如果進(jìn)行多線程讀寫會(huì)出問(wèn)題。

MyConfigSource

 public class MyConfigSource : IConfigurationSource
 {
  public IConfigurationProvider Build(IConfigurationBuilder builder)
  {
   return new MyConfigProvider();
  }
 }

新建一個(gè)MyConfigSource的類,這個(gè)類實(shí)現(xiàn)IConfigurationSource接口,IConfigurationSource接口只有一個(gè)Build方法,返回值為IConfigurationProvider,我們剛才定義的MyConfigProvider因?yàn)槔^承自ConfigurationProvider所以已經(jīng)實(shí)現(xiàn)了IConfigurationProvider,我們直接new一個(gè)MyConfigProvider并返回。

MyConfigBuilderExt

 public static class MyConfigBuilderExt
 {
  public static IConfigurationBuilder AddMyConfig(
   this IConfigurationBuilder builder
   )
  {
   return builder.Add(new MyConfigSource());
  }
 }

給IConfigurationBuilder定義一個(gè)AddMyConfig的擴(kuò)展方法,跟.Net Core自帶的幾個(gè)配置源使用風(fēng)格保持一致。當(dāng)調(diào)用AddMyConfig的時(shí)候給IConfigurationBuilder實(shí)例添加一個(gè)MyConfigSource的源。

使用配置源

在Program中添加MyConfigSource

  public class Program
 {
  public static void Main(string[] args)
  {
   CreateWebHostBuilder(args).Build().Run();
  }

  public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
   WebHost.CreateDefaultBuilder(args)
   .ConfigureAppConfiguration((context, configBuiler) =>
   {
    configBuiler.AddMyConfig();
   })
   .UseStartup<Startup>();
 }

在ConfigureAppConfiguration的匿名委托方法中調(diào)用AddMyConfig擴(kuò)展方法,這樣程序啟動(dòng)的時(shí)候會(huì)自動(dòng)使用MyConfigSource源并從配置中心讀取配置到本地應(yīng)用程序。

修改HomeController

 public class HomeController : Controller
 {
  IConfiguration _configuration;
  public HomeController(IConfiguration configuration)
  {
   _configuration = configuration;
  }

  public IActionResult Index()
  {
   var secretKey = _configuration["SecretKey"];
   var connectionString = _configuration["ConnectionString"];

   ViewBag.SecretKey = secretKey;
   ViewBag.ConnectionString = connectionString;

   return View();
  }
  
 }

修改homecontroller,把IConfiguration通過(guò)構(gòu)造函數(shù)注入進(jìn)去,在Index Action方法中讀取配置,并賦值給ViewBag

修改Index視圖

 @{
 ViewData["Title"] = "Test my config";
}

<h3>
 SecretKey: @ViewBag.SecretKey
</h3>
<h3>
 ConnectionString: @ViewBag.ConnectionString
</h3>

修改Index視圖的代碼,把配置信息從ViewBag中讀取出來(lái)并在網(wǎng)頁(yè)上展示。

運(yùn)行一下

先運(yùn)行配置中心站點(diǎn)再運(yùn)行一下網(wǎng)站,首頁(yè)出現(xiàn)了我們?cè)谂渲弥行亩x的SecretKey跟ConnectionString信息,表示我們的程序成功的從配置中心讀取了配置信息。我們的自定義配置源已經(jīng)能夠成功運(yùn)行了。

改進(jìn)

以上配置源雖然能夠成功運(yùn)行,但是仔細(xì)看的話顯然它有2個(gè)比較大的問(wèn)題。

  • 配置中心的服務(wù)地址是寫死在類里的。我們的配置中心很有可能會(huì)修改ip或者域名,寫死在代碼里顯然不是高明之舉,所以我們還是需要保留本地配置文件,把配置中心的服務(wù)地址寫到本地配置文件中。
  • 配置中心作為微服務(wù)的基礎(chǔ)設(shè)施一旦故障會(huì)引發(fā)非常嚴(yán)重的后果,新啟動(dòng)或者重啟的客戶端會(huì)無(wú)法正常啟動(dòng)。如果我們?cè)谂渲弥行恼5臅r(shí)候冗余一份配置在本地,當(dāng)配置中心故障的時(shí)候從本地讀取配置,至少可以保證一部分客戶端程序能夠正常運(yùn)行。
{
 "Logging": {
 "LogLevel": {
  "Default": "Warning"
 }
 },
 "AllowedHosts": "*",
 "myconfigServer": "http://localhost:5000"
}

修改本地appsettings.json文件,添加myconfigServer的配置信息。

 public class MyConfigProvider : ConfigurationProvider
 {
  private string _serverAddress;
  public MyConfigProvider()
  {
   var jsonConfig = new JsonConfigurationSource();
   jsonConfig.FileProvider = new PhysicalFileProvider(Directory.GetCurrentDirectory());
   jsonConfig.Path = "appsettings.json";
   var jsonProvider = new JsonConfigurationProvider(jsonConfig);
   jsonProvider.Load();

   jsonProvider.TryGet("myconfigServer", out string serverAddress);

   if (string.IsNullOrEmpty(serverAddress))
   {
    throw new Exception("Can not find myconfigServer's address from appsettings.json");
   }

   _serverAddress = serverAddress;
  }

  /// <summary>
  /// 嘗試從遠(yuǎn)程配置中心讀取配置信息,當(dāng)成功從配置中心讀取信息的時(shí)候把配置寫到本地的myconfig.json文件中,當(dāng)配置中心無(wú)法訪問(wèn)的時(shí)候嘗試從本地文件恢復(fù)配置。
  /// </summary>
  public async override void Load()
  {
   var response = "";
   try
   {
    var client = new HttpClient();
    client.BaseAddress = new Uri(_serverAddress);
    response = await client.GetStringAsync("/api/configs");

    WriteToLocal(response);
   }
   catch (Exception ex)
   {
    //write err log
    response = ReadFromLocal();
   }

   if (string.IsNullOrEmpty(response))
   {
    throw new Exception("Can not request configs from remote config center .");
   }

   var configs = JsonConvert.DeserializeObject<List<KeyValuePair<string, string>>>(response);

   Data = new ConcurrentDictionary<string, string>();

   configs.ForEach(c =>
   {
    Data.Add(c);
   });
  }

  private void WriteToLocal(string resp)
  {
   var file = Directory.GetCurrentDirectory() + "/myconfig.json";
   File.WriteAllText(file,resp);
  }

  private string ReadFromLocal()
  {
   var file = Directory.GetCurrentDirectory() + "/myconfig.json";
   return File.ReadAllText(file);
  }
 }

修改MyConfigProvider,修改構(gòu)造函數(shù),通過(guò)JsonConfigurationProvider從本地讀取appsettings.json中的myconfigServer配置信息。新增WriteToLocal方法把配置中心返回的json數(shù)據(jù)寫到本地文件中。新增ReadFromLocal方法,從本地文件讀取json信息。

再次運(yùn)行

先運(yùn)行配置中心站點(diǎn),再運(yùn)行客戶端網(wǎng)站,可以看到配置信息展示到首頁(yè)界面上。關(guān)閉配置中心客跟客戶端網(wǎng)站,并且重啟客戶端網(wǎng)站依然能夠展示配置信息,說(shuō)明自定義配置源當(dāng)配置中心故障的時(shí)候成功從本地文件恢復(fù)了配置。圖跟上面的圖是一致的,就不貼了。

總結(jié)

通過(guò)以上我們定義了一個(gè)比較簡(jiǎn)單的自定義配置源,它能夠通過(guò)http從配置中心讀取配置,并且提供了同傳統(tǒng)json配置文件一致的使用風(fēng)格,最大程度的復(fù)用舊代碼,減少因?yàn)橐肱渲弥行亩笠?guī)模改動(dòng)代碼。我們從上面的代碼可以更清楚的知道.Net Core的配置源是如何工作的。ConfigurationSource只是ConfigurationProvider的建造器。真正完成配置加載、查找工作的是ConfigurationProvider。

以上代碼還是演示級(jí)別的代碼,還有很多改進(jìn)的空間,比如http訪問(wèn)失敗的重試,我們可以使用polly重構(gòu);比如支持定時(shí)從配置中心刷新配置等,有興趣可以自己去實(shí)踐一下。

好了,以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • .Net集成敏感詞組件的步驟

    .Net集成敏感詞組件的步驟

    現(xiàn)如今大部分服務(wù)都會(huì)有用戶輸入,為了服務(wù)的正常運(yùn)行,很多時(shí)候不得不針對(duì)輸入進(jìn)行敏感詞的檢測(cè)、替換。如果人工做這樣的工作,不僅效率低,成本也高。水弟在這里寫了一個(gè)讓小編姐姐都覺(jué)得快的敏感詞組件接入示例,不需要依賴第三方服務(wù),只需兩分鐘即可享受清爽文字。
    2021-05-05
  • 詳解ASP.NET Core WebApi 返回統(tǒng)一格式參數(shù)

    詳解ASP.NET Core WebApi 返回統(tǒng)一格式參數(shù)

    這篇文章主要介紹了詳解ASP.NET Core WebApi 返回統(tǒng)一格式參數(shù),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-11-11
  • .NET性能調(diào)優(yōu)之一:ANTS Performance Profiler的使用介紹

    .NET性能調(diào)優(yōu)之一:ANTS Performance Profiler的使用介紹

    本系列文章主要會(huì)介紹一些.NET性能調(diào)優(yōu)的工具、Web性能優(yōu)化的規(guī)則(如YSlow)及方法等等內(nèi)容。成文前最不希望看到的就是園子里不間斷的“哪個(gè)語(yǔ)言好,哪個(gè)語(yǔ)言性能高”的爭(zhēng)論,不多說(shuō),真正的明白人都應(yīng)該知道這樣的爭(zhēng)論有沒(méi)有意義,希望我們能從實(shí)際性能優(yōu)化的角度去討論問(wèn)題
    2013-01-01
  • 五步掌握OOM框架AutoMapper基本使用

    五步掌握OOM框架AutoMapper基本使用

    本文主要介紹了OOM框架AutoMapper的相關(guān)知識(shí),本篇的五個(gè)實(shí)例可以幫你解決常見(jiàn)的基本問(wèn)題。具有一定的參考價(jià)值,下面跟著小編一起來(lái)看下吧
    2017-01-01
  • asp.net 使用Silverlight操作ASPNETDB數(shù)據(jù)庫(kù)

    asp.net 使用Silverlight操作ASPNETDB數(shù)據(jù)庫(kù)

    asp.net下使用Silverlight操作ASPNETDB數(shù)據(jù)庫(kù)的實(shí)現(xiàn)代碼
    2010-01-01
  • ASP.NET MVC:Filter和Action的執(zhí)行介紹

    ASP.NET MVC:Filter和Action的執(zhí)行介紹

    ASP.NET MVC之Filter和Action的執(zhí)行介紹,需要的朋友可以參考
    2012-11-11
  • 在vs2008中使用AJAX開(kāi)發(fā).net 2.0下的Web程序的方法

    在vs2008中使用AJAX開(kāi)發(fā).net 2.0下的Web程序的方法

    最近做項(xiàng)目需要用到AJAX,但是工作需要必須使用.net 2.0版本;但發(fā)現(xiàn)如果項(xiàng)目為.net2.0版本則沒(méi)有Ajax(web.config已經(jīng)配置上ajax) ,、工具欄中并不出現(xiàn)Ajax選項(xiàng)卡. 而且新建頁(yè)面也沒(méi)有AJAX頁(yè)面;后來(lái)查了很多資料 發(fā)現(xiàn)了一種解決方法
    2011-06-06
  • Winform OpenFileDialog打開(kāi)文件對(duì)話框

    Winform OpenFileDialog打開(kāi)文件對(duì)話框

    這篇文章主要為大家詳細(xì)介紹了Winform OpenFileDialog打開(kāi)文件對(duì)話框 的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • 提取HTML代碼中文字的C#函數(shù)

    提取HTML代碼中文字的C#函數(shù)

    提取HTML代碼中文字的C#函數(shù)...
    2006-09-09
  • 打造自己的.NET Core項(xiàng)目模板

    打造自己的.NET Core項(xiàng)目模板

    這篇文章主要介紹了打造自己的.NET Core項(xiàng)目模板,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04

最新評(píng)論

仪征市| 宣武区| 买车| 肇源县| 万盛区| 文水县| 新兴县| 永平县| 祥云县| 五峰| 柳林县| 庆云县| 奉新县| 益阳市| 平阴县| 湖南省| 冷水江市| 普安县| 渭南市| 开封市| 贵溪市| 买车| 枣阳市| 渭源县| 邵东县| 改则县| 馆陶县| 辽阳县| 洛南县| 哈尔滨市| 廉江市| 石泉县| 达拉特旗| 宜丰县| 马公市| 习水县| 会昌县| 沙河市| 航空| 南京市| 凤阳县|