分布式统一配置平台-Disconf.Net

为了更好的解决分布式环境下多台服务实例的配置统一管理问题,本文提出了一套完整的分布式配置管理解决方案。结合.net项目具体情况,实现了配置发布的统一化,对配置进行持久化管理并对外提供restful接口,在此基础上,基于ZooKeeper实现对配置更改的实时推送。系统参考了百度的Disconf,实现和改进了部分功能,是Disconf的.Net精简版,功能有待进一步完善。

1.系统设计

1.1设计理念

      l  简单易用,用户体验良好

      l  支持配置(KV配置项+配置文件)的分布式化管理

      l  配置发布、更新统一化:用户统一在平台上进行发布、更新配置。

      l  配置更新自动化:用户在平台更新配置,使用该配置的系统会自动发现该情况,并应用新配置。

 

      系统结构图如下: 

 

 

      初始化时,业务流程图如下:

 

      配置更新时,业务流程图如下:

 

1.2.功能介绍

      系统模块架构图如下:

 

1.2.1Client

  配置管理模块:统一管理用户实例中本地配置文件和配置项

  下载模块:restful风格的下载配置文件和配置项

  watch模块:监控远程配置文件和配置项的变化

1.2.2Web

配置管理模块:支持配置模板(配置项或配置文件)的上传、下载、更新

配置存储模块:管理所有配置的存储和读取,根据appName、version、environment来区分项目配置

通知模块:当配置更新后,实时通知使用这些配置的所有实例

权限控制:web用户的权限控制

2.客户端应用

2.1添加clientConfig配置节点

在app.config或者web.config中的configSections节点下添加配置

<section name=”clientConfig” type=”Disconf.Net.Client.ClientConfigSection,Disconf.Net.Client”/>

然后在appSettings同级别的节点上添加clientConfig配置,示例如下

<configSections>


 <section name=”clientConfig” type=”Disconf.Net.Client.ClientConfigSection,Disconf.Net.Client”/>


</configSections>


<appSettings file=”appSettings.config”/>


<clientConfig configSource=”clientConfig.config”/>

2.2clientConfig配置说明

具体示例如下:

<clientConfig webApiHost=”http://192.168.1.100:8088/” enableRemote=”true”>


<clientInfo appName=”consoletest” environment=”Dev” version=”1.0.0.0” clientName=”Console_1”/>


<updateStrategy fileIgnores="notdown.txt" itemIgnores="aa,bb,cc " startedSync="true" retryTimes="3" retryIntervalSeconds="10" />


<preservation absolutePath="false" tmpRootDirectory="Tmp\Download\Configs" factRootDirectory="" tmpItemsLocalName="~items.xml" tmpFilesLocalName="~files.txt"/>


</clientConfig>

节点名称

必配

默认值

节点描述

webApiHost


Y


Rest服务器域名地址

enableRemote


N

true

是否启用远程配置,默认true,设为false的话表示不从远程服务器下载配置

clientInfo

appName

Y


客户端程序名称,注意大小写要与服务端一致

environment

Y


当前客户端程序所处环境,注意大小写要与服务端一致

version

Y


当前客户端程序版本,注意大小写要与服务端一致

clientName

N


客户端标识,用于服务端查看已更新客户端,如果不设置则默认获取客户端电脑名称

updateStrategy

fileIgnores

N


要忽略更新的文件配置,以,分割,注意大小写要与服务端一致

itemIgnores

N


要忽略更新的键值对配置,以,分割,注意大小写要与服务端一致

startedSync

N

true

启动时是否同步加载,默认同步

retryTimes

N

3

当获取失败时的重试次数

retryIntervalSeconds

N

10

每次重试时间间隔,单位秒

preservation

absolutePath

N

false

是否绝对路径,默认false。当false时,表示默认以

AppDomain.CurrentDomain.BaseDirectory为比较点,注意:该配置同时适用于TmpRootDirectory、

FactRootDirectory,即要么都只能绝对路径,要么都只能相对路径

tmpRootDirectory

N

Tmp/Download/Configs

下载下来的配置临时保存文件夹根目录

