Added Apollo configuration center

This commit is contained in:
867824092 2021-08-21 20:18:34 +08:00
parent 4b9448a080
commit ed7bc9afc6
7 changed files with 159 additions and 0 deletions

View File

@ -813,6 +813,11 @@
</summary>
<param name="id"></param>
</member>
<member name="M:Blog.Core.Controllers.ValuesController.GetConfigByAppllo(System.String)">
<summary>
此处的key格式为 xx:xx:x
</summary>
</member>
<member name="T:Blog.Core.Api.Controllers.NacosController">
<summary>
服务管理

View File

@ -1,4 +1,5 @@
using AutoMapper;
using Blog.Core.Common;
using Blog.Core.Common.HttpContextUser;
using Blog.Core.Common.HttpRestSharp;
using Blog.Core.Common.WebApiClients.HttpApis;
@ -12,6 +13,7 @@ using Blog.Core.Model.Models;
using Blog.Core.Model.ViewModels;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
@ -349,5 +351,23 @@ namespace Blog.Core.Controllers
public void Delete(int id)
{
}
#region Apollo
[HttpGet("/apollo")]
[AllowAnonymous]
public async Task<IEnumerable<KeyValuePair<string,string>>> GetAllConfigByAppllo([FromServices]IConfiguration configuration)
{
return await Task.FromResult(configuration.AsEnumerable());
}
/// <summary>
/// 此处的key格式为 xx:xx:x
/// </summary>
[HttpGet("/apollo/{key}")]
[AllowAnonymous]
public async Task<string> GetConfigByAppllo(string key)
{
return await Task.FromResult(Appsettings.app(key));
}
#endregion
}
}

View File

@ -1,4 +1,5 @@
using Autofac.Extensions.DependencyInjection;
using Blog.Core.Extensions.Apollo;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
@ -25,6 +26,8 @@ namespace Blog.Core
config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: false)
//.AddJsonFile($"appsettings{ GetAppSettingsConfigName() }json", optional: true, reloadOnChange: false)
;
//接入Apollo配置中心
config.AddConfigurationApollo("appsettings.apollo.json");
})
.UseUrls("http://*:8081")
.ConfigureLogging((hostingContext, builder) =>

View File

@ -0,0 +1,18 @@
{
//apollo
"Apollo": {
"Enable": true,
"Config": {
"AppId": "blog.core",
"Env": "DEV",
"MetaServer": "http://localhost:8080/",
"ConfigServer": [ "http://localhost:8080/" ]
},
"Namespaces": [ //NamespacesProperties,Xml,Json,Yml,Yaml,Txt
{
"Name": "test",
"Format": "json"
}
]
}
}

View File

@ -0,0 +1,27 @@

using System.Collections.Generic;
namespace Blog.Core.Extensions.Apollo
{
/// <summary>
/// Apollo配置项
/// </summary>
public class ApolloOptions
{
public bool Enable { get; set; }
public List<ChildNamespace> Namespaces { get; set; }
public class ChildNamespace
{
/// <summary>
/// 命名空间名字
/// </summary>
public string Name { get; set; }
/// <summary>
/// 数据格式 Json/Yml/Yaml等
/// </summary>
public string Format { get; set; }
}
}
}

View File

@ -0,0 +1,84 @@
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 Blog.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
}
}

View File

@ -8,6 +8,8 @@
<PackageReference Include="AspNetCoreRateLimit" Version="3.0.5" />
<PackageReference Include="Autofac.Extensions.DependencyInjection" Version="6.0.0" />
<PackageReference Include="Autofac.Extras.DynamicProxy" Version="5.0.0" />
<PackageReference Include="Com.Ctrip.Framework.Apollo" Version="2.4.4" />
<PackageReference Include="Com.Ctrip.Framework.Apollo.Configuration" Version="2.4.1.1" />
<PackageReference Include="Consul" Version="1.6.1.1" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="3.1.9" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="3.1.9" />