系统简介

最近做了一个.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. jQuery实现页面内锚点平滑跳转

    平时我们做导航滚动到内容都是通过锚点来做,刷的一下就直接跳到内容了,没有一丝的滚动效果,而且 url 链接最后会有“小尾巴”,就像#keleyi,今天我就介绍一款 jquery 做的滚动的特效,既可以 ...

  2. 纯HTML5+CSS3制作生日蛋糕

    以一个前端开发的身份绘制一个简单的蛋糕庆祝一下今天这个好日子吧,程序员庆生的乐趣与哀愁啊.写的比较简陋,感兴趣的看一下吧. 先发个效果图吧 蛋糕分为三个部分,底部蛋糕,顶层蛋糕和蜡烛部分.HTML的布 ...

  3. 从头开始构建LINUX[内核更新和资料]

    了解了LFS的内容后,至于内核的更新就一目了然了 http://www.cnblogs.com/2018/p/3979305.html http://www.cnblogs.com/2018/p/39 ...

  4. SJGestureUnlock快速集成手势解锁

    前言:如果页面显示不完整或图片看不了还请移步:简书 SJGestureUnlock.h 常用自定义属性 @interface SJGestureUnlock : UIView @property (n ...

  5. Android 手机卫士--确认密码对话框编写

    本文接着实现“确认密码”功能,也即是用户以前设置过密码,现在只需要输入确认密码 本文地址:http://www.cnblogs.com/wuyudong/p/5940718.html,转载请注明出处. ...

  6. 熟悉HTML CSS布局模型

    HTML最难的地方来了!这个我反复了很多遍, 包括现在写博客, 也对我自己算是一种温习, 我这块怕是没办法写的很好懂, 因为我自己还不能把我学到的准确通俗易懂的表达出来, 给自己记个笔记, 以后再来一 ...

  7. SQL Server 关于列的权限控制

    在SQL SERVER中列权限(Column Permissions)其实真没有什么好说的,但是好多人对这个都不甚了解,已经被人问了几次了,所以还是在这里介绍一下,很多人都会问,我能否单独对表的某列授 ...

  8. 对iOS后台模式最多10分钟运行时间的进一步理解

    在app进入后台时,系统初始默认是只有10s的处理时间,但如果10s不够,我们可以主动申请,网上流传最多的一个说法是10分钟. 但这种说法有个前提: 那就是iOS7之前,是这样 但从iOS7开始,我们 ...

  9. C++ string类的实现

    c++中string类的实现 今天面试被考到了, 全给忘记了!!!   //string类的实现 #include <iostream> #include <string.h> ...

  10. 在AndroidStudio v1.2.0中导入或增加新项目或工程(导入第三方类库或工程)

    以下说明基于AndroidStdudio版本v1.2 由于AndroidStudio项目止录与Eclipse中的Worksapce在意义上的改变,所以导入新包或建立新项目时并不和以前那样了. 下面是我 ...