mirror of
https://github.com/anjoy8/Blog.Core.git
synced 2024-09-20 23:48:27 +08:00
Added Apollo configuration center
This commit is contained in:
parent
4b9448a080
commit
ed7bc9afc6
|
@ -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>
|
||||
服务管理
|
||||
|
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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) =>
|
||||
|
|
18
Blog.Core.Api/appsettings.apollo.json
Normal file
18
Blog.Core.Api/appsettings.apollo.json
Normal file
|
@ -0,0 +1,18 @@
|
|||
{
|
||||
//apollo 配置
|
||||
"Apollo": {
|
||||
"Enable": true,
|
||||
"Config": {
|
||||
"AppId": "blog.core",
|
||||
"Env": "DEV",
|
||||
"MetaServer": "http://localhost:8080/",
|
||||
"ConfigServer": [ "http://localhost:8080/" ]
|
||||
},
|
||||
"Namespaces": [ //Namespaces的数据格式Properties,Xml,Json,Yml,Yaml,Txt
|
||||
{
|
||||
"Name": "test",
|
||||
"Format": "json"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
27
Blog.Core.Extensions/Apollo/ApolloOptions.cs
Normal file
27
Blog.Core.Extensions/Apollo/ApolloOptions.cs
Normal 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; }
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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
|
||||
|
||||
}
|
||||
}
|
|
@ -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" />
|
||||
|
|
Loading…
Reference in New Issue
Block a user