1. 程式人生 > >ASP.NET Core通過Nacos SDK讀取阿里雲ACM

ASP.NET Core通過Nacos SDK讀取阿里雲ACM

## 背景 前段時間,cranelee 在Github上給老黃提了個issues, 問到了如何用Nacos的SDK訪問阿里雲ACM。 https://github.com/catcherwong/nacos-sdk-csharp/issues/13 剛看到這個issues的時候,老黃也是覺得一臉懵逼,好像這兩者沒有什麼必然聯絡,開啟ACM的文件一看,就知道為什麼了。 ![](https://img2020.cnblogs.com/blog/558945/202006/558945-20200608082226235-1967191421.png) 原來Java和Go的已經是可以用nacos的SDK來訪問的了。那就說明兩者是相容的。 這段時間抽空看了一下,把這個功能基本實現了。 下面就簡單介紹一下。 ## 簡單看看ACM 開通ACM之後,可以看到類似這樣的介面。其實和Nacos控制檯的配置部分差不遠。 ![](https://img2020.cnblogs.com/blog/558945/202006/558945-20200608082246758-671518738.png) 要使用這個的話,需要幾個東西,一個是ACM上面的名稱空間,一個是AccessKey ID,一個是AccessKey Secret。 其中的AK/SK可以在名稱空間詳情裡面獲取。 ![](https://img2020.cnblogs.com/blog/558945/202006/558945-20200608082306388-1562665722.png) 然後就是新增配置了。 ![](https://img2020.cnblogs.com/blog/558945/202006/558945-20200608082321652-1080980732.png) 三張圖,看個大概就好了,下面來具體看看在.NET Core中怎麼使用。 ## 如何使用 ### 安裝最新預覽版的SDK ```xml ``` 注:目前還沒有釋出正式版,不過不影響正常使用了。 ### 修改Program ```cs public class Program { public static void Main(string[] args) { // 處理編碼問題 System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance); CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args) .ConfigureAppConfiguration((context, builder) => { // 這兩行程式碼就是關鍵 var c = builder.Build(); builder.AddNacosConfiguration(c.GetSection("NacosConfig")); }) .ConfigureWebHostDefaults(webBuilder =>
{ webBuilder.UseStartup(); }); } ``` ### 調整appsettings.json ```json { "NacosConfig": { "Optional": false, "DataId": "msconfigapp", "Group": "", "Tenant": "<換成您的名稱空間>", "ServerAddresses": [], "AccessKey": "<換成您的AK>", "SecretKey": "<換成您的SK>", "EndPoint": "acm.aliyun.com" } } ``` 注: 由於老黃開通個人開通的,沒有內網伺服器,所以用的是公網的EndPoint,這個需要根據情況自行調整。 ### 實體對映(非必須) ```cs public class AppSettings { public string Str { get; set; } public int Num { get; set; } public List Arr { get; set; } public SubObj SubObj { get; set; } } public class SubObj { public string a { get; set; } } ``` 為了方便和配置一一對應,可以建立實體,做一個對映。 加了這個的,需要在Startup上面配置一下。 ```cs public void ConfigureServices(IServiceCollection services) { // others ... services.Configure(Configuration.GetSection("AppSettings")); } ``` ### 讀取配置 這裡用控制器做為示例 ``` [ApiController] [Route("api/[controller]")] public class ConfigController : ControllerBase { private readonly ILogger _logger; private readonly IConfiguration _configuration; private readonly AppSettings _settings; private readonly AppSettings _sSettings; private readonly AppSettings _mSettings; public ConfigController( ILogger logger, IConfiguration configuration, IOptions options, IOptionsSnapshot sOptions, IOptionsMonitor _mOptions ) { _logger = logger; _configuration = configuration; _settings = options.Value; _sSettings = sOptions.Value; _mSettings = _mOptions.CurrentValue; } [HttpGet] public string Get() { string id = Guid.NewGuid().ToString("N"); _logger.LogInformation($"============== begin {id} ====================="); var conn = _configuration.GetConnectionString("Default"); _logger.LogInformation($"{id} conn = {conn}"); var version = _configuration["version"]; _logger.LogInformation($"{id} version = {version}"); var str1 = Newtonsoft.Json.JsonConvert.SerializeObject(_settings); _logger.LogInformation($"{id} IOptions = {str1}"); var str2 = Newtonsoft.Json.JsonConvert.SerializeObject(_sSettings); _logger.LogInformation($"{id} IOptionsSnapshot = {str2}"); var str3 = Newtonsoft.Json.JsonConvert.SerializeObject(_mSettings); _logger.LogInformation($"{id} IOptionsMonitor = {str3}"); _logger.LogInformation($"==============================================="); _logger.LogInformation($"==============================================="); _logger.LogInformation($"==============================================="); return "ok"; } } ``` 附上一張操作動圖 ![](https://img2020.cnblogs.com/blog/558945/202006/558945-20200608082349167-578209442.gif) 在ACM上修改之後,程式是可以馬上讀取到的。 下面是本文的示例程式碼。 https://github.com/catcherwong-archive/2020/tree/master/06/NacosACMDemo ## 小結 Nacos和ACM的操作基本都是一致的,比較不一樣的地方是,從直連Nacos變成要先去地址服務拿到Nacos的地址後再