如何使用AWS和Azure的配置存储服务保存读取配置
原文:Want to yank configuration values from your .NET Core apps?
作者:pauljwheeler
译文:https://www.cnblogs.com/lwqlun/p/10508748.html
译者:Lamond Lu
示例源代码:https://github.com/lamondlu/LoadConfigurationFromCloud

背景
我们创建的大部分.NET Core应用都会使用配置文件。如果你了解过12 Factor理论(https://12factor.net/zh_cn/), 你可能会希望将配置文件与代码隔离。这就意味你不能将应用配置存在appsetting.json文件中或者硬编码在程序中。
这时候我们可以使用环境变量来完成以上的需求,但这并不是很好的选择,这种方案有2个缺点
- 没有版本控制
- 没有访问权限控制
今天我就给大家介绍一下AWS和Azure中提供的配置服务。
AWS
AWS的AWS Systems Manager服务中,提供了一个名为Parameter Store的子服务。此服务可以用来维护项目中使用的配置数据。 据我所知,它可以免费使用。
使用配置服务添加配置
首先,我们访问了AWS控制台,找到了Systems Manager服务,并从左侧菜单中选择了Parameter Store。 从这里,我们可以编辑或删除现有参数,并创建新参数。

每个参数都有一个名称和值。 对于名称,我们使用“/”来定义层次结构(例如:/lamond/project1/config1)。 参数类型可以是字符串,字符串列表或加密字符串。

整个UI的功能非常智能,这里当输入参数名称的时候,它会自动匹配已有的参数名称

为了演示效果,这里我添加了2个配置,一个名为/lamond/project1/config1,值是"Hello world", 另外一个名为/lamond/project1/config2, 值为"We love Cloud".

好的,以上我们就完成在AWS控制台中的配置,下面让我们看一下如何在一个.NET Core Web应用中读取这个配置。
如何从代码中读取配置
这里首先我们创建创建一个ASP.NET Core MVC项目,并添加程序集
Amazon.Extensions.Configuration.SystemsManager
然后,我们创建一个简单的Setting类, 用来存储从AWS Parameter Store中拉取的配置值
public class Settings
{
public string Config1 { get; set; }
public string Config2 { get; set; }
}
然后,我们需要在appsettings.json文件中配置AWS配置服务的region和profile.
{
"Logging": {
"LogLevel": {
"Default": "Warning"
}
},
"AllowedHosts": "*",
"AWS": {
"Profile": "default",
"Region": "us-west-2"
}
}
下一步,我们需要修改Program.cs文件,启用从AWS Systems Manager中读取配置, 这里我是从/lamond中读取配置
public class Program
{
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.ConfigureAppConfiguration(builder =>
{
builder.AddSystemsManager("/lamond");
})
.UseStartup<Startup>();
}
接下来,和一般的强类型配置绑定一样,我们还需要在Startup.cs的ConfigureService方法中,绑定配置。
public void ConfigureServices(IServiceCollection services)
{
services.Configure<Settings>(Configuration.GetSection("properties"));
services.Configure<CookiePolicyOptions>(options =>
{
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
}
最后,我们就可以在控制器中注入强配型配置, 并读取配置了
private readonly Settings _settings;
public HomeController(IOptions<Settings> settings)
{
_settings = settings.Value;
}
public IActionResult Index()
{
ViewData["configval"] = _settings.Config1;
ViewData["configval2"] = _settings.Config2;
return View();
}
最终效果

注意: 这里启动项目的时候如果出现未授权错误,你需要安装AWS CLI配置本地使用Access Key ID和Access Secret, 或者只用环境变量来设置Access Key ID和Access Secret。
其他优点
AWS的Parameter Store除了免费之外,还提供了一个历史记录功能。你可以每个版本配置的更改内容和操作人。

另外AWS团队还编写一个针对.NET Core的扩展,使用这个扩展,当你的配置发生变化的时候,.NET Core应用可以自动刷新配置信息。
Azure
微软近期刚刚推出了Azure App Configuration服务的预览版。这个服务可以帮助你集中你的配置。这是一个全新的服务,下面让我们看一看如何使用它。
使用配置服务添加配置
首先,我们可以通过Azure管理站点,搜索configuration服务, 图中的App Configuration就是我们所需的服务。

下一步,我们来创建一个配置组,这里我将配置组命名为lamond-config

添加完成之后,我们就可以在Key-Value Explorer面板中为当前配置组添加配置信息了

和前面AWS的例子一样,我们添加2个配置值。

这样配置工作就完成了,接下来我们编写代码使用.NET Core读取App Configuration服务中的配置。
如何从代码中读取配置
这里我重新创建了一个新的ASP.NET Core API站点,并添加程序集
Microsoft.Extensions.Configuration.AzureAppConfiguration
项目创建成功后,我们首先添加一个Settings类
public class Settings
{
public string Config1 { get; set; }
public string Config2 { get; set; }
}
下一步,我们需要更新Program.cs文件,启动Azure App Configuration
public class Program
{
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((hostingContext, config) =>
{
var settings = config.Build();
config.AddAzureAppConfiguration("[xxx]");
})
.UseStartup<Startup>();
}
这里我们需要将Azure App Configuration的连接字符串放在这里。
第三步,我们依然要在ConfigureServices方法中进行强类型配置绑定
public void ConfigureServices(IServiceCollection services)
{
services.Configure<Settings>(Configuration.GetSection("lamond-config"));
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}
最后,我们就可以在API中读取强类型配置了
[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
private Settings _settings;
public ValuesController(IOptions<Settings> settingsAccessor)
{
_settings = settingsAccessor.Value;
}
// GET api/values
[HttpGet]
public ActionResult<IEnumerable<string>> Get()
{
return new List<string> { _settings.Config1, _settings.Config2 };
}
}
最终效果
启动项目后,配置从Azure App Configuration中正确读取了。

其他优点
与AWS Parameter Store类似,Azure App Configuration也提供了配置的审计功能,你可以查看每个配置的历史记录和修改人。除此之外,Azure App Configuration还提供了一个Label功能,使用该功能可以为同一个配置设置不同环境下的值。
例如下图中,我添加了一个lamond-config:config3的配置项,当运行环境是qa的时候读取的值是1,当运行环境是dev的时候值是2

总结
今天给大家分享了一下,如何使用AWS Parameter Store和Azure App Configuration来存储配置信息,并且给出了如何使用.NET Core加载配置服务中的配置项。其实原文中还介绍了Spring Cloud Config, 有兴趣的同学也可以去试一下。
如何使用AWS和Azure的配置存储服务保存读取配置的更多相关文章
- AspNet Core 程序写入配置信息并再次读取配置信息
1.首先创见Core控制台应用程序 并且引入 AspNetCore.All 首先我们写入配置信息:直接代码如下 //配置信息的根对象 public static IConfigurationRoo ...
- MFC Tips(一) 在程序内部 保存读取配置
//保存 CWinApp *pApp = AfxGetApp(); pApp->WriteProfileBinary(..); //保存结构体 pApp->WriteProfileInt( ...
- 玩转Windows Azure存储服务——高级存储
在上一篇我们把Windows Azure的存储服务用作网盘,本篇我们继续挖掘Windows Azure的存储服务——高级存储.高级存储自然要比普通存储高大上的,因为高级存储是SSD存储!其吞吐量和IO ...
- 玩转Windows Azure存储服务——网盘
存储服务是除了计算服务之外最重要的云服务之一.说到云存储,大家可以想到很多产品,例如:AWS S3,Google Drive,百度云盘...而在Windows Azure中,存储服务却是在默默无闻的工 ...
- OpenStack-Ocata版+CentOS7.6 云平台环境搭建 —9.块存储服务(cinder)部署配置
块存储服务部署相关块存储服务(cinder)为实例提供块存储.存储的分配和消耗是由块存储驱动器,或者多后端配置的驱动器决定的.还有很多驱动程序可用:NAS/SAN,NFS,ISCSI,Ceph等.典型 ...
- Openstack入门篇(十七)之Cinder服务-->安装并配置一个本地存储节点
怎样为块存储服务安装并配置存储节点.为简单起见,这里配置一个有一个空的本地块存储设备的存储节点.这个向导用的是 /dev/sdb,此处选用linux-node1节点作为存储节点,需要在vmware中添 ...
- 025-Cinder服务-->安装并配置一个本地存储节点(ISCSI)
一:Cinder提供块级别的存储服务,块存储提供一个基础设施为了管理卷,以及和OpenStack计算服务交互,为实例提供卷.此服务也会激活管理卷的快照和卷类型的功能,块存储服务通常包含下列组件:cin ...
- Python项目读取配置的几种方式
1. 将配置写在Python文件中 配置文件(config.py 或 settings.py) 通常放置在程序源代码的目录,方便引用 配置文件 # settings.py class Config(o ...
- 10.OpenStack块存储服务
添加块存储服务 安装和配置控制器节点 创建数据库 mysql -uroot -ptoyo123 CREATE DATABASE cinder; GRANT ALL PRIVILEGES ON cind ...
随机推荐
- 微信小程序UI组件、开发框架、实用库...
UI组件 weui-wxss ★852 - 同微信原生视觉体验一致的基础样式库 Wa-UI ★122 - 针对微信小程序整合的一套UI库 wx-charts ★105 - 微信小程序图表工具 wema ...
- hadoop HA 详解
NameNode 高可用整体架构概述 在 Hadoop 1.0 时代,Hadoop 的两大核心组件 HDFS NameNode 和 JobTracker 都存在着单点问题,这其中以 NameNode ...
- 由清除float原理到BFC
关于浮动 设置为浮动的元素会脱离当前文档流,向左或向右移动直到边缘遇到另一个浮动元素或者到达边界.普通元素不会对齐造成影响. 浮动是把双刃剑,在给我们的布局带来便利的同时有一些缺点需要我们去解决.例如 ...
- TX2 安装 ROS 依赖库错误解决办法
一.更换ubuntu 16.04 更新源 1. 更新源 deb http://mirrors.ustc.edu.cn/ubuntu-ports/ xenial main multiverse rest ...
- 从CSDN到cnblogs
博客热的年代,我也赶潮流,开了不少,以前的blogbus博客大巴,CSDN,以及MSN space,再到新浪博客,微博... 提笔写的热情越来越少,这次准备重新整理以前在CSTQB.业界分享的一些内容 ...
- PAT1112:Stucked Keyboard
1112. Stucked Keyboard (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue On a ...
- @Controller和@RestController之间的区别
1. Controller, RestController的共同点 都是用来表示Spring某个类的是否可以接收HTTP请求 2. Controller, RestController的不同点 @Co ...
- 使用Github来管理的代码片段
代码片段介绍 xcode4引入了一个新feature: code snippets,在整个界面的右下角,可以通过快捷键:cmd + ctrl + opt + 2 调出来.code snippets是一 ...
- 剑指Offer_编程题之二维数组中的查找
题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数.
- JQ无缝轮播图-插件封装
类似京东的这种无缝轮播效果: 实例代码下载 HTML代码: <body> <!-- /*觅me 探索生活*/ --> <div class="test" ...