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>
|
</summary>
|
||||||
<param name="id"></param>
|
<param name="id"></param>
|
||||||
</member>
|
</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">
|
<member name="T:Blog.Core.Api.Controllers.NacosController">
|
||||||
<summary>
|
<summary>
|
||||||
服务管理
|
服务管理
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
using AutoMapper;
|
using AutoMapper;
|
||||||
|
using Blog.Core.Common;
|
||||||
using Blog.Core.Common.HttpContextUser;
|
using Blog.Core.Common.HttpContextUser;
|
||||||
using Blog.Core.Common.HttpRestSharp;
|
using Blog.Core.Common.HttpRestSharp;
|
||||||
using Blog.Core.Common.WebApiClients.HttpApis;
|
using Blog.Core.Common.WebApiClients.HttpApis;
|
||||||
|
@ -12,6 +13,7 @@ using Blog.Core.Model.Models;
|
||||||
using Blog.Core.Model.ViewModels;
|
using Blog.Core.Model.ViewModels;
|
||||||
using Microsoft.AspNetCore.Authorization;
|
using Microsoft.AspNetCore.Authorization;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
|
using Microsoft.Extensions.Configuration;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.ComponentModel.DataAnnotations;
|
using System.ComponentModel.DataAnnotations;
|
||||||
|
@ -349,5 +351,23 @@ namespace Blog.Core.Controllers
|
||||||
public void Delete(int id)
|
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 Autofac.Extensions.DependencyInjection;
|
||||||
|
using Blog.Core.Extensions.Apollo;
|
||||||
using Microsoft.AspNetCore.Hosting;
|
using Microsoft.AspNetCore.Hosting;
|
||||||
using Microsoft.Extensions.Configuration;
|
using Microsoft.Extensions.Configuration;
|
||||||
using Microsoft.Extensions.Hosting;
|
using Microsoft.Extensions.Hosting;
|
||||||
|
@ -25,6 +26,8 @@ namespace Blog.Core
|
||||||
config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: false)
|
config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: false)
|
||||||
//.AddJsonFile($"appsettings{ GetAppSettingsConfigName() }json", optional: true, reloadOnChange: false)
|
//.AddJsonFile($"appsettings{ GetAppSettingsConfigName() }json", optional: true, reloadOnChange: false)
|
||||||
;
|
;
|
||||||
|
//接入Apollo配置中心
|
||||||
|
config.AddConfigurationApollo("appsettings.apollo.json");
|
||||||
})
|
})
|
||||||
.UseUrls("http://*:8081")
|
.UseUrls("http://*:8081")
|
||||||
.ConfigureLogging((hostingContext, builder) =>
|
.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="AspNetCoreRateLimit" Version="3.0.5" />
|
||||||
<PackageReference Include="Autofac.Extensions.DependencyInjection" Version="6.0.0" />
|
<PackageReference Include="Autofac.Extensions.DependencyInjection" Version="6.0.0" />
|
||||||
<PackageReference Include="Autofac.Extras.DynamicProxy" Version="5.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="Consul" Version="1.6.1.1" />
|
||||||
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="3.1.9" />
|
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="3.1.9" />
|
||||||
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="3.1.9" />
|
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="3.1.9" />
|
||||||
|
|
Loading…
Reference in New Issue
Block a user