iohao / ioGame

无锁异步化、事件驱动架构设计的 java netty 网络编程框架; 轻量级,无需依赖任何第三方中间件或数据库就能支持集群、分布式; 适用于网络游戏服务器、物联网、内部系统及各种需要长连接的场景; 通过 ioGame 你可以很容易的搭建出一个集群无中心节点、集群自动化、分布式的网络服务器;FXGL、Unity、UE、Cocos Creator、Godot、Netty、Protobuf、webSocket、tcp、socket;java Netty 游戏服务器框架;
http://game.iohao.com
GNU Affero General Public License v3.0
904 stars 201 forks source link

自定义游戏对外服统一交互协议 #213

Closed iohao closed 8 months ago

iohao commented 1 year ago

新增功能的使用场景

ExternalMessage 是玩家与游戏服务器交互的对外统一协议,具体可阅读对外服的协议说明文档。玩家(游戏客户端)在发起请求时,默认情况下是通过 ExternalMessage 来进行交互的。

开发者想要自定义这部分时,框架并不能很轻松的实现这种自定义的统一协议;这也是有意这样设计的,目的是为了统一。

在 ioGame17 版本中,自定义对外统一协议步骤如下

  1. 自定义一个对外联系的统一协议,假设名为 YourExternalMessage
  2. 编写一个自定义的编解码器
  3. 在这个编解码器中,将自定义的对外统一协议转换为 ExternalMessage

整个流程如下:

YourExternalMessage --> ExternalMessage --> BarMessage

这种扩展方式会多一次对象的转换,但在 ZGC 的加持下,问题并不大。

计划

计划在 ioGame21 时,完全开放这部分的改造。开发者只需要在编解码器上做修改,就能轻松做到自定义与外部联系的统一协议了。

在 ioGame21 中的整个流程如下:

YourExternalMessage --> BarMessage

目的

目前 ExternalMessage 是框架提供的一种与外部交互的统一协议,也是默认推荐的方式。注意,这里说的是默认推荐方式,并不是唯一方式。实际上你可以自定义这部分内容的,也就是说可以不使用 ExternalMessage 与外部联系,而是使用一种自定义的统一协议。

比如你正打算开发一个物联网相关的、或者说其他的项目;想简化对外的统一协议,只需要路由与业务对象就足够了;假设自定义的对外统一协议内容如下

syntax = "proto3";
package com.your.message;
// 对外服数据协议
message YourExternalMessage {
  // 业务路由(高16为主, 低16为子)
  int32 cmdMerge = 1;
  // 业务请求数据
  bytes data = 2;
}

使用 YourExternalMessage 来代替默认的 ExternalMessage, 以满足项目的特殊需要。

最后

如果没有特殊情况,建议使用框架默认提供的 ExternalMessage

相关文档参考 ioGame 消息处理流程

iohao commented 8 months ago

文档 - 游戏对外服的协议说明 (yuque.com)