factRootDirectory

N

Configs

配置文件实际所在的根目录

tmpItemsLocalName

N

~items.xml

在临时目录下用于保存所有键值对的文件名,设置为空表示不保存,文件保存在TmpRootDirectory目录下,所以注意不要与

实际配置文件名字冲突


tmpFilesLocalName

N

~files.txt

在临时目录下用于保存所有文件配置名的文件名,设置为空表示不保存,文件保存在TmpRootDirectory目录下,所以注意不要与实际配置文件名字冲突

 

2.3Rules

除了配置外,还需要设置更新策略,客户端才能进行配置更新。目前,Rules设置仅支持编码的方式进行,Rule分两种:FileRule,ItemRule,下面分别进行描述:

FileRule:用于设置如何更新文件类型配置,其包含以下方法

方法名

描述

IFileRule MapTo(string refreshSectionName)

注册Rule规则,设置默认的文件配置映射

参数refreshSectionName表示更新回调时,

ConfigurationManager.RefreshSection要刷新的节点名称,默认采用远程配置的configName

IFileRule RefreshIgnores()

不自动调用ConfigurationManager.RefreshSection方法更新配置

IFileRule CallBack(Action action)

当文件下载完成并且替换本地对应文件后回调,注意此处将采用委托链的方式,即多次调用均会被执行

ItemRule:用于设置如何更新键值对类型配置,其包含以下方法

方法名

描述

IItemRule MapTo(string propName)

注册Rule规则,设置默认的属性映射参数

propName表示要赋值的属性名,默认采用远程的configName

IItemRule SetProperty<T>(T entity, string propName = null, Func<string, object> typeConvert = null)

更新指定实体的属性值,按默认方式获取实例属性,注意此处多次调用均会被执行

IItemRule SetProperty(object entity, PropertyInfo prop, Func<string, object> typeConvert = null)

更新指定实体的属性值,注意此处多次调用均会被执行

IItemRule SetStaticProperty<T>(string propName = null, Func<string, object> typeConvert = null)

更新静态属性的值,按默认方式获取静态属性,注意此处多次调用均会被执行

IItemRule SetStaticProperty(PropertyInfo prop, Func<string, object> typeConvert = null)

更新静态属性的值,注意此处多次调用均会被执行

IItemRule CallBack(Action<string> action)

当值发生变更时如何进行回调,注意此处将采用委托链的方式,即多次调用均会被执行

2.4ConfigManager

该类为Client配置入口,通过Singleton提供唯一实例,除了提供Rules的配置入口外,还提供异常通知的事件

要使Disconf.Net.Client工作,必须显示执行指定方法manager.Init(),而在init之前,还需设置Rule和Fault,可以通过ConfigManager.Instance来获取该类的实例对象,然后通过对应的Rule进行相关Rule设定,示例如下:

//要更新的文件


ConfigManager.Instance.FileRules.For("appSettings.config").CallBack(() => {


      Console.WriteLine("File changed notice twice");


});



//要更新的键值对


ConfigManager.Instance.ItemRules.For("Dai").MapTo("Person").SetStaticProperty<Program>().CallBack(v =>{


Console.WriteLine("Now item value:{0}", v);


Console.WriteLine("Program.Person is {0} now", Program.Person);


    if (v.Length > 3)


    {


        throw new Exception("Too Long");


    }


});



//忽略更新到本地的键值对


ConfigManager.Instance.ItemRules.For("Peng").CallBack(v =>{


Console.WriteLine("Now item value:{0}", v);


});



//异常处理


ConfigManager.Instance.Faulted+=Manager_Faulted;


//Config初始化,包括ZooKeeper、scan等


ConfigManager.Instance.Init();

要特别说明的是:

1、File因为属于下载后覆盖指定位置文件的方式,所以对于Rule可以设置默认规则,如例子中的appSettings.config,其对应的就是config文件中的appSettings部分,此时如果不需要进行CallBack调用,且文件名称(去除后缀)部分与Section一致,那么这部分Rule设置可以忽略,程序会在初始化时自动进行默认设置,而对于Item,因为无法确认更新策略,所以如果不设置Rule,那么就算从服务端获取到了值,该部分也只能被忽略。

