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+ }
0 commit comments