前言
一个服务或者产品,往往需要三个环境:一个开发环境(Development),一个测试环境(Staging),一个生产环境(Production),
这就不可避免的需要多个配置文件来匹配相应的环境,因为不可能三个环境都使用同一个配置,生产的数据直接就被污染了。
为了便于管理所有的配置字符串,把他们集中在一个json文件,程序启动时就序列化出来,有需要更新的时候,直接修改json文件即可,不必修改代码,以免regression或者引入新的bug。
旧方法
把开发的代码部署到测试环境的时候,需要手动merge到测试环境的branch,这个merge过程,需要把修改配置文件;
同理,在测试环境通过好,部署到生产环境时,还要再次手动merge一次到production的branch,之后VSTS部署merge后的branch。
这个过程,繁杂不说,难免出现配置遗漏,错配,或者交接的困难,毕竟谁都有犯迷糊的时候。
根据环境变量自动读取
.Net Core的project,都有一个startup.cs文件,这个文件是服务启动的时候就会执行的过程,所以选在这里把需要的依赖注入,进行初始化:
public Startup(IHostingEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
.AddEnvironmentVariables();
Configuration = builder.Build();
//Get key vault URL and environment
var appSettings = Configuration.GetSection("AppSettings").Get<AppSettings>();
EnvironmentSettings settings = SettingsProvider.Settings(appSettings.KeyVaultURI, appSettings.Environment);
ServiceManager.Initialize(settings);
}
这个构造函数的参数env,带有环境变量的值:env.EnvironmentName,根据这个值的不同,在项目里添加三个settings的json文件。
每一个josn里面的结构必须保持一下,这样序列化的时候才能正常解析正确的值。当然,也要符合json的语法,可以使用json校验工具检查一下。
配置project环境变量
.net Core的项目文件,在PackageRoot下,都有一个ServiceManifest.xml文件,把一下代码加入进去,要注意的是环境变量的Name必须是:ASPNETCORE_ENVIRONMENT
否则读取失败。
默认是开发环境(Development)。
环境变量可以被override
在Service fabric下,有个ApplicationManifest.xml
这个文件可以配置对应的参数列表(parameters),添加一列环境变量:
在这个文件的下方,在需要根据环境变量读取配置的project对应节点内,添加环境变量的Name-Value,这里[Environment]的意思是,读取上图中的Environment参数对应的值。
部署时,选择对应的xml文件
在ApplicationParamerters文件夹下,添加对应的参数文件,每个文件的内容就是对应部署环境的配置文件的名称:
publish的时候,选择对应部署环境的xml文件即可:
这样,主要部署的时候,选对了相应的xml文件,程序启动的时候,startup就可以正确读取到对应的配置。
后记
这应就减少课很多出错的可能,项目交接的时候,也不省了不少交接内容。
参考:https://*.com/questions/33928204/where-do-you-set-and-access-run-time-configuration-parameters-per-environment-fo
https://docs.microsoft.com/en-us/powershell/module/servicefabric/new-servicefabricapplication?view=azureservicefabricps
如果觉得有帮助,就点个推荐吧;
如果写的不好,欢迎评论指出。