合并后台服务

This commit is contained in:
陈国伟 2021-09-28 12:44:08 +08:00
parent c542c628f1
commit 249ff7a081
7 changed files with 111 additions and 153 deletions

View File

@ -116,20 +116,31 @@ namespace FastGithub.DomainResolve
/// <summary>
/// 停止dnscrypt-proxy
/// </summary>
public void Stop()
/// <returns></returns>
public bool Stop()
{
try
{
if (OperatingSystem.IsWindows())
{
StartDnscryptProxy("-service stop")?.WaitForExit();
StartDnscryptProxy("-service uninstall")?.WaitForExit();
}
if (this.process != null && this.process.HasExited == false)
{
this.process.Kill();
}
return true;
}
catch (Exception)
{
return false;
}
finally
{
this.LocalEndPoint = null;
}
}
/// <summary>
/// 启动DnscryptProxy进程

View File

@ -1,65 +0,0 @@
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using System;
using System.Threading;
using System.Threading.Tasks;
namespace FastGithub.DomainResolve
{
/// <summary>
/// DnscryptProxy后台服务
/// </summary>
sealed class DnscryptProxyHostedService : BackgroundService
{
private readonly ILogger<DnscryptProxyHostedService> logger;
private readonly DnscryptProxy dnscryptProxy;
/// <summary>
/// DnscryptProxy后台服务
/// </summary>
/// <param name="dnscryptProxy"></param>
/// <param name="logger"></param>
public DnscryptProxyHostedService(
DnscryptProxy dnscryptProxy,
ILogger<DnscryptProxyHostedService> logger)
{
this.dnscryptProxy = dnscryptProxy;
this.logger = logger;
}
/// <summary>
/// 启动dnscrypt-proxy
/// </summary>
/// <param name="stoppingToken"></param>
/// <returns></returns>
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
try
{
await this.dnscryptProxy.StartAsync(stoppingToken);
}
catch (Exception ex)
{
this.logger.LogWarning($"{this.dnscryptProxy}启动失败:{ex.Message}");
}
}
/// <summary>
/// 停止dnscrypt-proxy
/// </summary>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public override Task StopAsync(CancellationToken cancellationToken)
{
try
{
this.dnscryptProxy.Stop();
}
catch (Exception ex)
{
this.logger.LogWarning($"{this.dnscryptProxy}停止失败:{ex.Message}");
}
return base.StopAsync(cancellationToken);
}
}
}

View File

@ -0,0 +1,74 @@
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using System;
using System.Threading;
using System.Threading.Tasks;
namespace FastGithub.DomainResolve
{
/// <summary>
/// 域名解析后台服务
/// </summary>
sealed class DomainResolveHostedService : BackgroundService
{
private readonly DnscryptProxy dnscryptProxy;
private readonly DomainSpeedTester speedTester;
private readonly ILogger<DomainResolveHostedService> logger;
private readonly TimeSpan speedTestDueTime = TimeSpan.FromSeconds(10d);
private readonly TimeSpan speedTestPeriod = TimeSpan.FromMinutes(2d);
/// <summary>
/// 域名解析后台服务
/// </summary>
/// <param name="dnscryptProxy"></param>
/// <param name="speedTester"></param>
/// <param name="logger"></param>
public DomainResolveHostedService(
DnscryptProxy dnscryptProxy,
DomainSpeedTester speedTester,
ILogger<DomainResolveHostedService> logger)
{
this.dnscryptProxy = dnscryptProxy;
this.speedTester = speedTester;
this.logger = logger;
}
/// <summary>
/// 停止时
/// </summary>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public override async Task StopAsync(CancellationToken cancellationToken)
{
await this.speedTester.SaveDomainsAsync();
this.dnscryptProxy.Stop();
await base.StopAsync(cancellationToken);
}
/// <summary>
/// 后台任务
/// </summary>
/// <param name="stoppingToken"></param>
/// <returns></returns>
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
try
{
await this.dnscryptProxy.StartAsync(stoppingToken);
}
catch (Exception ex)
{
this.logger.LogWarning($"{this.dnscryptProxy}启动失败:{ex.Message}");
}
await Task.Delay(this.speedTestDueTime, stoppingToken);
await this.speedTester.LoadDomainsAsync(stoppingToken);
while (stoppingToken.IsCancellationRequested == false)
{
await this.speedTester.TestSpeedAsync(stoppingToken);
await Task.Delay(this.speedTestPeriod, stoppingToken);
}
}
}
}

View File

@ -13,19 +13,19 @@ namespace FastGithub.DomainResolve
sealed class DomainResolver : IDomainResolver
{
private readonly DnsClient dnsClient;
private readonly DomainSpeedTestService speedTestService;
private readonly DomainSpeedTester speedTester;
/// <summary>
/// 域名解析器
/// </summary>
/// <param name="dnsClient"></param>
/// <param name="speedTestService"></param>
/// <param name="speedTester"></param>
public DomainResolver(
DnsClient dnsClient,
DomainSpeedTestService speedTestService)
DomainSpeedTester speedTester)
{
this.dnsClient = dnsClient;
this.speedTestService = speedTestService;
this.speedTester = speedTester;
}
/// <summary>
@ -51,7 +51,7 @@ namespace FastGithub.DomainResolve
/// <returns></returns>
public async IAsyncEnumerable<IPAddress> ResolveAllAsync(string domain, [EnumeratorCancellation] CancellationToken cancellationToken)
{
var addresses = this.speedTestService.GetIPAddresses(domain);
var addresses = this.speedTester.GetIPAddresses(domain);
if (addresses.Length > 0)
{
foreach (var address in addresses)
@ -61,7 +61,7 @@ namespace FastGithub.DomainResolve
}
else
{
this.speedTestService.Add(domain);
this.speedTester.Add(domain);
await foreach (var address in this.dnsClient.ResolveAsync(domain, cancellationToken))
{
yield return address;

View File

@ -1,61 +0,0 @@
using Microsoft.Extensions.Hosting;
using System;
using System.Threading;
using System.Threading.Tasks;
namespace FastGithub.DomainResolve
{
/// <summary>
/// 域名的IP测速后台服务
/// </summary>
sealed class DomainSpeedTestHostedService : BackgroundService
{
private readonly DomainSpeedTestService speedTestService;
private readonly TimeSpan testDueTime = TimeSpan.FromMinutes(1d);
/// <summary>
/// 域名的IP测速后台服务
/// </summary>
/// <param name="speedTestService"></param>
public DomainSpeedTestHostedService(DomainSpeedTestService speedTestService)
{
this.speedTestService = speedTestService;
}
/// <summary>
/// 启动时
/// </summary>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public override async Task StartAsync(CancellationToken cancellationToken)
{
await this.speedTestService.LoadDataAsync(cancellationToken);
await base.StartAsync(cancellationToken);
}
/// <summary>
/// 停止时
/// </summary>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public override async Task StopAsync(CancellationToken cancellationToken)
{
await this.speedTestService.SaveDataAsync();
await base.StopAsync(cancellationToken);
}
/// <summary>
/// 后台测速
/// </summary>
/// <param name="stoppingToken"></param>
/// <returns></returns>
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (stoppingToken.IsCancellationRequested == false)
{
await this.speedTestService.TestSpeedAsync(stoppingToken);
await Task.Delay(this.testDueTime, stoppingToken);
}
}
}
}

View File

@ -13,9 +13,9 @@ namespace FastGithub.DomainResolve
/// <summary>
/// 域名的IP测速服务
/// </summary>
sealed class DomainSpeedTestService
sealed class DomainSpeedTester
{
private const string DATA_FILE = "domains.json";
private const string DOMAINS_JSON_FILE = "domains.json";
private readonly DnsClient dnsClient;
private readonly object syncRoot = new();
@ -25,7 +25,7 @@ namespace FastGithub.DomainResolve
/// 域名的IP测速服务
/// </summary>
/// <param name="dnsClient"></param>
public DomainSpeedTestService(DnsClient dnsClient)
public DomainSpeedTester(DnsClient dnsClient)
{
this.dnsClient = dnsClient;
}
@ -61,18 +61,18 @@ namespace FastGithub.DomainResolve
}
/// <summary>
/// 加载数据
/// 加载域名数据
/// </summary>
/// <param name="cancellationToken"></param>
/// <returns></returns>
public async Task LoadDataAsync(CancellationToken cancellationToken)
public async Task LoadDomainsAsync(CancellationToken cancellationToken)
{
if (File.Exists(DATA_FILE) == false)
if (File.Exists(DOMAINS_JSON_FILE) == false)
{
return;
}
using var fileStream = File.OpenRead(DATA_FILE);
using var fileStream = File.OpenRead(DOMAINS_JSON_FILE);
var domains = await JsonSerializer.DeserializeAsync<string[]>(fileStream, cancellationToken: cancellationToken);
if (domains == null)
{
@ -89,10 +89,10 @@ namespace FastGithub.DomainResolve
}
/// <summary>
/// 保存数据
/// 保存域名数据
/// </summary>
/// <returns></returns>
public async Task<bool> SaveDataAsync()
public async Task<bool> SaveDomainsAsync()
{
var domains = this.domainIPAddressHashSet.Keys
.Select(item => new DomainPattern(item))
@ -102,7 +102,7 @@ namespace FastGithub.DomainResolve
try
{
using var fileStream = File.OpenWrite(DATA_FILE);
using var fileStream = File.OpenWrite(DOMAINS_JSON_FILE);
await JsonSerializer.SerializeAsync(fileStream, domains, new JsonSerializerOptions { WriteIndented = true });
return true;
}

View File

@ -18,10 +18,9 @@ namespace FastGithub
{
services.TryAddSingleton<DnsClient>();
services.TryAddSingleton<DnscryptProxy>();
services.TryAddSingleton<DomainSpeedTestService>();
services.TryAddSingleton<DomainSpeedTester>();
services.TryAddSingleton<IDomainResolver, DomainResolver>();
services.AddHostedService<DnscryptProxyHostedService>();
services.AddHostedService<DomainSpeedTestHostedService>();
services.AddHostedService<DomainResolveHostedService>();
return services;
}
}