这两年微服务比较火,最近想自己弄弄微服务,目前dotnet core 还没有特别成熟的框架,实现微服务,首先要解决配置中心的问题。

不管是不是使用微服务,节点多了,配置文件不可能一个一个的改,目前也有很多成熟的配置中心解决方案,比如携程的阿波罗,Consul官方也提供了Consul-Template,但是我想自己基于Consul实现一个比较轻量级配置中心方案,要使用方便。

dotnet core 本身就提供了一套配置解决方案,https://github.com/aspnet/Configuration/tree/release/2.0/src,并且提供了抽象。关于donet core 配置系统,我在此也不做描述,推荐大家关注“大内老A”这个公众号,里面有关于这方面的文章,写得非常的详细。篇文章链接:
https://mp.weixin.qq.com/s/u6v0WYVSjk4wHoH14Nxw6Q
https://mp.weixin.qq.com/s/5MB0DQB2HAK02A6e6NjjkQ
https://mp.weixin.qq.com/s/vB7AdoA5AMDDktb8skvqlg
https://mp.weixin.qq.com/s/EjSHaa0JY8lbfARNuBkRnA
https://mp.weixin.qq.com/s/vpenPw8pjC_irnm47f048A
https://mp.weixin.qq.com/s/V7o5_GJpC8UZh_cwlDqEbA
https://mp.weixin.qq.com/s/4SE44lM-crzqH4nrDwkfLg
https://mp.weixin.qq.com/s/fUoaT-Ib4QSS05y3VA0HOQ
https://mp.weixin.qq.com/s/E2FBwOfIS9vl6--q9im6Hw
https://mp.weixin.qq.com/s/3Tg63kvHZjtuCGzEDdi3QQ
https://mp.weixin.qq.com/s/5Z7mX5JqJpu32mXmL19y0w

实现逻辑: 最关键的一个抽象类ConfigurationProvider,重写Load方法,监听consul,如果key/value被修改了就触发ReLoad方法。
源码:
https://github.com/ww198643/Extensions.Configuration.Consul

使用

配置
硬编码配置

  public class Program
	{
		public static void Main(string[] args)
		{
			CreateWebHostBuilder(args).Build().Run();
		}
		public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
			WebHost.CreateDefaultBuilder(args).ConfigureAppConfiguration((context, config) =>
			{
				config.AddConsul("http://127.0.0.1:8500");
			}).UseStartup<Startup>();
	  }

通过命令行配置

  public class Program
	{
		public static void Main(string[] args)
		{
			CreateWebHostBuilder(args).Build().Run();
		}
		public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
			WebHost.CreateDefaultBuilder(args).ConfigureAppConfiguration((context, config) =>
			{
				config.AddConsul(args);
			}).UseStartup<Startup>();
	  }

支持的命令

CommandDescribetion
consul-configuration-addrConsul agent address
consul-configuration-tokenACL Token HTTP API
consul-configuration-dcConsul data center
consul-configuration-folderPrefix of key

监听kv是否被修改,如果修改了就更新配置

    public void ConfigureServices(IServiceCollection services)
		{
			services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
			services.AddConsulConfigurationCenter();
		}

获取配置

    public void ConfigureServices(IServiceCollection services)
		{
			services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
			services.AddConsulConfigurationCenter();
			services.Configure<Configs>(Configuration.GetSection("TestConfig"));
		}
  public class TestClass
	{
		private Configs Config;
		public TestClass(IOptionsSnapshot<Configs> config)
		{
			Config = config.Value;
		}
	}
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