Skip to content

Commit fb6d2d9

Browse files
committed
Revert "[删除]1. 删除用不到的库"
This reverts commit 9c3bb96. # Conflicts: # GameFrameX.Launcher/GameFrameX.Launcher.csproj
1 parent 878e4de commit fb6d2d9

File tree

10 files changed

+902
-0
lines changed

10 files changed

+902
-0
lines changed
Lines changed: 231 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,231 @@
1+
using GameFrameX.NetWork.Abstractions;
2+
using GameFrameX.NetWork.HTTP;
3+
using GameFrameX.Proto.BuiltIn;
4+
using GameFrameX.ServerManager;
5+
6+
namespace GameFrameX.Launcher.StartUp.Discovery;
7+
8+
/// <summary>
9+
/// 服务发现中心服务器
10+
/// </summary>
11+
[StartUpTag(ServerType.DiscoveryCenter, 0)]
12+
internal partial class AppStartUpDiscoveryCenter : AppStartUpService
13+
{
14+
public override async Task StartAsync()
15+
{
16+
try
17+
{
18+
_namingServiceManager.AddSelf(Setting);
19+
20+
StartServer();
21+
var aopHandlerTypes = AssemblyHelper.GetRuntimeImplementTypeNamesInstance<IHttpAopHandler>();
22+
aopHandlerTypes.Sort((handlerX, handlerY) => handlerX.Priority.CompareTo(handlerY.Priority));
23+
// 启动Http服务
24+
await HttpServer.Start(Setting.HttpPort, Setting.HttpsPort, HotfixManager.GetHttpHandler, aopHandlerTypes);
25+
await AppExitToken;
26+
}
27+
catch (Exception e)
28+
{
29+
LogHelper.Info($"服务器{ServerType}执行异常,e:{e}");
30+
LogHelper.Fatal(e);
31+
}
32+
33+
await StopAsync();
34+
}
35+
36+
/// <summary>
37+
/// 发送消息给注册的服务
38+
/// </summary>
39+
/// <param name="session">连接会话对象</param>
40+
/// <param name="message">消息对象</param>
41+
private async void SendMessage(IAppSession session, INetworkMessage message)
42+
{
43+
message.CheckNotNull(nameof(message));
44+
if (session == null || session.Connection.IsClosed)
45+
{
46+
return;
47+
}
48+
49+
MessageProtoHelper.SetMessageId(message);
50+
var messageObjectHeader = new InnerMessageObjectHeader
51+
{
52+
ServerId = Setting.ServerId,
53+
};
54+
var innerNetworkMessage = InnerNetworkMessage.Create(message, messageObjectHeader);
55+
var buffer = MessageEncoderHandler.Handler(innerNetworkMessage);
56+
if (Setting.IsDebug && Setting.IsDebugSend)
57+
{
58+
var serverInfo = _namingServiceManager.GetNodeBySessionId(session.SessionID);
59+
if (serverInfo != null)
60+
{
61+
LogHelper.Info("---发送[" + ServerType + " To " + serverInfo.Type + "] " + innerNetworkMessage.ToFormatMessageString());
62+
}
63+
}
64+
65+
await session.SendAsync(buffer);
66+
}
67+
68+
protected override ValueTask PackageHandler(IAppSession session, IMessage message)
69+
{
70+
if (Setting.IsDebug && Setting.IsDebugReceive)
71+
{
72+
var serverInfo = _namingServiceManager.GetNodeBySessionId(session.SessionID);
73+
if (serverInfo != null)
74+
{
75+
LogHelper.Debug($"---收到[{serverInfo.Type} To {ServerType}] {message.ToFormatMessageString()}");
76+
}
77+
else
78+
{
79+
LogHelper.Debug($"---收到[{ServerType}] {message.ToFormatMessageString()}");
80+
}
81+
}
82+
83+
if (message is IInnerNetworkMessage messageObject)
84+
{
85+
switch (messageObject.Header.OperationType)
86+
{
87+
case MessageOperationType.None:
88+
break;
89+
case MessageOperationType.HeartBeat:
90+
{
91+
// 心跳响应
92+
var reqHeartBeat = messageObject.DeserializeMessageObject();
93+
var response = new NotifyHeartBeat
94+
{
95+
UniqueId = reqHeartBeat.UniqueId,
96+
Timestamp = TimeHelper.UnixTimeMilliseconds(),
97+
};
98+
SendMessage(session, response);
99+
return ValueTask.CompletedTask;
100+
}
101+
case MessageOperationType.Cache:
102+
break;
103+
case MessageOperationType.Database:
104+
break;
105+
case MessageOperationType.Game:
106+
{
107+
var reqConnectServer = (ReqConnectServer)messageObject.DeserializeMessageObject();
108+
var serverList = _namingServiceManager.GetNodesByType(reqConnectServer.ServerType);
109+
if (reqConnectServer.ServerId > 0)
110+
{
111+
serverList = serverList.Where(m => m.ServerId == reqConnectServer.ServerId).ToList();
112+
}
113+
114+
if (serverList.Count > 0)
115+
{
116+
var serverInfo = (ServiceInfo)serverList.Random();
117+
118+
var respConnectServer = new RespConnectServer
119+
{
120+
UniqueId = reqConnectServer.UniqueId,
121+
ServerType = serverInfo.Type,
122+
ServerName = serverInfo.ServerName,
123+
ServerId = serverInfo.ServerId,
124+
TargetIp = serverInfo.OuterIp,
125+
TargetPort = serverInfo.OuterPort,
126+
};
127+
SendMessage(session, respConnectServer);
128+
}
129+
}
130+
break;
131+
case MessageOperationType.GameManager:
132+
break;
133+
case MessageOperationType.Forbid:
134+
break;
135+
case MessageOperationType.Reboot:
136+
break;
137+
case MessageOperationType.Reconnect:
138+
break;
139+
case MessageOperationType.Reload:
140+
break;
141+
case MessageOperationType.Exit:
142+
break;
143+
case MessageOperationType.Kick:
144+
break;
145+
case MessageOperationType.Notify:
146+
break;
147+
case MessageOperationType.Forward:
148+
break;
149+
case MessageOperationType.Register:
150+
{
151+
var reqRegisterServer = (ReqRegisterServer)messageObject.DeserializeMessageObject();
152+
// 注册服务
153+
var serviceInfo = new ServiceInfo(reqRegisterServer.ServerType, session, session.SessionID, reqRegisterServer.ServerName, reqRegisterServer.ServerId, reqRegisterServer.InnerIp, reqRegisterServer.InnerPort, reqRegisterServer.OuterIp, reqRegisterServer.OuterPort);
154+
_namingServiceManager.Add(serviceInfo);
155+
LogHelper.Info($"注册服务成功:{reqRegisterServer.ServerType} {reqRegisterServer.ServerName} {reqRegisterServer}");
156+
return ValueTask.CompletedTask;
157+
}
158+
case MessageOperationType.RequestConnectServer:
159+
{
160+
var reqConnectServer = (ReqConnectServer)messageObject.DeserializeMessageObject();
161+
var serverList = _namingServiceManager.GetNodesByType(reqConnectServer.ServerType);
162+
if (reqConnectServer.ServerId > 0)
163+
{
164+
serverList = serverList.Where(m => m.ServerId == reqConnectServer.ServerId).ToList();
165+
}
166+
167+
var respConnectServer = new RespConnectServer
168+
{
169+
UniqueId = messageObject.Header.UniqueId,
170+
};
171+
if (serverList.Count > 0)
172+
{
173+
var serverInfo = (ServiceInfo)serverList.Random();
174+
respConnectServer.ServerType = serverInfo.Type;
175+
respConnectServer.ServerName = serverInfo.ServerName;
176+
respConnectServer.ServerId = serverInfo.ServerId;
177+
respConnectServer.TargetIp = serverInfo.OuterIp;
178+
respConnectServer.TargetPort = serverInfo.OuterPort;
179+
}
180+
181+
SendMessage(session, respConnectServer);
182+
}
183+
break;
184+
default:
185+
throw new ArgumentOutOfRangeException();
186+
}
187+
}
188+
189+
return ValueTask.CompletedTask;
190+
}
191+
192+
193+
protected override ValueTask OnConnected(IAppSession appSession)
194+
{
195+
LogHelper.Info("有外部服务连接到中心服务器成功" + "。链接信息:SessionID:" + appSession.SessionID + " RemoteEndPoint:" + appSession.RemoteEndPoint);
196+
return ValueTask.CompletedTask;
197+
}
198+
199+
protected override ValueTask OnDisconnected(IAppSession appSession, CloseEventArgs args)
200+
{
201+
LogHelper.Info("有外部服务从中心服务器断开。链接信息:断开原因:" + args.Reason);
202+
_namingServiceManager.TrySessionRemove(appSession.SessionID);
203+
return ValueTask.CompletedTask;
204+
}
205+
206+
protected override void ConfigureSuperSocket(ServerOptions options)
207+
{
208+
options.ClearIdleSessionInterval = 30;
209+
base.ConfigureSuperSocket(options);
210+
}
211+
212+
protected override void Init()
213+
{
214+
if (Setting == null)
215+
{
216+
Setting = new AppSetting
217+
{
218+
ServerId = 21000,
219+
ServerType = ServerType.DiscoveryCenter,
220+
InnerPort = 21001,
221+
APMPort = 21090,
222+
HttpPort = 21011,
223+
IsDebug = true,
224+
IsDebugReceive = true,
225+
IsDebugSend = true,
226+
};
227+
}
228+
229+
base.Init();
230+
}
231+
}
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
using GameFrameX.NetWork.Abstractions;
2+
using GameFrameX.Proto.BuiltIn;
3+
using GameFrameX.ServerManager;
4+
5+
namespace GameFrameX.Launcher.StartUp.Discovery;
6+
7+
/// <summary>
8+
/// 服务发现中心服务器
9+
/// </summary>
10+
internal partial class AppStartUpDiscoveryCenter
11+
{
12+
private readonly NamingServiceManager _namingServiceManager;
13+
14+
public AppStartUpDiscoveryCenter()
15+
{
16+
_namingServiceManager = new NamingServiceManager(OnServerAdd, OnServerRemove);
17+
}
18+
19+
20+
private void OnServerRemove(IServiceInfo serverInfo)
21+
{
22+
var serverList = _namingServiceManager.GetAllNodes().Where(m => m.ServerId != 0 && m.ServerId != serverInfo.ServerId).ToList();
23+
24+
var respServerOnlineServer = new RespServerOfflineServer
25+
{
26+
ServerType = serverInfo.Type,
27+
ServerName = serverInfo.ServerName,
28+
ServerId = serverInfo.ServerId,
29+
};
30+
MessageProtoHelper.SetMessageId(respServerOnlineServer);
31+
foreach (var serverInfo1 in serverList)
32+
{
33+
var info = (ServiceInfo)serverInfo1;
34+
if (serverInfo.SessionId == info.SessionId)
35+
{
36+
// 跳过自身
37+
continue;
38+
}
39+
40+
var appSession = (IAppSession)info.Session;
41+
SendMessage(appSession, respServerOnlineServer);
42+
}
43+
}
44+
45+
private void OnServerAdd(IServiceInfo serverInfo)
46+
{
47+
var serverList = _namingServiceManager.GetOuterNodes().Where(m => m.ServerId != serverInfo.ServerId).ToList();
48+
49+
var respServerOnlineServer = new RespServerOnlineServer
50+
{
51+
ServerType = serverInfo.Type,
52+
ServerName = serverInfo.ServerName,
53+
ServerId = serverInfo.ServerId,
54+
};
55+
MessageProtoHelper.SetMessageId(respServerOnlineServer);
56+
foreach (var serverInfo1 in serverList)
57+
{
58+
var info = (ServiceInfo)serverInfo1;
59+
if (serverInfo.SessionId == info.SessionId)
60+
{
61+
// 跳过自身
62+
continue;
63+
}
64+
65+
var appSession = (IAppSession)info.Session;
66+
SendMessage(appSession, respServerOnlineServer);
67+
}
68+
}
69+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
<Import Project="../Version.props" Label="版本号定义"/>
3+
<PropertyGroup>
4+
<TargetFramework>net8.0</TargetFramework>
5+
<ImplicitUsings>enable</ImplicitUsings>
6+
<Nullable>disable</Nullable>
7+
<PublicSign>true</PublicSign>
8+
<SignAssembly>true</SignAssembly>
9+
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
10+
<Title>$(AssemblyName)</Title>
11+
<Copyright>AlianBlank;GameFrameX;Blank</Copyright>
12+
<PackageProjectUrl>https://github.com/GameFrameX/GameFrameX</PackageProjectUrl>
13+
<RepositoryUrl>https://github.com/GameFrameX/GameFrameX</RepositoryUrl>
14+
<RepositoryType>git</RepositoryType>
15+
<PackageLicenseExpression>Apache-2.0</PackageLicenseExpression>
16+
<Description>GameFrameX.ServerManager</Description>
17+
<PackageTags>GameFrameX,Lib,ServerManager,Server,GameServer</PackageTags>
18+
<PackageReleaseNotes>https://gameframex.doc.alianblank.com/</PackageReleaseNotes>
19+
<PackageIcon>logo.png</PackageIcon>
20+
<Authors>AlianBlank;Blank</Authors>
21+
<PackageReadmeFile>README.md</PackageReadmeFile>
22+
<IsPackable>true</IsPackable>
23+
<PackageRequireLicenseAcceptance>true</PackageRequireLicenseAcceptance>
24+
<GenerateDocumentationFile>true</GenerateDocumentationFile>
25+
<PackageId>$(AssemblyName)</PackageId>
26+
<GenerateAssemblyInfo>true</GenerateAssemblyInfo>
27+
<TargetFramework>net8.0</TargetFramework>
28+
<AssemblyOriginatorKeyFile>../gameframex.key.snk</AssemblyOriginatorKeyFile>
29+
<IncludeSymbols>true</IncludeSymbols>
30+
<SymbolPackageFormat>snupkg</SymbolPackageFormat>
31+
</PropertyGroup>
32+
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
33+
<OutputPath>..\bin\app_debug</OutputPath>
34+
</PropertyGroup>
35+
36+
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
37+
<OutputPath>..\bin\app</OutputPath>
38+
</PropertyGroup>
39+
<ItemGroup>
40+
<ProjectReference Include="..\GameFrameX.Monitor\GameFrameX.Monitor.csproj" />
41+
<ProjectReference Include="..\GameFrameX.Utility\GameFrameX.Utility.csproj" />
42+
</ItemGroup>
43+
<ItemGroup>
44+
<None Include="..\logo.png">
45+
<Pack>True</Pack>
46+
<PackagePath>\</PackagePath>
47+
<Link>logo.png</Link>
48+
</None>
49+
<None Include="..\README.md">
50+
<Pack>True</Pack>
51+
<PackagePath>\</PackagePath>
52+
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
53+
</None>
54+
</ItemGroup>
55+
</Project>

0 commit comments

Comments
 (0)