Closed lrwh closed 9 months ago
IoGame 的交互主要是以 webSocket 技术进行实现,比如从客户端触发事件,将以 webSocket 方式发送到网关,进而调用游戏逻辑服处理业务流程。如若需要打通环节,本质上是需要处理 webSocket,支持 webSocket 的链路传递
websocket 组件有很多,目前 IoGame 主要是使用了 org.java-websocket
<dependency>
<groupId>org.java-websocket</groupId>
<artifactId>Java-WebSocket</artifactId>
<version>1.5.2</version>
</dependency>
进一步研究发现,IoGame 采用 com.alipay.sofa
框架来接受 websocket 服务(即使用 bolt
协议),充当 websocket server 端,以官方提供的坦克大战为例进行分析:
GameOne 服务端(websocket 视角)
TankApp 客户端(websocket 视角)
RpcServerRemoting
来接受 websocketClient 发送过来的数据综上分析,除了接入org.java-websocket
进行埋点操作以外,还需要对 sofa
进行增强处理,才能完成socket 的链路串联。
综上,总结一下:
bolt
协议中的 RpcServerRemoting
来作为 websocket 的服务端接收数据从链路的角度分析
org.java-websocket
RpcServerRemoting
接收 websocket 消息,需要产生trace信息,对应的组件为com.alipay.sofa
iogame
io.netty.handler.codec.http.DefaultHttpRequest
,同时采用了解码器io.netty.handler.codec.http.LastHttpContent$1
NettyChannelHandlerContextInstrumentation 会产生一个 span 信息,所以我们能够看到一个 span
客户端调用 send,探针埋 header 信息,服务端 netty 接收后,解码器为 io.netty.handler.codec.http.websocketx.BinaryWebSocketFrame
,无法解出 header 信息
后进入 com.alipay.remoting.rpc.RpcServerRemoting
,相当于上一步数据被封装了,所以当前也是无法提取到 header 信息
com.alipay.remoting.rpc.protocol.RpcProtocolDecoder
com.alipay.remoting.codec.ProtocolCodeBasedEncoder
IETF发布的WebSocket RFC,定义了6种帧,Netty为它们都提供了一个POJO实现。
目前还无法实现
关于 IoGame
需求: