.net core3.1微服务配置文件可视化集中管理 - 第三章(完结篇)

前言

上一期**微服务配置文件可视化集中管理 - 第二章已经实现了.net core项目配置信息热更新**,接下来将解决:若配置中心挂了,怎么进行容错,不能因为配置中心宕机,而造成所有的应用站点不能正常工作.


解决方案:在每个应用站点下,都冗余一份最新的Json配置文件.若配置中心宕机,应用站点启动时,就加载本地冗余的Json配置文件.
**注意:**若配置中心有配置的更改,在热更新时,也同样要更新冗余的Json配置文件,时刻保持着最新的一份Json配置文件.


详细实现如下,所示:

一、解决方案时序图.

在这里插入图片描述

二、重写Load()函数时,保存最新的配置文件到应有站点根目录.

看过前两章的朋友,应该知道,我们从配置中心拉取信息,是自己写了一个配置文件提供器,继承了ConfigurationProvider类,并且重写了Load()函数.

我们就是在Load()函数里,调用远程配置中心拉取的配置信息.通用,我们代码改造就在这个Load()函数里.

在这里面更改的点是:
1.调用远程配置中心,若成功,需要保存,配置信息到根目录,文件名为:appsettings.temp.json.

**目的:**解决配置中心挂了,怎么进行容错,不能因为配置中心宕机,而造成所有的应用站点不能正常工作.

代码如下:

  /// <summary>
    /// 继承ConfigurationProvider类,重写Load()函数
    /// </summary>
    public class  MsydtConfigProvider : ConfigurationProvider
    {
        /// <summary>
        /// 重写Load()函数远程配置中心读取配置信息
        /// </summary>
        public override async void Load()
        {
                var serverAddress = "http://localhost:41004";
                var client = new HttpClient();
                client.BaseAddress = new Uri(serverAddress);
                var response = await client.GetStringAsync("/api/configs?key=mianshiyidiantong&dev=DEBUG");
                this.Data = JsonConfigurationFileParser.Parse(response);
                //生成本地Json文件
                var appsettingsJsonPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "appsettings.temp.json");
                await File.WriteAllTextAsync(appsettingsJsonPath,response);
            }
            catch (Exception ex)
            {
            
            }
        }
    }

三、Load()函数拉取配置中心配置发生异常时,就加载站点下冗余的Json配置文件.

1.调用远程配置中心,若失败,就改为从,本地根目录,加载最新的的配置文件appsettings.temp.json

我们在Load()函数里,添加try{}catch (),并且在catch ,去加载本地冗余的最新的json配置文件.代码如下所示:

 /// <summary>
    /// 继承ConfigurationProvider类,重写Load()函数
    /// </summary>
    public class  MsydtConfigProvider : ConfigurationProvider
    {
        /// <summary>
        /// 重写Load()函数远程配置中心读取配置信息
        /// </summary>
        public override async void Load()
        {
                var serverAddress = "http://localhost:41004";
                var client = new HttpClient();
                client.BaseAddress = new Uri(serverAddress);
                var response = await client.GetStringAsync("/api/configs?key=mianshiyidiantong&dev=DEBUG");
                this.Data = JsonConfigurationFileParser.Parse(response);
                //生成本地Json文件
                var appsettingsJsonPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "appsettings.temp.json");
                await File.WriteAllTextAsync(appsettingsJsonPath,response);
            }
            catch (Exception ex)
            {
                //配置中心发生异常,记录日志,并读取本地持久化的配置文件
                var filePath =Path.Combine(AppDomain.CurrentDomain.BaseDirectory,"appsettings.temp.json");
                using (var stream = File.Open(filePath, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite))
                {
                    var bytes = new byte[stream.Length];
                    stream.Read(bytes, 0, bytes.Length);
                    var json = Encoding.UTF8.GetString(bytes, 0, bytes.Length);
                    this.Data = JsonConfigurationFileParser.Parse(json);
                    stream.Close();
                }
            }
        }
    }

四、优化思考.

  1. 安全问题:尽量我们的配置中心,不要开放外网IP,局限于内网调用.
  2. 安全问题:配置中心站点发布为https访问协议,应用站点调用采用https调用.
  3. 安全问题:应用站点生成的本地配置文件,采用加密方式后在写入appsettings.temp.json,加载的时候,在解析出来.目的就是防止,文件不小心泄露.
  4. 因为应用站点的配置器,采用自己的实现方式来加载.不可能每个应用站点都去copy代码.我们可以,将这个配置信息提供器,自定义实现的代码,封装到一个dll,并且上传Nuget,以后的应用站点,只需在Nuget上下载后,在Program中注入就行.如下图所示:
    在这里插入图片描述
    不知道怎么将这个自定义的配置信息提供器,封装为dll,上传Nuget的朋友.可以在下方留言,或者看文章,浏览量,若浏览量大,我会专门做一期,怎么将这个代码,上传Nuget,供业务站点,方便的植入配置文件可视化集中管理.

五、总结

有了这个配置文件可视化集中管理系统,我们就结合前端开发人员,将配置信息,可视化.这样一来,我们管理,上百,上千应用站点的配置信息,就如探囊取物,积极方便.

你也不用去考虑性能问题,因为这个配置信息,并不是无时无刻在远程调用.

什么意思呢?

打个比方:我们应用站点有1000台,这1000台的配置信息,我们已经维护在了配置系统.他们同时启动的话,才1000个并发,而且一旦启动成功,就再也不会请求配置系统了(除非配置系统,配置信息更改,主动触发热更新),以后应用站点,用配置信息,都是在IConfiguration下管理起来了,是放在各自应用的运行时缓存里了,所以不必关系性能的问题.

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值