系统简介

最近做了一个.Net配置中心,本质就是将原本放在各个站点下AppSettings中的配置统一管理,可以实现一次更改,自动更新,这里提供了两个版本, 一个是心跳版,一个是zookeeper版。 
 

问题及解决思路:

对于.net系统过来说,配置一般都是保存到Web.Config/App.Config中的Appsettings下的,这种方法在系统较少,或者配置不经常发生变更的时候,还是非常有效的,但随着业务的发展,会出现下面两种情况:
   1.为了性能和高可用性,部署多套系统。
   2. 节点的值会发生改变,比如对于某些业务要举行的活动,要在某个时间点开启,又要在某个时间点结束。需要修改开关的值。
以上两个问题,通过手动修改配置的方式已经不现实了, 容易出错,并且运维也不会让你这么做。那变通的解决方法就是把容易变更的配置节点放入到数据库中,由后台维护,但是程序每次都要从数据库中读取,对数据库也是一种压力,而且也会损耗性能。
因此引出配置中心,配置中心就是将有可能变动的配置数据集中管理,当配置数据发生变更的时候,可以自动更新到各个站点去。 这里有几个要注意的地方:
  1. 配置数据管理 对于配置数据管理,这个不难,就是将容易变化的值存入到数据库或其他存储中,
  2. 配置数据变更 当发生变更的时候,更新到各个站点去,这里有几种解决方案:
      1. 客户端和服务端建立长连接,当服务端的值有变更的时候,及时推送到客户端。
          缺点:需要维护长连接以及心跳检测,并且如果服务端有多个,如何找到客户端对应的长连接也是一件麻烦事。
      2. 借用一些第三方软件,比如zookeeper,或者redis的发布订阅。
      3. 客户端心跳检测,当发现数据有变更的时候,拉取最新数据。
          缺点:数据不能很及时。
  3. 客户端数据保存 当解决了数据推送的问题,客户端可以获取到最新的值,接下来就是客户端如何存储的问题, 
      1. 保存到内存中。 缺点:重启后数据就没有了,而且如果在 启动的时候,配置中心站点还未启动,那相应的站点因为拉不到数据也没有办法启动。 
      2. 保存到临时文件中,这种方法暂时没有什么缺点,当应用启动的时候,首先去拉取最新的值,如果拉不到,就从临时文件中恢复。
      3. 直接存储到web.confgi/App.config的AppSettings 中,和第二条类似,只是临时文件直接就是config文件。 
 
综合以上:本系统对于数据的更新采用第三种方法:即客户端心跳检测更新,如果有更新,则拉取最新的数据。
                 对于数据的保存则使用第三种方法,即直接保存到AppSetting中。
                 最后appsetting节点是在web.config文件中的,如果直接修改appsetting,那会导致站点重启,这里直接是通过configSource属性,将appsetting放在其他文件夹下,解决站点重启问题,又通过刷新解决配置节点生效问题。
 

开发简介

开发语言:C#
数据库:Sql Server 2012
适用于.net 项目
github地址 :https://github.com/zhaoyb/ConfigCenter/
 
整体思路
配置中心是按照App进行划分的,一个App对应于一个业务站点,同时每个App都有一个版本号,一个App下面有多个配置,每个配置都是简单的K-V结构,当App下面的配置发生变更的时候,会变更App的版本号。
客户端通过定时检测的方式,对比本地版本号和远程版本号,如果不一致,则会拉取最新数据,增量更新本地的appSetting文件,并刷新,之后本地代码通过ConfigurationManager.AppSettings["XX"]读取到的就是最新配置了。
 
 
优势和缺点
缺点: 配置数据没有办法做到实时更新,客户端是10秒钟一次心跳检测, 如果检测到有变化,则更新客户端。 
           仅支持AppSetting的配置方式,不支持对象方式的配置(在一些配置系统中,可以通过对象的方式进行配置,在获取配置的时候,也是以对象的方式获取,比AppSetting要方便很多)。
优点: 站点无需做任何变更,之前是通过AppSetting读取的数据,现在还是通过AppSetting读取数据。
            数据是保存到AppSetting中的。如果以后不想使用配置中心了,直接把相应DLL删除就可以了。
            因为数据是保存在AppSetting中的,所以如果配置中心异常,站点依然是可以启动并运行的。
            客户端和服务端都的是http协议,协议简单,可以跨多个客户端。 
 

思考:

但凡说到配置系统,大家似乎都会说到Zookeeper,但是如果你仔细研究过zookeeper,你一定会对zookeeper的watch机制感到诧异。 它并不像我们想象的那样,一次订阅,即可获取之后所有的更新,而是需要你反复的注册的,目前Java的客户端Curator可以简化这个操作。 但是.net的客户端却没有解决。 
因为对zookeeper有过一点肤浅的研究,所以后续也会提供一个zookeeper版的配置中心。

