-- config配置文件的读取,写入与生效,以及分布式环境下的配置方案
【官网】:#
应用场景
无论web程序还是服务程序,经常存在app.config或者web.config等形式的配置文件。我们需要根据业务场景和应用情况来分析配置的正确处理。基础资源
无
使用须知
config文件通常很重要,但我们需要考虑如下情况,确定是否需要改用其它配置模式: 1)涉及密码,秘钥等敏感信息不建议放到app.config或web.config中,因为怕被git,svn上传导致大面积泄露(可以改为网络api读取并加密,.net core中可以右键项目,点击管理用户机密,从appsetting.json改为secret.json,具体用法不变)。2)多年的老项目并且存在团队协作时要分析是否存在局部配置,数据库配置表,网络配置并存等情况,搞清楚优先级等。 3)是否存在多个系统或服务共享一
配置步骤
A)app.config或web.config.
A1)app.config或web.config是什么?
是一个XML文本文件。用来存储ASP.NET WEB, 或Winform, windows服务等应用的配置信息。其中web.config在修改不需要重启服务器就可以生效,同时站点进程也会被重启。
A2)app.config和web.config的基本用法.
<用法1:写入配置>
<appSettings> <add key="Enable_Display_Author" value="1" /> </appSettings><用法1:读取配置>
string Enable_Display_Author= ConfigurationManager.AppSettings["Enable_Display_Author"].ToString();
<用法2:写入配置>
<用法2:读取配置><connectionStrings> <add name="DBConect_Content" connectionString="Server=.; Database=Inferno;User ID={建议用户划分好角色权限}; Password={不要填弱密码};MultipleActiveResultSets=true" providerName="System.Data.SqlClient" /> </connectionStrings>[注]安全性要求高时,这个不但要区分dev,live环境,还要加密保存到网络,通过api配置。
string sqlConnect=ConfigurationManager.ConnectionStrings["DBConect_Content"].ConnectionString;
<用法3:写入配置>
<configSesions> <secionGroup name="testEncryptSecion"> <section name="OpensslSection" type="{Namespace,ClassName}"/> </secionGroup> </configSesions> <testEncryptSecion> <OpensslSection> <add key="key1" value="value1"/> </OpensslSection> </testEncryptSecion>
专门写一个类去实现该节点的读取。
A3)app.config或web.config的修改编辑.
在c#.net要对congfig文件的操作需要先引用“system.configuration.dll”
读取 : string str= System.Configuration.ConfigurationSettings.AppSettings["Key"];
对配置文件进行修改:
Configuration cfg = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
cfg .AppSettings.Settings.Add("key", "Name");//添加节点<可选>
cfg .AppSettings.Settings["BrowseDir"].Value = "值"; //赋值
cfg .Save(); //保存,生效
A4)app.config或web.config的局限和不足。
实时性问题:对于桌面或windows服务经常无法实时生效.
分布式问题:当有多个系统需要用到一个配置时,需要修改多个地方,容易出现不一致。
安全性问题:加密了不好阅读,不加密又不安全。
修改性问题: 修改起来不方便。
B)网络配置系统.
为什么需要集中配置?
程序的发展,需要引入集中配置:
- 随着公司内部web服务,站点功能的日益复杂,系统配置日益增多:功能开关、策略选项,参数配置、服务器地址, appId,秘钥……
- 对配置的期望也越来越高,配置修改后实时生效,灰度发布,分环境、分集群管理配置,完善的权限、审核机制……
- 随着采用分布式的开发模式,项目间的引用随着服务的不断增多,调用复杂度成指数升高,每次投产或者上线新的项目时苦不堪言,因此需要引用配置中心治理。
有哪些开源配置中心
- 淘宝 diamond https://github.com/takeseem/diamond 已停止维护
- disconf https://github.com/knightliao/disconf java开发,蚂蚁金服技术专家发起,业界使用广泛
- ctrip apollo https://github.com/ctripcorp/apollo/ Apollo(阿波罗)是携程框架部门研发的开源配置管理中心,具备规范的权限、流程治理等特性。
配置中心对别
功能特性
功能点 |
优先级 |
|
ctrip apollo |
disconf |
备注 |
---|---|---|---|---|---|
静态配置管理 |
高 |
|
支持 |
支持 |
|
动态配置管理 |
高 |
|
支持 |
支持 |
|
统一管理 |
高 |
|
支持 |
支持 |
|
多环境 |
中 |
|
支持 |
支持 |
|
本地配置缓存 |
高 |
|
支持 |
支持 |
|
配置锁 |
中 |
|
不支持 |
不支持 |
不允许动态及远程更新 |
配置校验 |
中 |
|
无 |
无 |
如:ip地址校验,配置 |
配置生效时间 |
|
|
实时 |
实时 |
需要结合热加载管理, springcloudconfig需要 git webhook+rabbitmq 实时生效 |
配置更新推送 |
高 |
|
支持 |
支持 |
|
配置定时拉取 |
高 |
|
支持 |
配置更新目前依赖事件驱动, client重启或者server端推送操作 |
|
用户权限管理 |
中 |
|
支持 |
支持 |
现阶段可以人工处理 |
授权、审核、审计 |
中 |
支持 |
无 |
现阶段可以人工处理 |
|
配置版本管理 |
高 |
|
界面上直接提供发布历史和回滚按钮 |
操作记录有落数据库,但无查询接口 |
|
配置合规检测 |
高 |
|
支持(但还需完善) |
|
|
实例配置监控 |
高 |
支持 |
支持,可以查看每个配置在哪些机器上加载 |
|
|
灰度发布 |
中 |
|
支持 |
不支持部分更新 |
现阶段可以人工处理 |
告警通知 |
中 |
|
支持,邮件方式告警 |
支持,邮件方式告警 |
|
依赖关系 |
高 |
|
不支持 |
不支持 |
配置与系统版本的依赖系统运行时的依赖关系 |
技术路线兼容性
引入配置中心,需要考虑和现有项目的兼容性,以及是否引入额外的第三方组件。我们的java项目以SpringBoot为主,需要重点关注springboot支持性。
功能点 |
优先级 |
|
ctrip apollo |
disconf |
备注 |
---|---|---|---|---|---|
SpringBoot支持 |
高 |
|
支持 |
与spring boot无相关 |
|
SpringCloud支持 |
高 |
|
支持 |
与spring cloud无相关 |
|
客户端支持 |
低 |
|
Java、.Net |
java |
|
业务系统侵入性 |
高 |
|
侵入性弱 |
侵入性弱,支持注解及xml方式 |
|
依赖组件 |
高 |
|
Eureka |
zookeeper |
|
可用性与易用性
引入配置中心后,所有的应用都需要依赖配置中心,因此可用性需要重点关注,另外管理的易用性也需要关注。
功能点 |
优先级 |
ctrip apollo |
disconf |
备注 |
|
---|---|---|---|---|---|
单点故障(SPOF) |
高 |
|
支持HA部署 |
支持HA部署,高可用由zookeeper保证 |
|
多数据中心部署 |
高 |
|
支持 |
支持 |
|
配置获取性能 |
高 |
|
unkown(官方说比spring快) |
|
|
配置界面 |
中 |
|
统一界面(ng编写) |
统一界面 |
|
最终选择
综上,ctrip applo是较好的选择方案,最终选择applo。
- 支持不同环境(开发、测试、生产)、不同集群
- 完善的管理系统,权限管理、发布审核、操作审计
- 配置修改实时生效(热发布)
- 版本发布管理
常见问题
-
winform或windows服务中app.config中配置修改了,不生效
【解决方案】在没有主动干预(监控时间戳,重新读取值)需要重启桌面程序或win服务才能生效. -
如何解决web.config中密码,秘钥等敏感信息被团队所有人看到的问题
【解决方案】1)dev,live环境切记要分开,2)团队成员权限要规划好,3)隐私信息要加密. 4)敏感信息采用网络配置api读取
快速入门
无