config配置文件的读取,写入与修改生效,含源码及统一配置中心的推荐选型

-- 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:写入配置>


 <connectionStrings>
    <add name="DBConect_Content" connectionString="Server=.; Database=Inferno;User ID={建议用户划分好角色权限}; Password={不要填弱密码};MultipleActiveResultSets=true" providerName="System.Data.SqlClient" />
  </connectionStrings>
[注]安全性要求高时,这个不但要区分dev,live环境,还要加密保存到网络,通过api配置。
<用法2:读取配置>
 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>


<用法3:读取配置>
专门写一个类去实现该节点的读取。

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,秘钥……
  • 对配置的期望也越来越高,配置修改后实时生效,灰度发布,分环境、分集群管理配置,完善的权限、审核机制……
  • 随着采用分布式的开发模式,项目间的引用随着服务的不断增多,调用复杂度成指数升高,每次投产或者上线新的项目时苦不堪言,因此需要引用配置中心治理。

有哪些开源配置中心

  1. 淘宝 diamond https://github.com/takeseem/diamond 已停止维护
  2. disconf https://github.com/knightliao/disconf java开发,蚂蚁金服技术专家发起,业界使用广泛
  3. 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读取

快速入门

参考资料