You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
Tiobon.Web.Core/Tiobon.Core.Extensions/Apollo/ConfigurationBuilderExtensi...

84 lines
3.4 KiB

using Com.Ctrip.Framework.Apollo;
using Microsoft.Extensions.Configuration;
using System;
using System.Collections.Generic;
using System.Linq;
using Com.Ctrip.Framework.Apollo.Enums;
using Com.Ctrip.Framework.Apollo.Logging;
using Microsoft.Extensions.Primitives;
using System.Reflection;
namespace Tiobon.Core.Extensions.Apollo
{
public static class ConfigurationBuilderExtensions
{
/// <summary>
/// 接入Apollo
/// </summary>
/// <param name="builder"></param>
/// <param name="jsonPath">apollo配置文件路径 如果写入appsettings.json中 则jsonPath传null即可</param>
public static void AddConfigurationApollo(this IConfigurationBuilder builder,string jsonPath)
{
if (!string.IsNullOrEmpty(jsonPath))
{
builder.AddJsonFile(jsonPath, true, false);
}
//阿波罗的日志级别调整
LogManager.UseConsoleLogging(LogLevel.Warn);
var options = new ApolloOptions();
var root = builder.Build();
root.Bind("Apollo", options);
if (options.Enable)
{
var apolloBuilder = builder.AddApollo(root.GetSection("Apollo:Config"));
foreach (var item in options.Namespaces)
{
apolloBuilder.AddNamespace(item.Name, MatchConfigFileFormat(item.Format));
}
//监听apollo配置
Monitor(builder.Build());
}
}
#region private
/// <summary>
/// 监听配置
/// </summary>
private static void Monitor(IConfigurationRoot root)
{
//TODO 需要根据改变执行特定的操作 如 mq redis 等其他跟配置相关的中间件
//TODO 初步思路:将需要执行特定的操作key和value放入内存字典中,在赋值操作时通过标准事件来执行特定的操作。
//要重新Build 此时才将Apollo provider加入到ConfigurationBuilder中
ChangeToken.OnChange(() => root.GetReloadToken(), () =>
{
foreach (var apolloProvider in root.Providers.Where(p => p is ApolloConfigurationProvider))
{
var property = apolloProvider.GetType().BaseType.GetProperty("Data", BindingFlags.Instance | BindingFlags.NonPublic);
var data = property.GetValue(apolloProvider) as IDictionary<string, string>;
foreach (var item in data)
{
Console.WriteLine($"key {item.Key} value {item.Value}");
}
}
});
}
//匹配格式
private static ConfigFileFormat MatchConfigFileFormat(string value) => value switch
{
"json" => ConfigFileFormat.Json,
"properties" => ConfigFileFormat.Properties,
"xml" => ConfigFileFormat.Xml,
"yml" => ConfigFileFormat.Yml,
"yaml" => ConfigFileFormat.Yaml,
"txt" => ConfigFileFormat.Txt,
_ => throw new FormatException($"与apollo命名空间的所允许的类型不匹配:{string.Join(",", GetConfigFileFormat())}"),
};
//获取数据格式对应的枚举
private static IEnumerable<string> GetConfigFileFormat() => Enum.GetValues<ConfigFileFormat>().Select(u => u.ToString().ToLower());
#endregion
}
}