使用OptionsMonitor监听配置文件

This commit is contained in:
SpringHgui 2021-07-21 23:52:26 +08:00
parent f0067a61b1
commit e3ce510943
15 changed files with 60 additions and 95 deletions

View File

@ -3,5 +3,6 @@
<PropertyGroup>
<Controller_SelectedScaffolderID>ApiControllerEmptyScaffolder</Controller_SelectedScaffolderID>
<Controller_SelectedScaffolderCategoryPath>root/Common/Api</Controller_SelectedScaffolderCategoryPath>
<ActiveDebugProfile>IIS Express</ActiveDebugProfile>
</PropertyGroup>
</Project>

View File

@ -6,13 +6,7 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Configuration" Version="6.0.0-preview.4.21253.7" />
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="6.0.0-preview.4.21253.7" />
<PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="6.0.0-preview.4.21253.7" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="6.0.0-preview.4.21253.7" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="6.0.0-preview.4.21253.7" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="6.0.0-preview.4.21253.7" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="6.0.0-preview.4.21253.7" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="5.0.0" />
<PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="5.0.1" />
<PackageReference Include="Microsoft.Extensions.Logging.Log4Net.AspNetCore" Version="5.0.3" />
</ItemGroup>

View File

@ -17,7 +17,7 @@ namespace FastTunnel.Client
.ConfigureServices((hostContext, services) =>
{
// -------------------FastTunnel START------------------
services.AddFastTunnelClient();
services.AddFastTunnelClient(hostContext.Configuration.GetSection("ClientSettings"));
// -------------------FastTunnel EDN--------------------
})
.ConfigureLogging((HostBuilderContext context, ILoggingBuilder logging) =>

View File

@ -14,6 +14,7 @@ using FastTunnel.Core.Handlers.Client;
using Microsoft.Extensions.Configuration;
using FastTunnel.Core.Server;
using FastTunnel.Core.Sockets;
using Microsoft.Extensions.Options;
namespace FastTunnel.Core.Client
{
@ -35,7 +36,7 @@ namespace FastTunnel.Core.Client
ClientHeartHandler _clientHeartHandler;
Func<Socket> lastLogin;
Message<LogInMassage> loginMsg;
protected readonly IConfiguration _configuration;
protected readonly IOptionsMonitor<DefaultClientConfig> _configuration;
public SuiDaoServer Server { get; protected set; }
@ -43,7 +44,7 @@ namespace FastTunnel.Core.Client
ILogger<FastTunnelClient> logger,
HttpRequestHandler newCustomerHandler,
NewSSHHandler newSSHHandler, LogHandler logHandler,
IConfiguration configuration,
IOptionsMonitor<DefaultClientConfig> configuration,
ClientHeartHandler clientHeartHandler)
{
_logger = logger;
@ -130,8 +131,7 @@ namespace FastTunnel.Core.Client
protected virtual Socket login()
{
var ClientConfig = _configuration.Get<AppSettings>().ClientSettings;
Server = ClientConfig.Server;
Server = _configuration.CurrentValue.Server;
DnsSocket _client = null;
_logger.LogInformation($"正在连接服务端 {Server.ServerAddr}:{Server.ServerPort}");
@ -158,8 +158,8 @@ namespace FastTunnel.Core.Client
MessageType = MessageType.C_LogIn,
Content = new LogInMassage
{
Webs = ClientConfig.Webs,
SSH = ClientConfig.SSH,
Webs = _configuration.CurrentValue.Webs,
SSH = _configuration.CurrentValue.SSH,
},
};

View File

@ -9,6 +9,7 @@ using FastTunnel.Core.Dispatchers;
using System.Threading.Tasks;
using System.Threading;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Options;
namespace FastTunnel.Core.Client
{
@ -27,38 +28,28 @@ namespace FastTunnel.Core.Client
public ConcurrentDictionary<int, SSHInfo<SSHHandlerArg>> SSHList { get; private set; }
= new ConcurrentDictionary<int, SSHInfo<SSHHandlerArg>>();
public readonly IServerConfig ServerSettings;
readonly ILogger _logger;
readonly ClientListenerV2 clientListener;
readonly HttpListenerV2 http_listener;
public readonly IOptionsMonitor<DefaultServerConfig> serverOption;
public FastTunnelServer(ILogger<FastTunnelServer> logger, IConfiguration configuration)
public FastTunnelServer(ILogger<FastTunnelServer> logger, IOptionsMonitor<DefaultServerConfig> serverSettings)
{
_logger = logger;
ServerSettings = configuration.Get<AppSettings>().ServerSettings;
serverOption = serverSettings;
clientListener = new ClientListenerV2(this, ServerSettings.BindAddr, ServerSettings.BindPort, _logger);
http_listener = new HttpListenerV2(ServerSettings.BindAddr, ServerSettings.WebProxyPort, _logger);
clientListener = new ClientListenerV2(this, "0.0.0.0", serverOption.CurrentValue.BindPort, _logger);
http_listener = new HttpListenerV2("0.0.0.0", serverOption.CurrentValue.WebProxyPort, _logger);
}
public void Run()
{
_logger.LogInformation("===== FastTunnel Server Starting =====");
checkSettins();
listenClient();
listenHttp();
}
private void checkSettins()
{
if (string.IsNullOrEmpty(ServerSettings.WebDomain))
{
throw new Exception("[WebDomain] 配置不能为空");
}
}
private void listenClient()
{
clientListener.Start();
@ -66,7 +57,7 @@ namespace FastTunnel.Core.Client
private void listenHttp()
{
http_listener.Start(new HttpDispatcherV2(this, _logger, ServerSettings));
http_listener.Start(new HttpDispatcherV2(this, _logger, serverOption));
}
public void Stop()

View File

@ -1,15 +0,0 @@
using FastTunnel.Core.Config;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace FastTunnel.Core.Config
{
public class AppSettings
{
public DefaultServerConfig ServerSettings { get; set; }
public DefaultClientConfig ClientSettings { get; set; }
}
}

View File

@ -7,10 +7,6 @@ namespace FastTunnel.Core.Config
{
public class DefaultServerConfig : IServerConfig
{
[Required]
public string BindAddr { get; set; }
[Required]
public int BindPort { get; set; }
public string WebDomain { get; set; }

View File

@ -6,8 +6,6 @@ namespace FastTunnel.Core.Config
{
public interface IServerConfig
{
string BindAddr { get; set; }
int BindPort { get; set; }
#region Web相关配置

View File

@ -13,19 +13,20 @@ using System.Net.Http;
using System.IO;
using FastTunnel.Core.Server;
using System.Diagnostics;
using Microsoft.Extensions.Options;
namespace FastTunnel.Core.Dispatchers
{
public class HttpDispatcherV2 : IListenerDispatcher
{
readonly ILogger _logger;
readonly IServerConfig _serverSettings;
readonly IOptionsMonitor<DefaultServerConfig> _serverOption;
readonly FastTunnelServer _fastTunnelServer;
public HttpDispatcherV2(FastTunnelServer fastTunnelServer, ILogger logger, IServerConfig serverSettings)
public HttpDispatcherV2(FastTunnelServer fastTunnelServer, ILogger logger, IOptionsMonitor<DefaultServerConfig> serverSettings)
{
_logger = logger;
_serverSettings = serverSettings;
_serverOption = serverSettings;
_fastTunnelServer = fastTunnelServer;
}
@ -44,9 +45,9 @@ namespace FastTunnel.Core.Dispatchers
var endpoint = token.Socket.RemoteEndPoint as System.Net.IPEndPoint;
_logger.LogInformation($"Receive HTTP Request {endpoint.Address}:{endpoint.Port}");
if (_serverSettings.WebAllowAccessIps != null)
if (_serverOption.CurrentValue.WebAllowAccessIps != null)
{
if (!_serverSettings.WebAllowAccessIps.Contains(endpoint.Address.ToString()))
if (!_serverOption.CurrentValue.WebAllowAccessIps.Contains(endpoint.Address.ToString()))
{
HandlerHostNotAccess(token.Socket);
return;

View File

@ -34,16 +34,10 @@
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Configuration" Version="6.0.0-preview.4.21253.7" />
<PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="6.0.0-preview.4.21253.7" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="6.0.0-preview.4.21253.7" />
<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="5.0.0" />
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="6.0.0-preview.4.21253.7" />
<PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="6.0.0-preview.4.21253.7" />
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="6.0.0-preview.4.21253.7" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="6.0.0-preview.4.21253.7" />
<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="6.0.0-preview.6.21352.12" />
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="5.0.0" />
<PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="5.0.0" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
<PackageReference Include="System.Private.ServiceModel" Version="4.8.1" />
</ItemGroup>
<ItemGroup>

View File

@ -75,12 +75,12 @@ namespace FastTunnel.Core.Handlers
hasTunnel = true;
foreach (var item in requet.Webs)
{
var hostName = $"{item.SubDomain}.{server.ServerSettings.WebDomain}".Trim();
var hostName = $"{item.SubDomain}.{server.serverOption.CurrentValue.WebDomain}".Trim();
var info = new WebInfo { Socket = client, WebConfig = item };
_logger.LogDebug($"new domain '{hostName}'");
server.WebList.AddOrUpdate(hostName, info, (key, oldInfo) => { return info; });
sb.Append($" HTTP | http://{hostName}{(server.ServerSettings.WebHasNginxProxy ? string.Empty : ":" + server.ServerSettings.WebProxyPort)} => {item.LocalIp}:{item.LocalPort}");
sb.Append($" HTTP | http://{hostName}{(server.serverOption.CurrentValue.WebHasNginxProxy ? string.Empty : ":" + server.serverOption.CurrentValue.WebProxyPort)} => {item.LocalIp}:{item.LocalPort}");
sb.Append(Environment.NewLine);
if (item.WWW != null)
{
@ -90,7 +90,7 @@ namespace FastTunnel.Core.Handlers
_logger.LogInformation($"WWW {www}");
server.WebList.AddOrUpdate(www, info, (key, oldInfo) => { return info; });
sb.Append($" HTTP | http://{www}{(server.ServerSettings.WebHasNginxProxy ? string.Empty : ":" + server.ServerSettings.WebProxyPort)} => {item.LocalIp}:{item.LocalPort}");
sb.Append($" HTTP | http://{www}{(server.serverOption.CurrentValue.WebHasNginxProxy ? string.Empty : ":" + server.serverOption.CurrentValue.WebProxyPort)} => {item.LocalIp}:{item.LocalPort}");
sb.Append(Environment.NewLine);
}
}
@ -106,13 +106,13 @@ namespace FastTunnel.Core.Handlers
{
try
{
if (item.RemotePort.Equals(server.ServerSettings.BindPort))
if (item.RemotePort.Equals(server.serverOption.CurrentValue.BindPort))
{
_logger.LogError($"RemotePort can not be same with BindPort: {item.RemotePort}");
continue;
}
if (item.RemotePort.Equals(server.ServerSettings.WebProxyPort))
if (item.RemotePort.Equals(server.serverOption.CurrentValue.WebProxyPort))
{
_logger.LogError($"RemotePort can not be same with ProxyPort_HTTP: {item.RemotePort}");
continue;
@ -134,7 +134,7 @@ namespace FastTunnel.Core.Handlers
server.SSHList.TryAdd(item.RemotePort, new SSHInfo<SSHHandlerArg> { Listener = ls, Socket = client, SSHConfig = item });
_logger.LogDebug($"SSH proxy success: {item.RemotePort} => {item.LocalIp}:{item.LocalPort}");
sb.Append($" TCP | {server.ServerSettings.WebDomain}:{item.RemotePort} => {item.LocalIp}:{item.LocalPort}");
sb.Append($" TCP | {server.serverOption.CurrentValue.WebDomain}:{item.RemotePort} => {item.LocalIp}:{item.LocalPort}");
sb.Append(Environment.NewLine);
}
catch (Exception ex)

View File

@ -70,32 +70,33 @@ namespace FastTunnel.Core.Listener
return false;
}
IClientMessageHandler handler = null;
switch (msg.MessageType)
{
case MessageType.C_LogIn: // 登录
handler = _loginHandler;
break;
case MessageType.Heart: // 心跳
handler = _heartHandler;
break;
case MessageType.C_SwapMsg: // 交换数据
handler = _swapMsgHandler;
break;
default:
throw new Exception($"未知的通讯指令 {msg.MessageType}");
}
try
{
IClientMessageHandler handler = null;
switch (msg.MessageType)
{
case MessageType.C_LogIn: // 登录
handler = _loginHandler;
break;
case MessageType.Heart: // 心跳
handler = _heartHandler;
break;
case MessageType.C_SwapMsg: // 交换数据
handler = _swapMsgHandler;
break;
default:
throw new Exception($"未知的通讯指令 {msg.MessageType}");
}
handler.HandlerMsg(this._fastTunnelServer, token.Socket, msg);
return handler.NeedRecive;
}
catch (Exception ex)
{
_logger.LogError(ex, $"处理客户端消息失败msg={msg.ToJson()}");
_logger.LogError(ex, $"处理客户端消息失败msg={msg?.ToJson()}");
token.Socket.Close();
return false;
}
return handler.NeedRecive;
}
public void Stop()

View File

@ -1,7 +1,9 @@
using FastTunnel.Core.Client;
using FastTunnel.Core.Config;
using FastTunnel.Core.Filters;
using FastTunnel.Core.Handlers.Client;
using FastTunnel.Core.Services;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
namespace FastTunnel.Core.Extensions
@ -12,8 +14,10 @@ namespace FastTunnel.Core.Extensions
/// 添加服务端后台进程
/// </summary>
/// <param name="services"></param>
public static void AddFastTunnelServer(this IServiceCollection services)
public static void AddFastTunnelServer(this IServiceCollection services, IConfigurationSection configurationSection)
{
services.Configure<DefaultServerConfig>(configurationSection);
services.AddSingleton<IAuthenticationFilter, DefaultAuthenticationFilter>();
services.AddSingleton<FastTunnelServer, FastTunnelServer>();
@ -24,8 +28,10 @@ namespace FastTunnel.Core.Extensions
/// 添加客户端后台进程
/// </summary>
/// <param name="services"></param>
public static void AddFastTunnelClient(this IServiceCollection services)
public static void AddFastTunnelClient(this IServiceCollection services, IConfigurationSection configurationSection)
{
services.Configure<DefaultClientConfig>(configurationSection);
services.AddSingleton<FastTunnelClient>()
.AddSingleton<ClientHeartHandler>()
.AddSingleton<LogHandler>()

View File

@ -31,7 +31,7 @@ namespace FastTunnel.Server
.ConfigureServices((hostContext, services) =>
{
// -------------------FastTunnel START------------------
services.AddFastTunnelServer();
services.AddFastTunnelServer(hostContext.Configuration.GetSection("ServerSettings"));
// -------------------FastTunnel END--------------------
})
.ConfigureWebHostDefaults(webBuilder =>

View File

@ -9,8 +9,6 @@
},
"AllowedHosts": "*",
"ServerSettings": {
//
"BindAddr": "0.0.0.0",
// ¼àÌýË¿Ú
"BindPort": 1271,