前言
最近項目逐步轉向基於.Net Core,目前dotnet core 雖然已出3.0了但還沒有特別成熟的框架,要實現微服務,必須要解決配置中心的問題 。不管是不是微服務,節點多了配置文件一個個更改非常麻煩,今天分享一個基於Consul 實現輕量級的配置中心方案。
實現思路基於Consul的Key/value ,多個Consul 節點之間可以自動同步配置,我們的程序中就是實現ConfigurationProvider,監聽Consul變化
代碼
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
using Winton.Extensions.Configuration.Consul;
namespace Bo.ServiceB
{
public class Program
{
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
}
public static IWebHostBuilder CreateWebHostBuilder(string[] args)
{
var cancellationTokenSource = new CancellationTokenSource();
return WebHost.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((hostingContext, config) =>
{
var env = hostingContext.HostingEnvironment;
hostingContext.Configuration = config.Build();
string consul_url = hostingContext.Configuration["Consul_Url"];
config.AddConsul(
$"{env.ApplicationName}/appsettings.{env.EnvironmentName}.json",
cancellationTokenSource.Token,
options =>
{
options.Optional = true;
options.ReloadOnChange = true;
options.OnLoadException = exceptionContext => { exceptionContext.Ignore = true; };
options.ConsulConfigurationOptions = cco => { cco.Address = new Uri(consul_url); };
}
).AddEnvironmentVariables();
hostingContext.Configuration = config.Build();
}).UseUrls("http://localhost:5012")
.UseStartup<Startup>();
}
}
}
Consul 中Key/Value 配置:
$"{env.ApplicationName}/appsettings.{env.EnvironmentName}.json",
env.ApplicationName :應用程序名稱 如:Bo.ServiceB
env.EnvironmentName: appsettings.Development.json

代碼中輸出AppName配置:
[HttpGet]
public string Get()
{
return HttpContext.Request.Host.Port + " " + Configuration["AppName"].ToString() + " " + DateTime.Now.ToString();
}

查看多個節點同步情況


源碼地址:https://github.com/zhangbojr/Consul-key-Value-.git
