ASP.NET Core通過Nacos SDK讀取阿里雲ACM
阿新 • • 發佈:2020-06-08
## 背景
前段時間,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的地址後再