2、对于异常部分,程序只是简单的通过Faulted事件来传递异常信息,该事件只有一个Exception类型的参数。

3.web端应用

配置步骤:

1、  创建具体应用(项目)

2、  创建应用的配置模板(1~n个配置,如appSetting.config、redisconfig.config、rabbitMQConfig.config等配置模板)

3、  创建应用的环境(如:开发环境、测试环境、仿真环境等),修改相关的配置

4、  启用对应的配置

5、  至此,client端就可以获取应用环境对应的所有配置

3.1登录

登陆进入配置管理界面

3.2应用

 

 

【新建】:填写应用名称,应用描述保存完成新建,返回可返回应用管理首页。

【初始化ZooKeeper】:第一次启动时Zookeeper初始化。

【编辑】:与新建界面一致,可修改应用名称,应用描述,保存即返回应用管理首页。

【编辑环境】:进入环境环境配置管理首页。

【删除】:删除对应应用记录。

3.3模板

显示所有模板,操作环境配置前,需要先配置模板,根据模板对相应环境的配置进行操作。

 

【新建】:新增模板,填写模板名称、描述、类型、默认值版本号等,如选择文件类型。可上传文件读取文件内容,版本号可以选择已经有的版本号,或者新建版本号。

【编辑】:操作同新建模板,可对模板内容进行修改。

【删除】:点击删除可删除对应模板记录,如该模板在环境中存在配置项,则该模板不允许删除,需删除对应该模板的配置项,才可以删除对应模板。

3.4环境

【新增环境】点击加号可以新增环境,填写环境名称,描述保存即可。

 

【编辑环境】在对应环境上点击鼠标右键即可弹出编辑菜单,点击Edit即可编辑环境,可以修改名称内容等。

 

【配置首页】:配置首页根据版本进行分类,默认显示头部第一个版本,点击其他版本可以进行切换,显示的配置项是模板默认配置项,点击启用即可个性化赋值,针对不同环境进行不同的赋值。编辑可编辑相应配置,禁用等同于删除配置。

 

【启用配置】:名称默认值不能修改,可以点击使用默认值,直接赋值,也可以上传文件使用文件内容,保存即可。

【编辑配置】:操作同启用配置,保存即可修改值。

【禁用配置】:禁用等同于删除配置,删除对应模板配置项,可删除对应模板。

3.5角色

【角色首页】:

Ø  角色首页展示角色列表,角色分为超级管理员和非超级管理员;

Ø  超级管理员角色不展示;

Ø  超级管理员可以看到所有非超级管理员角色,非超级管理员只可以看到当前角色用户创建的角色;

Ø  可以新增角色,也可以对角色进行编辑,只有在创建用户时勾选是否为系统管理员才可以进行角色管理。

【新建角色】:

Ø  新建角色输入角色名称,可以勾选的权限为当前用户所拥有的权限;

Ø  新建的角色作为该用户的下属角色,可分配给当前用户新建的用户;

Ø  父级权限为新建应用所增加的权限,以后每增加一个环境,就相应的增加该应用下的该环境权限,除超级管理员外的角色需对应勾选该权限才能看到该应用或者该权限,保存角色即可。

【编辑角色】:操作同新建角色,可以对该角色进行名称修改,权限修改。

3.6用户

管理用户首页,显示所有用户,可进行新建,编辑用户等操作。

 

【新建用户】:填写姓名,用户名,密码,选择角色(拥有对应角色权限、且可以选择的角色为当前登陆用户新建的角色),选择是否为系统管理员(系统管理员拥有新建用户、新建角色权限),保存即可。

【编辑用户】:操作同新建用户,保存即可修改。

原文地址:http://www.cnblogs.com/qkbao/p/6638721.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/326083.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机软件录音注意事项,GOLDWAVE录音软件使用教程