.Net配置中心-简介的更多相关文章

  1. SpringCloud系列之分布式配置中心极速入门与实践

    SpringCloud系列之分布式配置中心极速入门与实践 @ 目录 1.分布式配置中心简介 2.什么是SpringCloud Config? 3.例子实验环境准备 4.Config Server代码实 ...

  2. 配置中心之Nacos简介,使用及Go简单集成

    简介 为什么需要配置中心 ​ 我们现在有一个项目, 使用Gin进行开发的, 配置文件我们知道是一个config.yaml的文件, 也知道这个配置文件在项目启动时会被加载到内存中使用; 考虑三种情况: ...

  3. Consul-template的简单应用:配置中心,服务发现与健康监测

    简介 Consul-template是Consul的一个方扩展工具,通过监听Consul中的数据可以动态修改一些配置文件,大家比较热衷于应用在Nginx,HAProxy上动态配置健康状态下的客户端反向 ...

  4. .Net配置中心-Zookeper版

    简介    zookeeper的基本概念和作用这里不做介绍,现在很多的公司都在使用它,说起它的作用,可能最先想到的是配置中心,可以将配置项作为一个node存储在zookeeper中,其他应用可以“关注 ...

  5. Spring Cloud之——Config(配置中心)

    Spring Cloud Config(配置中心) 大家好,有一段时间没有写技术博客了.由于工作上的事情,这方面很难分配时间.近几年随着服务化的兴起,一批服务化的框架应运而生,像dubbo,thrif ...

  6. Spring Cloud 入门教程 - 搭建配置中心服务

    简介 Spring Cloud 提供了一个部署微服务的平台,包括了微服务中常见的组件:配置中心服务, API网关,断路器,服务注册与发现,分布式追溯,OAuth2,消费者驱动合约等.我们不必先知道每个 ...

  7. Spring Cloud Config 分布式配置中心使用教程

    一.简介 在分布式系统中,由于服务数量巨多,为了方便服务配置文件统一管理,实时更新,所以需要分布式配置中心组件.在Spring Cloud中,有分布式配置中心组件spring cloud config ...

  8. Spring Cloud Alibaba基础教程:使用Nacos作为配置中心

    通过本教程的前两篇: <Spring Cloud Alibaba基础教程:使用Nacos实现服务注册与发现> <Spring Cloud Alibaba基础教程:支持的几种服务消费方 ...

  9. 基于winserver的Apollo配置中心分布式&集群部署实践(正确部署姿势)

    基于winserver的Apollo配置中心分布式&集群部署实践(正确部署姿势)   前言 前几天对Apollo配置中心的demo进行一个部署试用,现公司已决定使用,这两天进行分布式部署的时候 ...

随机推荐

  1. github的pull request是指什么意思?有什么用处

    github的pull request是指什么意思? 来看看某乎某位阿牛的理解,多么的简单粗暴! 我尝试用类比的方法来解释一下 pull reqeust.想想我们中学考试,老师改卷的场景吧.你做的试卷 ...

  2. div层调整zindex属性无效原因分析及解决方法

    在做的过程中,发现了一个很简单却又很多人应该碰到的问题,设置Z-INDEX属性无效.在CSS中,只能通过代码改变层级,这个属性就是z- index,要让z-index起作用有个小小前提,就是元素的po ...

  3. js数组中数字从小到大排列

    function findMin(start,arr){ var iMin = 99999; var iMinIndex = -1; for(var i = start;i<arr.length ...

  4. arcgis server之路网服务发布

    路网服务发布首先需要建立好道路的网络集,为了保证道路网络分析的准确性,建立网络集之前,要对道路图层进行拓扑差错,确保道路的连通性.具体操作流程为:道路拓扑差错-建立几何网络集-路网服务发布. 1.道路 ...

  5. MAC 如何使用Github Desktop 客户端

    作为开源代码库以及版本控制系统,Github拥有140多万开发者用户.随着越来越多的应用程序转移到了云上,Github已经成为了管理软件开发以及发现已有代码的首选方法.GitHub上已自动配置的Mac ...

  6. SVN(Cornerstone)-添加忽略文件

    1.打开CornerStone,找到偏号设置,找到Subversion选项 2.去看"Use default global ignores"前面的"勾",删除& ...

  7. iOS 实用博客整理(连载版)

    iOS 实用博客整理(连载版) 本博客为本人觉得不错的博客的暂存地,并不是本人所写. 1.iOS开发 如何适配iOS10? 2.UIWebView和WKWebView的比较和选择 3. 如何快速的开发 ...

  8. iOS Class 使用NSProxy和NSObject设计代理类的差异

    经常发现在一些需要使用消息转发而创建代理类时, 不同的程序员都有着不同的使用方法, 有些采用继承于NSObject, 而有一些采用继承自NSProxy. 二者都是Foundation框架中的基类, 并 ...

  9. linux内存使用计算方式

    Linux开机后,使用top命令查看,4G物理内存发现已使用的多大3.2G,占用率高达80%以上: Mem: 3889836k total, 3341868k used, 547968k free, ...

  10. 设置ASP.NET MVC站点默认页为.html页 .

    同事部署了一个Asp.Net MVC的站点,希望它的默认页是index.html页,在vs2010中给站点根目录增加了index.html,然后调用没有什么问题,但部署到IIS7上,在功能试图=> ...