系统简介

最近做了一个.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. CSS3的自定义动画帧

    CSS3新增的动画帧非常绚丽,可以简单实现一些动画效果,目前除IE外各大主流浏览器都支持 本文演示三个:transform: scale3d(x, y, z)-缩放;.transform: trans ...

  2. Html之 IFrame使用,注意几点

    0x01 iframe的跳出框架 0x02 iframe样式设置 0x03 iframe重置高度 1.首先来一个,跳出iframe的好方法,直接可以在Login.aspx页面使用. if (windo ...

  3. Android原生json和fastjson的简单使用

    android原生操作json数据 主要是两个类 JSONObject 操作对象     JONSArray操作json数组 对象转json //创建学生对象 Student student=new ...

  4. 在TableView上添加悬浮按钮

    如果直接在TableVIewController上贴Button的话会导致这个会随之滚动,下面解决在TableView上实现位置固定悬浮按钮的两种方法: 1.在view上贴tableView,然后将悬 ...

  5. Genymotion 解决虚拟镜像下载速度特别慢的问题

    Genymotion号称Android模拟器中运行最快的,但是服务器在国外,Android镜像下载起来那个速度就不想说了. Add new device后下载速度太慢了,容易失败   解决方法如下: ...

  6. 【代码笔记】iOS-水波效果

    一,效果图. 二,工程图. 三,代码. ViewController.h #import <UIKit/UIKit.h> @interface ViewController : UIVie ...

  7. The operation couldn’t be completed. (LaunchServicesError error 0.)

    问题描述: 当运行Xcode时,编译代码成功,但是登陆模拟器失败,显示错误:The Operation couldn't be completed.(LaunchServicesError error ...

  8. [C#6] 0-概览

    1. C#6 新特性图谱 C#6的新特性主要由编译器(“Roslyn”)带来,并不依赖CLR和.NET Framework的升级,我们可以认为这个版本的新语言特性的主要目的为了简化代码书写方式,让我们 ...

  9. transform图形变化

    <!DOCTYPE HTML> <head> <meta charset = "utf-8"> <title>canvas</ ...

  10. Create view failed with ORA-01031:insufficient privileges

    有时候在ORACLE数据库创建视图时会遇到:ORA-01031:insufficient privileges错误,我也多次碰到了各种创建视图出错的情况,很多时候也没有太在意,今天被一同事问起这个问题 ...