如何使用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

640?wx_fmt=png

背景

我们创建的大部分.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。 从这里,我们可以编辑或删除现有参数,并创建新参数。

640?wx_fmt=png

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

640?wx_fmt=png

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

640?wx_fmt=png

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

640?wx_fmt=png

好的,以上我们就完成在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();
    }

最终效果

640?wx_fmt=png

注意: 这里启动项目的时候如果出现未授权错误,你需要安装AWS CLI配置本地使用Access Key ID和Access Secret, 或者只用环境变量来设置Access Key ID和Access Secret。

其他优点

AWS的Parameter Store除了免费之外,还提供了一个历史记录功能。你可以每个版本配置的更改内容和操作人。

640?wx_fmt=png

另外AWS团队还编写一个针对.NET Core的扩展,使用这个扩展,当你的配置发生变化的时候,.NET Core应用可以自动刷新配置信息。

Azure

微软近期刚刚推出了Azure App Configuration服务的预览版。这个服务可以帮助你集中你的配置。这是一个全新的服务,下面让我们看一看如何使用它。

使用配置服务添加配置

首先,我们可以通过Azure管理站点,搜索configuration服务, 图中的App Configuration就是我们所需的服务。

640?wx_fmt=png

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

640?wx_fmt=png

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

640?wx_fmt=png

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

640?wx_fmt=png

这样配置工作就完成了,接下来我们编写代码使用.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中正确读取了。

640?wx_fmt=png

其他优点

与AWS Parameter Store类似,Azure App Configuration也提供了配置的审计功能,你可以查看每个配置的历史记录和修改人。除此之外,Azure App Configuration还提供了一个Label功能,使用该功能可以为同一个配置设置不同环境下的值。

例如下图中,我添加了一个lamond-config:config3的配置项,当运行环境是qa的时候读取的值是1,当运行环境是dev的时候值是2

640?wx_fmt=png

总结

今天给大家分享了一下,如何使用AWS Parameter Store和Azure App Configuration来存储配置信息,并且给出了如何使用.NET Core加载配置服务中的配置项。其实原文中还介绍了Spring Cloud Config, 有兴趣的同学也可以去试一下。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/316793.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基站建设(三元环计数+根号分治 / bitset)

基站建设problemsolutioncodeproblem 给定 nnn 个地点&#xff0c;以及每个地点的可靠度 RiR_iRi​。 有 mmm 条光纤架&#xff0c;每一条连接两个不同的地点&#xff0c;且是双向的。 测试基站由 444 个信号塔&#xff0c;有 222 个主信号塔和 222 个副信号塔。 要求主信号…

CF1060F Shrinking Tree(期望、树形dp)

解析 神题。 把每个节点提到根 rt 单独考虑。 设 dpi,jdp_{i,j}dpi,j​ 表示当 rt 进入 i 时子树内还有 j 条边未合并的方案的期望之和&#xff0c;gi,jg_{i,j}gi,j​ 表示当 rt 进入 i 的父亲时 i 的子树内&#xff08;包括连向父亲的边&#xff09;还有 j 条边未合并的方案…

Meaningless Sequence Gym - 102832D

Meaningless Sequence Gym - 102832D 题意&#xff1a; 给你n和c&#xff0c;an的公式如下图 让你求a0…an的和&#xff0c;mod 1e97 题解&#xff1a; 训练时推了好一阵子才和队友推出 我看网上正解为&#xff1a; 一个数的大小与它的二进制表示中的1的个数有关 ac(二进制…

【.NET Core项目实战-统一认证平台】第十六章 网关篇-Ocelot集成RPC服务

一、什么是RPCRPC是“远程调用&#xff08;Remote Procedure Call&#xff09;”的一个名称的缩写&#xff0c;并不是任何规范化的协议&#xff0c;也不是大众都认知的协议标准&#xff0c;我们更多时候使用时都是创建的自定义化&#xff08;例如Socket&#xff0c;Netty&#…

【学习笔记】无向图、有向图的三元环、四元环计数问题(根号分支+bitset)

三元环计数和四元环计数问题无向图三元环计数问题根号分治bitset无向图四元环计数问题有向图三四元环计数问题无向图三元环计数问题 根号分治 记 di:id_i:idi​:i 在原图中的度数。 按照以下规则改写无向图为有向图&#xff1a; 对于一条边 u,vu,vu,v。 如果两点度数不同&a…

.net Core2.2 WebApi通过OAuth2.0实现微信登录

前言微信相关配置请参考 微信公众平台 的这篇文章。注意授权回调域名一定要修改正确。微信网页授权是通过OAuth2.0机制实现的&#xff0c;所以我们可以使用 https://github.com/china-live/QQConnect 这个开源项目提供的中间件来实现微信第三方登录的流程。开发流程1、新建一个…

Nginx优化(重点)与防盗链(新版)

Nginx优化(重点)与防盗链 Nginx优化(重点)与防盗链一、隐藏Nginx版本号1、修改配置文件2、修改源代码 二、修改Nginx用户与组1、编译安装时指定用户与组2、修改配置文件指定用户与组 三、配置Nginx网页的缓存时间四、实现Nginx的日志切割1、data的用法2、编写脚本进行日志切割的…

Almost Sorted Array HDU - 5532

