启动完成后,我们打开前端页面并清理了缓存。清理完成后,连接被断开,我们需要重新登录。点击微信登录后,前端发起了请求,但服务器返回了一个 rest
错误。看起来注册流程并未完成,程序在某个地方挂掉了。
我们检查了日志,但没有发现具体的错误位置。暂时先不管这个问题,我们重新启动了服务。这可能是一个潜在的问题,但目前没有明确的错误指向。
接下来,我们启动了网关服务。重新刷新页面后,我们再次点击登录按钮。登录成功后,我们收到了一个 TOKEN
和对应的 Connector
地址,随后进行了 WebSocket 连接。从日志中可以看到,系统已经开始调用路由信息,访问 connect
服务器并执行Entryhandler
处理器中的 enter
方法。这个方法的作用是将 TOKEN
和 user 信息传递给客户端,随后进入游戏逻辑。
从日志中可以看到,握手消息已经成功发送并收到 ACK
消息。然而,我们没有收到心跳消息,但 ping-pong
机制是正常的,说明心跳机制本身没有问题。客户端可能没有发送心跳消息,而是直接发送了业务消息。
收到消息后,我们需要根据消息的路由信息进行处理。这个消息实际上是一个进入游戏的请求,类似于登录逻辑。我们需要解析 TOKEN
并验证其合法性。如果合法,我们将用户的 UUID
和其他信息存储起来,随后加载游戏场景并进入主界面。
在消息处理中,我们首先需要解析消息内容。在解码阶段,我们已经处理了消息类型为 date
的情况。拿到消息后,我们需要根据消息类型进行处理。消息类型主要有以下几种:
request:客户端请求,需要返回响应。
response:服务器响应,通常不需要进一步处理。
note:通知消息,服务器主动推送。
pose:其他类型的消息。
大部分情况下,我们处理的都是 request
类型的消息。收到请求后,我们需要根据路由信息调用对应的处理函数。路由信息包括服务器类型、处理器名称和方法名称。
为了管理用户状态,我们需要引入 Session
机制。Session
用于存储用户的相关信息,例如用户 ID、登录状态等。我们可以在 Session
中存储用户的基本信息,方便后续的业务逻辑处理。
在处理消息时,我们需要根据 TOKEN
获取用户 ID,并将其存储到 Session
中。这样,在后续的处理中,我们可以通过 Session
快速获取用户信息,而无需每次都重新解析 TOKEN
。
在处理消息时,我们需要根据路由信息调用对应的处理器。如果路由信息指向本地处理器(例如 connect
类型的服务器),我们直接调用本地的处理器;如果是其他类型的服务器(例如 game
或 auth
),我们需要通过 NAT 进行远程调用。
为了实现这一逻辑,我们需要在启动时注册处理器。我们可以在 connect
服务的启动逻辑中,定义一个处理器映射表,将路由信息与具体的处理器函数关联起来。这样,在收到消息时,我们可以通过路由信息快速找到对应的处理器并调用。
以下是处理器注册和消息处理的示例代码:
// 定义处理器映射表
var handlers = map[string]func(session *Session, message *Message) error{
"connect": handleConnect,
"game": handleGame,
"auth": handleAuth,
}
// 注册处理器
func RegisterHandlers() {
for route, handler := range handlers {
// 注册到路由表中
router.Add(route, handler)
}
}
// 处理消息
func handleMessage(session *Session, message *Message) error {
route := message.Route
handler, ok := handlers[route]
if !ok {
return fmt.Errorf("unsupported route: %s", route)
}
return handler(session, message)
}
// 示例处理器
func handleConnect(session *Session, message *Message) error {
// 处理连接逻辑
return nil
}
func handleGame(session *Session, message *Message) error {
// 处理游戏逻辑
return nil
}
func handleAuth(session *Session, message *Message) error {
// 处理认证逻辑
return nil
}
在测试过程中,我们发现网关服务偶尔会挂掉。这个问题可能是在更新配置或触发某些操作时,代码逻辑存在问题。我们需要进一步排查问题,查看日志并修复潜在的 bug。
重新启动服务后,我们再次进行测试。登录成功后,我们收到了正确的 TOKEN
和路由信息,说明消息处理逻辑已经正常工作。接下来,我们需要完成进入游戏的业务逻辑,根据文档要求返回用户信息和游戏配置。