使用AgileConfig统一管理多项目配置
使用AgileConfig统一管理多项目配置
背景
一个设备的数字化管理软件系统,需要涵盖来料检验,部件装配,自动检验,装机激活,日常运营,维修保养,退役更换等生命周期流程,应用于生产车间,装机现场,客服运营等应用场景,业务复杂,角色众多,涉及的时间和空间范围都比较大,需要开发一系列的软件去解决不同应用场景的需求。.Net Core技术栈可以跨平台开发一系列云服务,浏览器客户端,PC桌面软件,安卓和iOS移动APP软件子系统,所有数据汇总管理,但是这一系列的软件却有着很多共同的配置管理需求,因为所管理的设备和数据是一致的,很多依赖的基础设施比如OSS,数据库,消息服务也是相同的。如果各个软件子系统独立管理配置,每当修改了一个基础设施,就要及时同步更新所有受影响的软件子系统,效率很低,还容易出错。AgileConfig统一配置管理中心能够很好的解决上述应用需求,MIT开源,资料丰富,简单易用,特别适合小企业,小团队管理多项目配置。
搭建AlileConfig云服务器
参考https://github.com/dotnetcore/AgileConfig编写docker compose脚本,由于AgileConfig镜像不支持直接配置为https访问,不符合网络安全的管理要求,所以再加一个nginx反向代理转为https访问。把SSL证书文件放在容器脚本当前目录,改名为myweb,挂载到nginx容器。
docker-compose.yml脚本,注意数据库文件路径指定到容器内部db子目录Data Source=db/myconfig.db,不然重建容器后配置数据库文件也没了。
version: '3' services: agilecfg: container_name: agilecfg image: "kklldog/agile_config:v-1.7.1" expose: - 5000 volumes: - ./data:/app/db environment: - TZ=Asia/Shanghai - adminConsole=true - db__provider=sqlite - db__conn=Data Source=db/myconfig.db restart: always agileproxy: container_name: agileproxy image: nginx:1.17.2 ports: - "8100:8100" environment: - TZ=Asia/Shanghai volumes: - ./nginx.conf:/etc/nginx/conf.d/default.conf - ./myweb.pem:/etc/nginx/myweb.pem - ./myweb.key:/etc/nginx/myweb.key restart: always links: - agilecfg
nginx.conf配置,注意要开启支持从http连接升级协议建立websocket连接
map $http_upgrade $connection_upgrade { default upgrade; '' close; } server { listen 8100 ssl; ssl_certificate myweb.pem; ssl_certificate_key myweb.key; location / { proxy_pass http://agilecfg:5000; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $http_connection; } }
创建配置
访问AgileConfig容器所在的域名地址和端口8100,首次访问输入2次密码,即可创建admin账号的密码,然后登录进去。
首先创建应用。
然后在应用下面创建配置。
注意要给DEV、PROD等多个环境分别创建配置,完成后记得点【发布全部】,每个环境都要发布才会更新配置。
如果多个软件子系统需要共享部分配置,可以新建一个共享配置,打钩【公共应用】。
然后在软件子系统配置中关联这个公共应用的配置文件。
在控制台页面可以清晰看到每个软件子系统,引用了哪些公共配置。
客户端软件接入配置中心
新建Asp.Net Core项目AgileConfigDemo,NuGet安装AgileConfig.Client。在软件初始化时添加AgileConfig配置。
D:\Software\gitee\agileconfigdemo\AgileConfigDemo\AgileConfigDemo\Program.cs
var builder = WebApplication.CreateBuilder(args); builder.Host.UseAgileConfig(new ConfigClient($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")}.json"), e => Console.WriteLine($"configs {e.Action}"));
确保项目中用的多个环境都有一一对应的appsettings文件,每个appsettings文件引用对应的AgileConfig配置。
D:\Software\gitee\agileconfigdemo\AgileConfigDemo\AgileConfigDemo\appsettings.Development.json
//agile_config "AgileConfig": { "appId": "AgileConfigDemo", "secret": "1B25FA68-7D88-4D40-8C85-2DE17FD56C0A", "nodes": "https://www.xxx.cn:8100", //多个节点使用逗号分隔, "name": "AgileConfigDemo", "env": "DEV" //"env": "PROD"//本机调试查看产品环境配置 }
D:\Software\gitee\agileconfigdemo\AgileConfigDemo\AgileConfigDemo\appsettings.Production.json
//agile_config "AgileConfig": { "appId": "AgileConfigDemo", "secret": "1B25FA68-7D88-4D40-8C85-2DE17FD56C0A", "nodes": "https://www.xxx.cn:8100", //多个节点使用逗号分隔, "name": "AgileConfigDemo", "env": "PROD" }
在项目中可以跟本机配置一样获取各种配置参数
public class DemoService { private readonly IConfiguration _configuration; public DemoService(IConfiguration configuration) { _configuration = configuration; } public string Name => _configuration["Name"]; public string MaxNameLen => _configuration["MaxNameLen"]; }
运行软件,可以看到控制台输出连接了AgileConfig的信息,并且显示当前使用的是哪个环境的配置文件。
trce: AgileConfig.Client.ConfigClient[0]
client try connect to server wss://www.xxx.cn:8100/ws?client_name=AgileConfigDemo&client_tag=
trce: AgileConfig.Client.ConfigClient[0]
client connect server wss://www.xxx.cn:8100/ws?client_name=AgileConfigDemo&client_tag= successful .
trce: AgileConfig.Client.ConfigClient[0]
client send 'loaded' to server by websocket .
trce: AgileConfig.Client.ConfigClient[0]
client load all the configs success by API: https://www.xxx.cn:8100/api/config/app/AgileConfigDemo?env=DEV , try count: 0.
DEMO代码地址:https://gitee.com/woodsun/agileconfigdemo