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

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

65831-20190312105542477-251241049.png

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

65831-20190312105548987-751933955.png

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

65831-20190312105554035-1553894152.png

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

65831-20190312105557967-1680727379.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();
    }

最终效果

65831-20190312105611092-1062413591.png

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

其他优点

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

65831-20190312105617056-1585593386.png

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

Azure

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

使用配置服务添加配置

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

65831-20190312105622067-1144908400.png

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

65831-20190312105626979-2132264640.png

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

65831-20190312105631657-233593515.png

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

65831-20190312110135594-1266893004.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中正确读取了。

65831-20190312105646025-396487177.png

其他优点

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

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

65831-20190312105650208-745437277.png

总结

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

转载于:https://www.cnblogs.com/lwqlun/p/10508748.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值