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