2.邮件系统Gate服设计
2.1 设计思路
Gate 服务器基本和聊天系统的类似,他作为所有客户端连接的统一入口,专注于 会话管理、鉴权 与 跨服路由,将邮件业务逻辑(Mail 服)与网络协议彻底解耦:
- 会话管理
维护Session的生命周期、心跳检测与断线重连,通过GateAccountFlagComponent绑定玩家Account。 - 路由转发
使用RouteComponent将来自客户端的 Mail 请求(如C2Mail_*Request)透明转发给 Mail 服的对应MailUnit,并把响应路由回客户端。 - 统一入口
客户端仅与 Gate 通信,Mail 服不暴露外网端口,确保网络安全与流量可控。 - 跨服协同
登录/登出时,Gate 调用GateLoginHelper.Online/Offline,通知 Mail 服创建或销毁MailUnit,保持各层状态一致。
这种设计让 Gate 只负责高并发连接与路由,Mail 服专注邮件核心业务,双方职责单一、易于扩展。
2.2 Gate 服主要组件
classDiagram
class GateScene {
+Start()
+OnSessionAccept()
+OnSessionDisconnect()
}
class GateAccountFlagComponent {
+Account Account
}
class GateAccountFlagComponentSystem {
+Destroy(self:GateAccountFlagComponent)
}
class RouteComponent {
-addressMap: Dictionary
+AddAddress(routeType, routeId)
+Send(targetRouteType, message)
+Call(targetRouteType, rpc)
}
class GateLoginHelper {
+Online(session, account): FTask
+Offline(scene, mailRouteId): FTask
}
GateScene --> GateAccountFlagComponentSystem : 挂载销毁系统
Session --> GateAccountFlagComponent : 添加组件
Session --> RouteComponent : 添加组件
GateAccountFlagComponent --> GateLoginHelper : 调用上下线
RouteComponent --> MailScene : CallInnerRoute
GateScene
- **Start()**:启动网络服务
- **OnSessionAccept()**:新客户端连接,创建
Session并挂载GateAccountFlagComponent与RouteComponent - **OnSessionDisconnect()**:客户端断开,触发
GateAccountFlagComponent系统,调用下线逻辑
GateAccountFlagComponent
- 挂载在
Session上,保存玩家的Account对象(含MailRouteId) - 在组件销毁时(用户下线或断线),触发调用
GateLoginHelper.Offline告知 Mail 服下线
RouteComponent
- 维护
RouteType.MailRoute → MailUnitRouteId映射 - Send:单向消息转发(无需回复)
- Call:RPC 调用,负责在 GateScene 内通过
NetworkMessagingComponent.CallInnerRoute与 MailScene 通信,转发给MailScene对应的MailUnit。
GateLoginHelper
- Online:登录时向 MailScene 发送
G2Mail_LoginRequest,保存返回的MailUnitRouteId,并将其注册到RouteComponent - Offline:下线时向 MailScene 发送
G2Mail_ExitRequest,通知 MailUnit 清理并持久化
2.3 Gate 服上下线流程
客户端发起登录
sequenceDiagram
participant ClientSession
participant GateSession
participant MailScene
ClientSession->>GateSession: C2G_LoginRequest { Name }
GateSession->>GateSession: Add GateAccountFlagComponent & RouteComponent
GateSession->>GateAccountFlagComponentSystem: 创建/更新 Account
GateSession->>GateLoginHelper: Online(session, account)
GateLoginHelper->>MailScene: CallInnerRoute G2Mail_LoginRequest
MailScene-->>GateSession: Mail2G_LoginResponse { MailUnitRouteId }
GateSession->>RouteComponent: AddAddress(MailRoute, MailUnitRouteId)
GateSession-->>ClientSession: G2C_LoginResponse { ErrorCode }
- C2G_LoginRequest:客户端发送用户名
- 会话组件挂载:绑定 Account 与 RouteComponent
- GateLoginHelper.Online:调用
CallInnerRoute登录 Mail 服 - Mail2G_LoginResponse:Mail 服返回
MailUnitRouteId,Gate 保存路由地址 - G2C_LoginResponse:Gate 向客户端告知登录成功
客户端发起邮件请求
sequenceDiagram participant ClientSession participant GateSession participant MailUnit ClientSession->>GateSession: C2Mail_SendMailRequest GateSession->>RouteComponent: Call(MailRoute, request) RouteComponent->>MailUnit: 路由到具体 MailUnit MailUnit-->>GateSession: Mail2C_SendMailResponse GateSession-->>ClientSession: 转发响应
2.4 总结
- 职责分离:Gate 完全专注连接与路由,Mail 服专注邮件业务。
- 透明路由:
RouteComponent+CallInnerRoute实现跨服请求与响应,客户端无需感知集群拓扑。 - 组件化:
GateAccountFlagComponent管理上下线,RouteComponent管理路由映射,拆分清晰。 - 可扩展性:新增其他服务(如金币、物品服)仅需在
GateLoginHelper中添加调用,无需修改客户端逻辑。 - 高可用:Gate 无状态设计可集群扩展,MailUnit 下线时自动持久化,保障数据一致性。
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com