优化FastGithubConfig

This commit is contained in:
xljiulang 2021-07-21 21:03:01 +08:00
parent 9f20fbeab8
commit 65a038a3a5
2 changed files with 45 additions and 27 deletions

View File

@ -6,6 +6,7 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="5.0.0" />
<PackageReference Include="Microsoft.Extensions.Options" Version="5.0.0" /> <PackageReference Include="Microsoft.Extensions.Options" Version="5.0.0" />
</ItemGroup> </ItemGroup>

View File

@ -1,4 +1,6 @@
using Microsoft.Extensions.Options; using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using System;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis; using System.Diagnostics.CodeAnalysis;
@ -12,51 +14,61 @@ namespace FastGithub
/// </summary> /// </summary>
public class FastGithubConfig public class FastGithubConfig
{ {
/// <summary> private readonly ILogger<FastGithubConfig> logger;
/// 域名与配置缓存
/// </summary>
[AllowNull]
private ConcurrentDictionary<string, DomainConfig?> domainConfigCache; private ConcurrentDictionary<string, DomainConfig?> domainConfigCache;
/// <summary> /// <summary>
/// 未污染的dns /// 未污染的dns
/// </summary> /// </summary>
[AllowNull]
public IPEndPoint PureDns { get; private set; } public IPEndPoint PureDns { get; private set; }
/// <summary> /// <summary>
/// 速度快的dns /// 速度快的dns
/// </summary> /// </summary>
[AllowNull]
public IPEndPoint FastDns { get; private set; } public IPEndPoint FastDns { get; private set; }
/// <summary> /// <summary>
/// 获取域名配置 /// 获取域名配置
/// </summary> /// </summary>
[AllowNull]
public Dictionary<DomainMatch, DomainConfig> DomainConfigs { get; private set; } public Dictionary<DomainMatch, DomainConfig> DomainConfigs { get; private set; }
/// <summary> /// <summary>
/// FastGithub配置 /// FastGithub配置
/// </summary> /// </summary>
/// <param name="options"></param> /// <param name="options"></param>
public FastGithubConfig(IOptionsMonitor<FastGithubOptions> options) /// <param name="logger"></param>
public FastGithubConfig(
IOptionsMonitor<FastGithubOptions> options,
ILogger<FastGithubConfig> logger)
{ {
this.Init(options.CurrentValue); this.logger = logger;
options.OnChange(opt => this.Init(opt));
var opt = options.CurrentValue;
this.domainConfigCache = new ConcurrentDictionary<string, DomainConfig?>();
this.PureDns = opt.PureDns.ToIPEndPoint();
this.FastDns = opt.FastDns.ToIPEndPoint();
this.DomainConfigs = opt.DomainConfigs.ToDictionary(kv => new DomainMatch(kv.Key), kv => kv.Value);
options.OnChange(opt => this.Update(opt));
} }
/// <summary> /// <summary>
/// 初始化 /// 更新配置
/// </summary> /// </summary>
/// <param name="options"></param> /// <param name="options"></param>
private void Init(FastGithubOptions options) private void Update(FastGithubOptions options)
{ {
this.domainConfigCache = new ConcurrentDictionary<string, DomainConfig?>(); try
this.PureDns = options.PureDns.ToIPEndPoint(); {
this.FastDns = options.FastDns.ToIPEndPoint(); this.domainConfigCache = new ConcurrentDictionary<string, DomainConfig?>();
this.DomainConfigs = options.DomainConfigs.ToDictionary(kv => new DomainMatch(kv.Key), kv => kv.Value); this.PureDns = options.PureDns.ToIPEndPoint();
this.FastDns = options.FastDns.ToIPEndPoint();
this.DomainConfigs = options.DomainConfigs.ToDictionary(kv => new DomainMatch(kv.Key), kv => kv.Value);
}
catch (Exception ex)
{
this.logger.LogError(ex.Message);
}
} }
/// <summary> /// <summary>
@ -77,14 +89,19 @@ namespace FastGithub
/// <returns></returns> /// <returns></returns>
public bool TryGetDomainConfig(string domain, [MaybeNullWhen(false)] out DomainConfig value) public bool TryGetDomainConfig(string domain, [MaybeNullWhen(false)] out DomainConfig value)
{ {
value = this.domainConfigCache.GetOrAdd(domain, GetDomainConfig); value = this.domainConfigCache.GetOrAdd(domain, this.GetDomainConfig);
return value != null; return value != null;
}
DomainConfig? GetDomainConfig(string domain) /// <summary>
{ /// 获取域名配置
var key = this.DomainConfigs.Keys.FirstOrDefault(item => item.IsMatch(domain)); /// </summary>
return key == null ? null : this.DomainConfigs[key]; /// <param name="domain"></param>
} /// <returns></returns>
private DomainConfig? GetDomainConfig(string domain)
{
var key = this.DomainConfigs.Keys.FirstOrDefault(item => item.IsMatch(domain));
return key == null ? null : this.DomainConfigs[key];
} }
} }
} }