如何使用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,一经查实,立即删除!

相关文章

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&#…

.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、编写脚本进行日志切割的…

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;有多种单位描…

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

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

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

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

NET Core微服务之路:实战SkyWalking+Exceptionless体验生产下追踪系统

前言当一个APM或一个日志中心实际部署在生产环境中时&#xff0c;是有点力不从心的。比如如下场景分析的问题&#xff1a;从APM上说&#xff0c;知道某个节点出现异常&#xff0c;或延迟过过高&#xff0c;却不能及时知道日志反馈情况&#xff0c;总不可能去相应的节点上一个一…

.NET 中创建支持集合初始化器的类型

对象初始化器和集合初始化器只是语法糖&#xff0c;但是能让你的代码看起来更加清晰。至少能让对象初始化的代码和其他业务执行的代码分开&#xff0c;可读性会好一些。本文将编写一个类型&#xff0c;可以使用集合初始化器构造这个类型。不只是添加元素的集合初始化器&#xf…

【无码专区8】三角形二维数点——计数有多少个给定点落在三角形区域内

因为只有std&#xff0c;没有自我实现&#xff0c;所以是无码专区 主要是为了训练思维能力 solution才是dls正解&#xff0c;但是因为只有潦草几句&#xff0c;所以大部分会有我自己基于正解上面的算法实现过程&#xff0c;可能选择的算法跟std中dls的实现不太一样。 std可能…

为什么我的会话状态在ASP.NET Core中不工作了?

原文&#xff1a;Why isnt my session state working in ASP.NET Core? Session state, GDPR, and non-essential cookies作者&#xff1a;Andrew Lock译文&#xff1a;https://www.cnblogs.com/lwqlun/p/10526380.html译者&#xff1a;Lamond Lu在本篇博客中&#xff0c;我将…

现身说法:实际业务出发分析百亿数据量下的多表查询优化

今天给大家带来的讨论主题是通过实战经验来对百亿数据量下的多表数据查询进行优化&#xff0c;俗话说的好&#xff0c;一切脱离业务的架构都是耍流氓&#xff0c;接下来我就整理一下今天早上微信群里石头哥给大家分享的百亿数据量多表查询架构以及优化思路。由于本文内容整理自…

Help Jimmy POJ - 1661

Help Jimmy POJ - 1661 题意&#xff1a; 场景中包括多个长度和高度各不相同的平台。地面是最低的平台&#xff0c;高度为零&#xff0c;长度无限。 Jimmy老鼠在时刻0从高于所有平台的某处开始下落&#xff0c;它的下落速度始终为1米/秒。当Jimmy落到某个平台上时&#xff0c…

ASP.NET Core 沉思录 - ServiceProvider 的二度出生

ASP.NET Core 终于将几乎所有的对象创建工作都和依赖注入框架集成了起来。并对大部分的日常工作进行了抽象。使得整个框架扩展更加方便。各个部分的集成也更加容易。今天我们要思考的部分仍然是从一段每一个工程中都大同小异的代码开始的。IWebHostBuilder CreateWebHostBuilde…

Acwing 216. Rainbow的信号

Acwing 216. Rainbow的信号 题意&#xff1a; 给你n个数&#xff0c;在这n个数中&#xff0c;等概率地选取两个数l&#xff0c;r&#xff0c;如果l>r,则交换l,r 把信号中的第 l 个数到第 r 个数取出来&#xff0c;构成一个数列 P。 A 部分对话的密码是数列 P 的 xor 和的…

合肥.NET技术社区首次线下聚会全程回顾【多图】

2019年3月16日对于合肥.NET来说是一个特别的日子&#xff0c;因为这是合肥.NET技术社区首次非正式线下聚会&#xff01;这次聚会受场地限制&#xff08;毕竟是聚餐的形式&#xff09;&#xff0c;即使换成了小椅子后&#xff0c;最多也只能容纳24个人&#xff0c;所以还有一些小…

SignalR第一节-在5分钟内完成通信连接和消息发送

前言首先声明&#xff0c;这又是一个小白从入门到进阶系列。 SignalR 这个项目我关注了很长时间&#xff0c;中间好像还看到过微软即将放弃该项目的消息&#xff0c;然后我也就没有持续关注了&#xff0c;目前的我项目中使用的是自己搭建的 WebSocket &#xff0c;连接管理和消…