微軟Azure配置中心 App Configuration (一):輕鬆整合到Asp.Net Core

語言: CN / TW / HK

寫在前面

在日常開發中,我這邊比較熟悉的配置中心有,攜程Apollo,阿里Nacos(配置中心,服務治理一體)

之前文章:

Asp.Net Core與攜程阿波羅(Apollo)的第一次親密接觸

總體來說,Apollo和Nacos社群都比較活躍,可能是後發優勢或者我們技術選型的原因,我們生產選用的是Nacos,我個人也是優先推薦Nacos(熟悉點,整合方便)。不管怎麼說兩者都是比較不錯的配置中心;

今天我帶來了另一個配置中心:微軟Azure App Configuration,希望給大家帶來一點技術選型上的幫助;

本文先講講微軟Azure配置中心 App Configuration 在Asp.Net Core中的整合;

本文假設你有一點點微軟雲Azure的瞭解,能建立和使用基本的服務,能大概知道什麼是雲平臺;

沒有Azure的話找個雙幣信用卡去開一個免費的(免費12個月);

先在Azure雲管理介面建立一個AppConfiguration

[Azure 管理後臺]搜尋找到App Configuration(我這裡是世紀互聯的)

https://portal.azure.cn/#home )

點這個create

新增資源分組服務名稱

  1. 資源分組就是當前建立這個服務的所在的分組(沒有點選Create new)
  2. 服務名稱就是當前建立服務名稱

建立後稍等一會就可以用了;

新增一些測試配置

OK,目前服務建立成功,且寫入了一些測試配置,後面看看怎麼在Asp.net Core裡面用了;

在Asp.Net Core中整合

基本使用

1、先隨便建立一個WebApi服務(我這裡用net6)

勾選啟用swagger

2、安裝nuget

install-package Microsoft.Azure.AppConfiguration.AspNetCore

3、appsetting.json加入連線字串

"ConnectionStrings": {
    "AppConfig": "<your app connection string >"
  },

4、修改Program.cs

var connectionString = builder.Configuration.GetConnectionString("AppConfig");

builder.Host.ConfigureAppConfiguration((hostingContext, config) =>
{
    ////簡單使用只配置connection string
    config.AddAzureAppConfiguration(connectionString);
});

5、使用

建立AzureConfigController

AzureConfigController
[Route("api/azure/config/[action]")]
    public class AzureConfigController : PassportApiController
    {
        private readonly ILogger _logger;
        private readonly IConfiguration _configuration;
        private readonly Settings _settings;

        public AzureConfigController(IConfiguration configuration, IAzureStorageApi azureStorageApi, IOptionsSnapshot<Settings> settings)
        {
            _configuration = configuration;
            _settings = settings.Value;
        }

        /// <summary>
        /// 讀取配置string
        /// </summary>
        /// <param name="key">The key.</param>
        /// <returns></returns>
        [HttpGet]
        public IActionResult Get(string key)
        {
            var result = _configuration[key];

            return Success("get config success", result);
        }

        /// <summary>
        /// 讀取配置物件
        /// </summary>
        /// <param name="key">The key.</param>
        /// <returns></returns>
        [HttpGet]
        public async Task<IActionResult> GetObject(string key)
        {
            var result = _configuration.GetSection(key).Get<AzureStorageConfig>();

            return Success("get config success", result);
        }
    }

讀取string配置

讀取配置的整個物件

物件key這樣配置:

AzureStorageConfig1:ConnectionString

AzureStorageConfig1:ContainerName

...

ok,就這麼簡單~

根據環境變數讀取配置

我們一般Asp.Net Core Web應用程式是用環境變數去載入不同配置的,一般我們的配置這樣:

appsettings.json
appsettings.<HostEnvironment>.json

同一個key的配置在不同Development和Production環境是可以不一樣的。

在Azure App Configuration ,引入一個 Label 的概念來實現;

修改整合程式碼:

builder.Host.ConfigureAppConfiguration((hostingContext, config) =>
{
    ////簡單使用只配置connection string
    //config.AddAzureAppConfiguration(connectionString);

    //配置不同功能
    config.AddAzureAppConfiguration(options =>
    {
        //啟用Label(多環境)支援
        options.Connect(connectionString)
            .Select(KeyFilter.Any, LabelFilter.Null)//配置過濾器,讀取空Lable的配置
            .Select(KeyFilter.Any, hostingContext.HostingEnvironment.EnvironmentName); //配置過濾器,只讀取某個環境的配置
    });
});

管理後臺給一個Key設定環境變數:

這樣 TestKey1 只有在對應環境變數才有值, TestKey2 在所有環境變數都有值(空Label);

測試

這裡簡單測下Development環境的

總結

目前只是一個非常簡單的整合,可以看到整合是非常簡單的。後面我們再講下怎麼主動更新配置,怎樣啟用功能開關等其他高階特性;

另外,我們這裡測試都是手填配置到Azure管理後臺,其實它也是支援配置的匯入匯出的,無需擔心;

原始碼

https://github.com/gebiWangshushu/Hei.Azure.Test

[參考]

https://docs.microsoft.com/en-us/azure/azure-app-configuration/overview