.Net Core自定义配置源从配置中心读取配置的方法(2)

在ConfigureAppConfiguration的匿名委托方法中调用AddMyConfig扩展方法,这样程序启动的时候会自动使用MyConfigSource源并从配置中心读取配置到本地应用程序。

修改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通过构造函数注入进去,在Index Action方法中读取配置,并赋值给ViewBag

修改Index视图

@{ ViewData["Title"] = "Test my config"; } <h3> SecretKey: @ViewBag.SecretKey </h3> <h3> ConnectionString: @ViewBag.ConnectionString </h3>

修改Index视图的代码,把配置信息从ViewBag中读取出来并在网页上展示。

运行一下

.Net Core自定义配置源从配置中心读取配置的方法

先运行配置中心站点再运行一下网站,首页出现了我们在配置中心定义的SecretKey跟ConnectionString信息,表示我们的程序成功的从配置中心读取了配置信息。我们的自定义配置源已经能够成功运行了。

改进

以上配置源虽然能够成功运行,但是仔细看的话显然它有2个比较大的问题。

配置中心的服务地址是写死在类里的。我们的配置中心很有可能会修改ip或者域名,写死在代码里显然不是高明之举,所以我们还是需要保留本地配置文件,把配置中心的服务地址写到本地配置文件中。

配置中心作为微服务的基础设施一旦故障会引发非常严重的后果,新启动或者重启的客户端会无法正常启动。如果我们在配置中心正常的时候冗余一份配置在本地,当配置中心故障的时候从本地读取配置,至少可以保证一部分客户端程序能够正常运行。

{ "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> /// 尝试从远程配置中心读取配置信息,当成功从配置中心读取信息的时候把配置写到本地的myconfig.json文件中,当配置中心无法访问的时候尝试从本地文件恢复配置。 /// </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,修改构造函数,通过JsonConfigurationProvider从本地读取appsettings.json中的myconfigServer配置信息。新增WriteToLocal方法把配置中心返回的json数据写到本地文件中。新增ReadFromLocal方法,从本地文件读取json信息。

再次运行

先运行配置中心站点,再运行客户端网站,可以看到配置信息展示到首页界面上。关闭配置中心客跟客户端网站,并且重启客户端网站依然能够展示配置信息,说明自定义配置源当配置中心故障的时候成功从本地文件恢复了配置。图跟上面的图是一致的,就不贴了。

总结

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wdsgpd.html