很多朋友都有录音软件&#xff0c;但是软件功能不全&#xff0c;也不是专业的&#xff0c;所以现在我讲一个专业的软件&#xff0c;这个软件都是原创歌手比较常用的软件&#xff0c;现在我们来学习一下。这是该软件的界面&#xff0c;软件的名字叫做GOLDWAVE这款软件的功能很强…

2016蓝桥杯省赛---java---A---10(压缩转换)

题目描述 小明最近在研究压缩算法。 他知道&#xff0c;压缩的时候如果能够使得数值很小&#xff0c;就能通过熵编码得到较高的压缩比。 然而&#xff0c;要使数值很小是一个挑战。 最近&#xff0c;小明需要压缩一些正整数的序列&#xff0c;这些序列的特点是&#xff0c;后面…

量子计算机对人类长寿,科学家称“极端长寿”在未来几十年可能会达到新的里程碑...

原标题&#xff1a;科学家称“极端长寿”在未来几十年可能会达到新的里程碑 来源&#xff1a;cnBeta.COM据外媒报道&#xff0c;人们的平均寿命越来越长&#xff0c;而经历“极端长寿”的人的数量也同样在增加。尽管大多数人活不到100岁&#xff0c;但数据显示&#xff0c;在过…

.NET Framework 4.7发布,支持Windows 10创作者更新

微软刚刚发布了 .NET Framework 4.7&#xff0c;主要是带来了对 Windows 10 “创作者更新” 的支持&#xff0c;开发者们可以通过 Visual Studio 2017 进行最新版 .NET Framework 项目的开发。 .NET Framework 4.7 包含了以下几大改进&#xff1a; 加入对 Windows 10 表格应用…

2016蓝桥杯省赛---java---C---10(密码脱落)

题目描述 思路分析 将字符串反转&#xff0c;后寻找到最长子串&#xff0c;然后用字符串长度减去最长字串长度即可。 代码实现 package lanqiao;import java.util.Scanner;public class Main {static int min0,num0;static String str;public static void main(String[] arg…

使用ElasticSearch,Kibana,ASP.NET Core和Docker可视化数据

原文地址&#xff1a;http://www.dotnetcurry.com/aspnet/1354/elastic-search-kibana-in-docker-dotnet-core-app 想要轻松地通过许多不同的方式查询数据&#xff0c;甚至是从未预料到的方式&#xff1f;想要以多种方式可视化日志&#xff1f;同时支持基于时间、文本和其他类…

计算机辐射对人体影响吗,电脑屏幕辐射对人体的危害怎么解决?

现在不光是从事IT职业的人经常用电脑&#xff0c;普通打工族也时常接触电脑&#xff0c;人们用电脑的时间越来越多&#xff0c;电脑屏幕带来的辐射问题随之而来&#xff0c;工作上班用电脑&#xff0c;下班回家看电视剧、打游戏也用电脑&#xff0c;KTV点歌也用触摸屏辐射&…

2017蓝桥杯省赛---java---A---4(方格分割)

题目描述 思路分析 dfs 题目要求沿着格子的边线剪成两个部分&#xff0c;仔细观察&#xff0c;剪开的边线是关于中心点&#xff08;3&#xff0c;3&#xff09;对称的&#xff0c;于是我们从&#xff08;3&#xff0c;3&#xff09;开始搜索&#xff0c;直到搜到边界则退出。…

这些分布式事务的解决方案,你都知道吗

转载自 这些分布式事务的解决方案&#xff0c;你都知道吗 分布式事务是企业集成中的一个技术难点&#xff0c;也是每一个分布式系统架构中都会涉及到的一个东西&#xff0c;特别是在微服务架构中&#xff0c;几乎可以说是无法避免。 数据库事务 在说分布式事务之前&#x…

如何在多个项目中分离Asp.Net Core Mvc的Controller和Areas

前言 软件系统中总是希望做到松耦合&#xff0c;项目的组织形式也是一样&#xff0c;本篇文章将介绍在ASP.NET CORE MVC中怎么样将Controller与主网站项目进行分离&#xff0c;并且对Areas进行支持。 实践 1.新建项目 新建两个ASP.NET Core Web应用程序&#xff0c;一个命名…