Almost Sorted Array HDU - 5532 题意&#xff1a; 如果一个数组的元素“按非递减或非递增顺序排列”&#xff0c;那么称这个数组有序。现在&#xff0c;LYD给了你一个数组a&#xff0c;他让你从中选择并移除仅仅1个元素&#xff0c;请问剩下的元素构成的数组有可能是有序的吗…

CF906D:Power Tower(拓展欧拉定理、暴力)

解析 大降智题。 受相逢是问候的影响&#xff0c;第一眼直接线段树&#xff0c;写完WA完才发现这个玩意没有结合律。 然后开始用 xyz(xy)yz−1x^{y^z}(x^y)^{y^{z-1}}xyz(xy)yz−1 这样的东西嗯做&#xff0c;结果只是在玩泥巴。 lemma&#xff1a;迭代求 φ\varphiφ 的次数是…

CodeForces730E Award Ceremony(拓扑排序+结论)

CF730E. Award Ceremonyproblemsolutioncodeproblem 题目链接 题目大意&#xff1a; 给出 nnn 个队封榜时的榜单 aia_iai​ 和揭榜时的变化情况 did_idi​。 揭榜时&#xff0c;这个队的名次会变化 tit_iti​。 注意在别的队揭榜时&#xff0c;自己队的排名也是动态变化的…

.Netcore 2.0 Ocelot Api网关教程(番外篇)- Ocelot v13.x升级

由于Ocelot系列博客好久没更新&#xff08;差不多有10个月的时间了&#xff09;&#xff0c;在此先说声抱歉&#xff0c;Ocelot系列会继续更新下去。在写上一篇配置管理的时候发现官方文档已经和以前的不一样&#xff0c;而Ocelot也从5.0版本更新到了13.x版本&#xff0c;进行了…

CF765F Souvenirs(暴力、线段树)

解析 比较神奇的一道题。 考虑一个常规套路&#xff1a;把询问离线&#xff0c;移动右端点&#xff0c;维护左端点答案。 考虑暴力维护&#xff0c;对于当前的 aixa_ixai​x&#xff0c;左侧如图所示的这两条线上的点都可以产生新的可能答案。 容易构造使得单次产生的新点是…

Hard Disk Drive HDU - 4788

Hard Disk Drive HDU - 4788 题意&#xff1a; 通常制造商认为1“kilo”等于1000&#xff0c;但操作系统会认为是1024。 因此&#xff0c;当你购买了一个100MB的硬盘&#xff0c;电脑却只显示大约有95MB&#xff0c;这缺失了大约5MB。 对于硬盘的大小&#xff0c;有多种单位描…

货币系统(二分)

problem 【题目描述】 你在 NOIP 2018 的赛场上遇到了「货币系统」一题。你没有写出这题&#xff0c;导致网友的国度简化货币系统的任务失败了。网友的国度的货币系统现在十分混乱。 网友的国度现今有两套货币系统「忘忧」和「网游」。为了方便使用&#xff0c;它们有一个共用…

ASP.NET Core 沉思录 - 环境的思考

我的博客换新家啦&#xff0c;新的地址为&#xff1a;https://clrdaily.com :-D今天我们来一起思考一下如何在不同的环境应用不同的配置。这里的配置不仅仅指 IConfiguration 还包含 IWebHostBuilder 的创建过程和 Startup 的初始化过程。0 太长不读环境造成的差异在架构中基本…

区域赛铜牌专题(一)

区域赛铜牌专题 题号题目知识点HDU 5532Almost Sorted Array贪心,LISHDU 5533Dancing Stars on MeHDU 5536Chip FactoryHDU 5538House BuildingHDU 5510BazingaHDU 5512PagodasHDU 4788Hard Disk DriveHDU 4821String计蒜客 42405TriangleHDU 4810Wall PaintingHDU 4771Steali…

P3581 [POI2015] CZA(状压)

解析 不能在一条思路上死磕&#xff01; 首先这题真正考的其实就是 p3p3p3。 乍一看题意&#xff1a;给出一张特殊图&#xff0c;求哈密顿回路方案数。 然后发现这个图性质不咋地。 然后就不会了。 … 正解根本和哈密顿回路毛关系也没有&#xff01; 考虑从1-n依次插入。 注…

[Wf2011]Chips Challenge(最小费用最大流)

[Wf2011]Chips Challengeproblemsolutioncodeproblem BZOJ2673 solution . 首先得知道这是网络流&#xff0c;但真的看不出来啊&#xff01;&#xff01;我真的郁闷啊(&#xffe3;﹏&#xffe3;&#xff1b;) 在知道做法是网络流后&#xff0c;初读题&#xff0c;肯定会…

深度:从 Office 365 新图标来看微软背后的设计新理念

开始表演请关注我的公众号“寒树Office”来获取一些新鲜而有趣的新闻与知识&#xff0c;最近又有两家俱乐部上线了&#xff08;东莞与长沙&#xff09;&#xff0c;俱乐部的活动告一段落&#xff0c;接下来的日子里我将持续与大家分享 Office 365 的精彩内容&#xff0c;这次很…

BZOJ4294 : [PA2015]Fibonacci(dfs、暴力、数位dp)

解析 新定义数位dp了属于是。 结论&#xff1a;斐波拉契在模 10m10^m10m 的意义下循环节为 6*10^m。 但这个不一定是最小循环节&#xff0c;我自己做的时候打表得出来的循环节更小。 考虑从低到高枚举周期中的位置&#xff0c;暴力check合法进行剪枝。 跑的飞快&#xff0c;O…