2017蓝桥杯省赛---java---B---10(k倍区间)

题目描述 标题&#xff1a; k倍区间给定一个长度为N的数列&#xff0c;A1, A2, … AN&#xff0c;如果其中一段连续的子序列Ai, Ai1, … Aj(i < j)之和是K的倍数&#xff0c;我们就称这个区间[i, j]是K倍区间。你能求出数列中总共有多少个K倍区间吗&#xff1f;输入 第一行…

asp.net core源码飘香:Configuration组件

简介&#xff1a; 这是一个基础组件&#xff0c;是一个统一的配置模型&#xff0c;配置可以来源于配置文件&#xff08;json文件&#xff0c;xml文件&#xff0c;ini文件&#xff09;&#xff0c;内存对象&#xff0c;命令行参数&#xff0c;系统的环境变量又或者是你自己扩展的…

计算机图形橡皮筋实验报告,弹性或橡皮筋技术

橡皮筋是一种在计算机屏幕上绘制线, 折线, 矩形, 圆形和椭圆形等几何图元的流行技术。它已成为图形用户界面(GUI)不可或缺的一部分, 并成为事实上的标准, 并且几乎被所有基于Windows的应用程序普遍接受。用户通过定位其两个端点以通常的方式指定该线。当我们从第一个端点移动到…

2017蓝桥杯省赛---java---C---9(青蛙跳杯子)

题目描述 题目描述 X星球的流行宠物是青蛙&#xff0c;一般有两种颜色&#xff1a;白色和黑色。X星球的居民喜欢把它们放在一排茶杯里&#xff0c;这样可以观察它们跳来跳去。如下图&#xff0c;有一排杯子&#xff0c;左边的一个是空着的&#xff0c;右边的杯子&#xff0c;每…

青客宝团队redis内部分享ppt

Redis&#xff1a;最好的缓存数据库 说Redis是缓存服务&#xff0c;估计有些人会不开心&#xff0c;因为Redis也可以把数据库持久化&#xff0c;但是在大多数情况Redis的竞争力是提供缓存服务。说到缓存服务必然会想到Memcached&#xff0c;因为几年前Memcached是最流行的缓存服…

你知道面试官是如何刷人的吗

转载自 你知道面试官是如何刷人的吗 对于一个公司来说&#xff0c;执行招聘面试事宜是一个耗时耗钱的项目&#xff0c;从顾问公司和人才中介挑选出合适的简历之后&#xff0c;还要花更多的时间找出合适的候选人。有的时候这些机构会向你保证这些人都是 Java 天才、SQL 专家、…

2020蓝桥杯省赛---java---A---4(七段码)

题目描述 思路分析 代码实现 package lanqiao;public class Main {public static int N10;public static int e[][]new int[N][N];//存储二极管相邻的信息public static int f[]new int[N];//并查集public static int ans0;public static boolean st[]new boolean[N];//true表…

小米无线路由器服务器用户名和密码忘了,小米路由器管理密码忘记了怎么办?...

问&#xff1a;小米路由器管理密码忘记了怎么办&#xff1f;我想修改小米路由器上的配置&#xff0c;在打开miwifi.com的时候&#xff0c;提示需要输入管理密码。但是&#xff0c;我不知道管理密码是多少&#xff0c;忘记了管理密码应该怎么办&#xff1f;答&#xff1a;首先说…

asp.net core源码飘香:Options组件

简介&#xff1a; Options组件是一个小组件&#xff0c;但用的地方很多。它本质是将一个POCO类注册到容器中&#xff08;主要在Startup中作为其他组件的配置功能提供&#xff09;&#xff0c;后续使用的时候就可以通过比如构造函数注入等获取到POCO对象。如果只是为了注入一个P…

DevOps面试问题

转载自 DevOps面试问题 DevOps是一组过程、方法与系统的统称&#xff0c;用于促进开发&#xff08;应用程序/软件工程&#xff09;、技术运营和质量保障&#xff08;QA&#xff09;部门之间的沟通、协作与整合。下面为大家分享DevOps系列的面试问题 持续整合问题 问题一&a…