代码拉取完成,页面将自动刷新
同步操作将从 渔民小镇/ioGame 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
更新日志在线文档 https://www.yuque.com/iohao/game/ab15oe
2023-03-27 - v17.1.35
https://www.yuque.com/iohao/game/ab15oe#xsmCW
移除废弃的 UserProcessor ChangeUserIdMessageBrokerSyncProcessor
[#62] RequestMessageClientProcessor 中的 FlowContext 增加路由、响应对象、用户id 相关的属性设置。
UserProcessor DefaultUserProcessorExecutorStrategy 用户线程池策略变更:
UserProcessor RequestMessageClientProcessor 请求处理单独一个池
其他的 UserProcessor 共用一个池
领域事件部分代码整理
将 BrokerClientHelper.me() 标记为 Deprecated
请使用 BrokerClientHelper 的静态方法,如 BrokerClientHelper.me().xxx() 改为 BrokerClientHelper.xxx()
2023-03-02 - v17.1.34
[#47] 增加拒绝外部直接访问 action 的路由权限
有些 action 只能内部访问,比如增加金币、敏感数值的增加等。这些 action 是不能由外部直接访问的,这里说的外部指的连接的玩家。
[#45] 游戏对外服独立 UserSession 管理部份逻辑,做成单独的 Handler
[#54] 动态属性接口增加消费操作
废弃
将 ExternalBizHandler 标记为废弃,由 UserSessionHandler、AccessAuthenticationHandler、RequestBrokerHandler 三个 Handler 代替。其一,这样更符合单一职责;其二,之前会有开发者将 ExternalBizHandler 重写或替换后,没有添加用户管理与路由访问权限管理的相关逻辑,导致逻辑与预期不符;
查看 https://www.yuque.com/iohao/game/ea6geg#noCqn
2023-02-13 - v17.1.33
https://www.yuque.com/iohao/game/ab15oe#w9uZB
action 业务参数自动装箱、拆箱增强。
支持 action 接收与返回基础类型:int、long、boolean 和字符串 String。
支持 action 接收与返回多个基础类型:List<Integer>、List<Long>、List<Boolean> 和 List<String>
关于 action 业务参数、返回值的自动装箱、拆箱更详细的使用文档,可以参考:业务参数自动装箱、拆箱基础类型
[#38] 新增业务参数自动装箱、拆箱基础类型-boolean
[#39] 新增业务参数自动装箱、拆箱"基础"类型-String
[#42] 新增业务参数自动装箱、拆箱基础类型-int
[#43] 新增业务参数自动装箱、拆箱基础类型-long
修复 ExternalServerBuilder.channelPipelineHook 设置业务编排钩子接口被默认实现覆盖的问题
【废弃与替换】
标记废弃 IntPb ,由 IntValue 代替
标记废弃 IntListPb ,由 IntValueList 代替
标记废弃 LongPb ,由 LongValue 代替
标记废弃 LongListPb ,由 LongValueList 代替
废弃原因-1:属性名称不统一
废弃原因-2:命名以 pb 结尾,这会导致在使用非 pb 协议时,会产生歧义
不兼容说明
如果开发者在之前的版本中的 action 使用的是 int、long 作为接收与返回参数的,此次版本不会有兼容问题。
如果使用的是 IntPb、IntListPb、LongPb、LongListPb 将会有不兼容的情况,因为当前版本已将 int、long 基础类型装箱、拆箱的类型解析器,替换为新版本的解析器。
如果想兼容旧版本的,可以通过下面的代码来做兼容。如果条件允许,请使用新版本,因为这得到了统一。
注意:由于此版本更新了 pb 原文件,需要前端同学重新生成一次协议。pb 原文件可查看:对外服协议说明。
理论上前端不做更改问题也不大,只是生成的对接文档上有差异,如果后端使用了基础类型做接收参数或返回值的,原 IntPb 由 IntValue 代替,原 LongPb 由 LongValue 代替。
其次影响是如果将来打算换成 json 协议来对接,会导致不兼容的情况,如果条件允许,请前端同学尽早做变更。
2023-02-03 - v17.1.31
https://www.yuque.com/iohao/game/ab15oe#dPVPB
#37 缩小打包后的包体大小,ioGame 打 jar 包后大约 15MB,演示查看 快速从零编写服务器完整示例。
#36 增加 Banner 打印版本、内存占用、启动耗时等信息。
ioGame 在内存占用、启动速度、打包等方面也是优秀的。
- 内存方面:内存占用小。
- 启动速度方面:应用通常会在 0.x 秒内完成启动。
- 打包方面:打 jar 包后大约 15MB ,详细请看 快速从零编写服务器完整示例。
#34 日志模块增加
用于将框架日志单独存放,与开发者项目的日志分离。
日志支持 log4j2、logback
#I6BE6J
MethodParsers 增加 action 参数解析器的默认设置
#I6C0UF
业务参数自动装箱、拆箱基础类型增强
#I6B76X
修复广播的数据为空时,广播虽然是成功的,但是打印广播日志报错的问题
移除一些第三方库
为缩小打包,将 hutool 依赖移除、将 fastjson2 依赖配置中的 scope 改为 provided;如有使用到相关的,需要开发者自行引入。
移除项目中 json 相关的类文件 ToJson。
2023-01-14 - v17.1.29
https://www.yuque.com/iohao/game/ab15oe#pqHj1
修复文档生成时的路径问题
2022-12-29 - v17.1.28
https://www.yuque.com/iohao/game/ab15oe#Y38Hx
增加版本标识
增加版本标识,并在 DebugInOut 插件中显示的打印。
业务框架处理器
增加 ActionCommandTryHandler 并作为默认的业务框架处理器。
业务框架默认是在 bolt 线程运行,如果有异常会被 bolt 捕获到日志文件中。由于控制台没有显示的打印异常信息,开发者如果对 bolt 不熟悉,是不知道有该日志文件的。当出现异常时,将会浪费开发人员的时间来排查问题,为了避免这种情况,业务框架先做捕获,并打印到控制台中,在向上抛 ex。
bolt 日志文件相关 https://www.yuque.com/iohao/game/derl0laiu2v0k104#likQv
2022-12-14 - v17.1.27
https://www.yuque.com/iohao/game/ab15oe#KR00k
命令解析器与源码文档逻辑分离。
优化命令对象,减少 action 类的实例化对象
#30 简化元附加信息的使用 使用文档
在处理 action 时,我们可以通过 FlowContext.userId 可以很方便得到当前用户(玩家)id。
如果开发者想在处理 action 时,携带上一些自定义的信息时,可以通过元附加信息特性来完成。比如保存当前玩家的英雄角色 id,或者玩家的昵称,又或者是你的项目的 userId 是 string 或其他类型则可以通过元信息这一特性来兼容。
简单的说,就是你想在 FlowContext 中获取一些用户(玩家)特有的信息数据时,可以通过这个特性来实现。
2022-12-06 - v17.1.26
https://www.yuque.com/iohao/game/ab15oe#Qzog2
#27
业务框架与网络通信框架解耦
新增 ChannelContext 通信通道接口,用于对 bolt AsyncContext、netty Channel 的包装,这样可以使得业务框架与网络通信框架解耦,为将来 ioGame 实现绳量级架构的使用做准备。
移除 FlowAttr.asyncContext 动态属性,由 FlowAttr.channelContext 代替。
业务框架模块移除网络相关的依赖 bolt、netty 等。
#28
游戏对外服 netty 编排业务钩子接口
新增 ChannelPipelineHook netty 业务编排的处理器钩子接口,用于游戏对外服。
ExternalServerBuilder 新增 channelPipelineHook 属性 ,用于自定义 netty 业务编排的处理器设置。
废弃标记 ExternalServerBuilder.channelHandlerProcessors 属性及其相关地方为过期,由 ChannelPipelineHook 来代替,使用示例如下。
2022-11-29
v17.1.25 https://www.yuque.com/iohao/game/ab15oe#VghQ6
ActionCommandInfoBuilder 改名为 ActionCommandParser 命令解析器
将业务框架中的部分类设置为 final 权限
废弃动态属性 FlowAttr.data ,由 FlowAttr.actionBizParam 代替
#I63L7V BarSkeletonBuilderParamConfig 类的方法名变更
addActionController 标记为废弃,请使用 scanActionPackage。
addActionSend 标记为废弃,请使用 scanActionSendPackage。
因为 addActionController 、addActionSend 的方法名,会给部分开发者带来混淆。这导致部分开发者在使用时 addActionController 方法时,会多次添加 action 类。实际上只需要随意配置一个 action 类就可以了,即使有一万个action。
#I63L89 标准 action 规则
1. 业务方法上添加注解 ActionMethod
2. 业务方法的访问权限必须是:public
3. 业务方法不能是:static
4. 业务方法需要是在 action 类中声明的方法
简单的说,标准的 action 是非静态的,且访问权限为 public 的方法。
术语说明:在 action 类中提供的业务方法通常称为 action
#I6307A 支持多种协议:protobuf、json,并支持可扩展
现在 ioGame 支持同样的一套业务代码,无需开发者做代码的变更,就能支持多种协议的切换,如:protobuf、json。协议的切换是简单的,只需要一行代码。
简单点说,如果开发者的项目之前使用的是 json 数据来传输的,以后想改用 protobuf 来传输,是不需要改变业务方法的。框架除了内置支持的 protobuf、json 协议外,开发者还可以对协议进行扩展。
2022-11-14
v17.1.23
#I6032U
BrokerServerBuilder 游戏网关构建器中增加移除 UserProcessor 的方法
#I60L94
提供 UserProcessor 用户线程池设置策略。分离 IO 线程池与用户线程池,这样服务器可以在同一时间内处理更多的请求。
框架提供 UserProcessorExecutorStrategy 接口,主要用于给 UserProcessor 构建 Executor 的策略,这样更具有灵活性;开发者可以根据自身业务来做定制。
see IoGameGlobalConfig.userProcessorExecutorStrategy
框架会在启动时,如果检测到 UserProcessor 实现了 UserProcessorExecutorAware 接口,就会触发一次。
#I60R41
修复动态绑定游戏逻辑服不能取消,不能路由到其他游戏逻辑服的问题
#I60R3A
废弃 BrokerGlobalConfig ,由 IoGameGlobalConfig 代替。
当前大版本会兼容 BrokerGlobalConfig 配置,下个大版本将会移除 BrokerGlobalConfig;
BrokerGlobalConfig 有点表示游戏网关全局配置的意思,名字不太理想。
2022-11-08
v17.1.22
#I5YM30
提供 action 调试工具-模拟客户端的需要数据
具体 https://www.oschina.net/news/216923/iogame-17-1-22-released
2022-10-31
v17.1.21
(#I5YEZ5 、#I5VIGE 、#I5VHPC 、#I5U89Q 、#I5SLGJ 、#I5RXOZ 、#I5QZU7 、#I5LY33 、#I5KQT5 、#I5CYK7 、#I5BDO7 、#I5YEZU )
#I5YEZ5
移除游戏网关的 spring 依赖,之前使用了 spring 的日志彩色打印,改为使用 logback 提供的。
#I5SLGJ
现在 ioGame 的 JSR 校验支持 Jakarta 和 Javax 两种,基于 java SPI 实现;
支持 Javax 是为了兼容一些老项目迁移到 ioGame 中;
新项目推荐使用 Jakarta,通常在 ioGame 的项目中,开启 JSR380 验证规范时,默认使用的是 Jakarta;
在示例目录中,单独的增加了 Jakarta 和 Javax 的使用示例。
#I5RXOZ
SimpleRunOne 中 startup 优化
#I5YEZU
框架提供 cmd 路由对应的响应数据类型信息,方便后续做"模拟客户端" 支持,这样可以做到不需要手动编写测试代码,
也可以对业务方法 action 进行测试,这将大量减少游戏开发者的测试时间;
大概意思是,开发者编写了 10 个模块,平均每个模块下有 8 个 action ,这一共是 80 个 action;
通常我们为了测试这 80 个 action ,会需要模拟客户端,写 80 个相关的请求端来访问我们的 action。
当使用上“模拟客户端” 将不在需要编写这些,这大量的降低的开发者的工作量;
2022-09-26
v17.1.20
(#I5SLRA、#I5S8QC、#I5SG8T、#I5RXMY、#I5SS3C)
#I5SLRA
移除 HeadMetadata 类的 cmd、subCmd 属性,进一步减少传输,因为 cmd、subCmd 属性数据可以通过 cmdMerge 计算出来;
假设你的游戏请求量可以达到每秒 100W 次时,至少可为服务器每秒节省大约 8 * 1000000 / 1024 / 1024 = 7.63 MB 的传输量;
当请通讯方式是 请求/响应 类型时,每秒节省大约 7.63 * 2 = 15.26 MB;
#I5S8QC
light-timer-task,将任务延时器的任务数量默认值 2_000 --> 10_000
#I5SG8T
将 MsgException 修改为运行时异常;下面两个 action 的业务逻辑处理是等价的,其中一个显示的声明了 throws。
https://www.yuque.com/iohao/game/avlo99#fTn4A
#I5RXMY
JSR380 新增参数分组校验,分组校验在 web 开发中很常见,现在 ioGame 也支持这一特性了。
https://www.yuque.com/iohao/game/ghng6g#DMPBH
#I5SS3C
修复:light-profile getInt getBool 无法获取数据
2022-09-08
v17.1.18
(#I5PU5R、#I5PFGP、#I5NDEG、#I5Q1AO、#I5Q89K)
#I5PFGP
新增 unity 与 ioGame 综合示例的联调示例,此 unity 连接示例由 licheng 提供。之前赵少提供的 unity 示例,由于我没 fork, 估计项目被删除了(原因是 git 仓库满了,就删除了)
u3d 连接示例语雀在线文档 https://www.yuque.com/iohao/game/syv5mm
#I5Q1AO
语雀在线文档 https://www.yuque.com/iohao/game/gmfy1
领域事件变更默认配置
DomainEventContextParam.producerType 由 ProducerType.SINGLE 改为 ProducerType.MULTI
DomainEventContextParam.waitStrategy 由 BlockingWaitStrategy 改为 LiteBlockingWaitStrategy
2022-08-29
v17.1.17
#I5O5QH
新增集群日志开关 BrokerGlobalConfig.brokerClusterLog,默认为 true
#I5NUGF
之前框架只会在玩家没有登录的时候,临时的使用了一下这个属性来存放 netty 的 channelId。
原因是不想为了这一次的使用,而特意声明一个变量来存放 netty 的 channelId。
简单点说就是在玩家没有登录时,开发者是不能使用该属性的。
只登录了的玩家,框架才不会占用该属性来存放 netty 的 channelId。
现在改为即使没有登录,框架也不占用 HeadMetadata.attachmentData 属性了,开发者可以放心的使用了;
比如,用于在登录时,拿到玩家IP,用于封号相关和其他的(比如日志、等)
具体使用可参考 https://www.yuque.com/iohao/game/sw1y8u
#I5K3WE
增强顶号强制下线的问题,在发送强制离线时,需要先给个客户端发个错误码。
防止客户端会自动进行重试再次连接。
这里顶号服务端主动断开连接,如果服务器不发送错误码,会导致2个客户端来回顶号的情况。
#I5OB8T
修复 JSR380 验证相关缺少判断
2022-08-23
v17.1.13
#I5N97K
(可跨进程通信) 游戏逻辑服与同类型逻辑服通信,超时问题;
在之前的版本中,使用通讯方式 -- 游戏逻辑服与同类型逻辑服通信时,当目标游戏逻辑服中的业务处理时间过长时,框架不能按开发者的预期值返回(相当于超时了),现在改为默认是在调用端进行阻塞,直到得到目标游戏逻辑服返回的结果为止;
新增 SyncRequestMessageClientProcessor、SyncRequestMessage 来处理超业务逻辑时间比较长的业务。
这个改进对开发者是无感知的;
使用的处理方式还是: CompletableFuture、ForkJoinPool 等,即总耗时为最长那个业务逻辑的耗时;如,A 用时 1 秒、B 用时 2 秒、C 用时 2.2 秒,那么总耗时大概是 2.2 秒;
但如果超过在 BrokerGlobalConfig.timeoutMillis 中设置的时间,仍然会做报错的提示,防止开发者因为编写业务逻辑时引发的问题;
#I5N97H
自定义 FlowContext
开发者可以自定义 FlowContext 方便做一些方法上的扩展,这些定制可以更好的服务于开发者的项目;业务框架新增 FlowContextFactory 业务框架 flow 上下文工厂,用于创建自定义的 FlowContext。通常使用自定义的 FlowContext,一般用于为 FlowContext 添加上一些方法;
框架默认提供的 FlowContext 已经将 invokeXXX 系列方法给标记为 Deprecated ,因为这是前期的一个 API 错误设计,invokeXXX 系列方法严格来说不算是 FlowContext 的职责;但在实际的业务开发中,开发者自定义的 FlowContext 是可以这么做的;
对于更详细的描述与具体使用,可以参考 https://www.yuque.com/iohao/game/zz8xiz#sLySn 在线文档
2022-08-16
v17.1.10
#I5LL08
逻辑服务之间通信相关的扩展增强方式
#I5MDBA
游戏网关的扩展增强 - 元素选择器生产工厂
#I5KQXM、#I5L1P
游戏对外服、动态绑定逻辑服节点相关
2022-08-08
v17.1.9
#I5KR7T
UserHook quit方法中调用ExternalKit.requestGateway(userSession, requestMessage); 抛出异常
https://gitee.com/iohao/iogame/issues/I5KR7T
#I5KZTP
断言抛异常没有带异常信息
https://gitee.com/iohao/iogame/issues/I5KZTP
2022-08-04
v17.1.5 ~ v17.1.8
(#I5K3WE、#I5KLED、#I5KLDA、#I5KMXT、#I5KMYK)
#I5K3WE
顶号强制下线时,发送一个错误码给连接端
#I5KLDA
新增:原生 PB 与 jprotobuf 互转示例,具体查看示例源码的 spring-websocket-native-pb-client 模块
示例文档:https://www.yuque.com/iohao/game/ruaqza
#I5KMXT
框架内置可选模块 light-jprotobuf
变更 light-jprotobuf 生成 .proto 文件时,sint64、sint32 改为 int64、int32。
使用 sint64、sint32 类型,需要使用原生的 jprotobuf 。light-jprotobuf 暂时不打算支持。
文档地址: https://www.yuque.com/iohao/game/vpe2t6
#I5KLED
CocosCreator 与综合示例联调(登录)
前端示例代码:https://gitee.com/iohao/io-game-cocos
综合示例代码:https://www.yuque.com/iohao/game/ruaqza#SWzpv
服务器示例启动类: SpringGameOneApplication
#I5KMYK
更新对外服数据协议 ExternalMessage
使用 jprotobuf 明确协议类型
重要:如果项目开发中,出现协议数据对不上的,建议升级到这个版本,前端的哥们也需要更新一下 .proto 文件。具体看 issu 描述。
打 jar、docker 部署、全局重复路由检测
移除示例中 EnableZigZap 注解的使用,减少相关理解。
2022-07-28
v17.1.4 (#I5J96X、#I5J7JU、#I5J7HG、#I5J7GI、#I5J7G5、#I5IS7V、#I5IEXO)
-- 3类通讯方式相关 --
新增:【游戏逻辑服】访问多个【游戏对外服】的上下文。
具体可以查看 https://gitee.com/iohao/iogame/issues/I5J7JU
新增:游戏对外服扩展
游戏对外服新增 ExternalBizRegion 接口,开发者可以更好地扩展游戏对外服,通过这个接口与本次新增的上下文配合使用;开发者可以通过实现这个接口,向游戏逻辑服提供一些,如
1. 只存在于游戏对外服中的数据
2. 只有游戏对外服可以做的事
框架通过这一扩展,在不到 15 行的有效代码中,就轻松实现了重复登录、顶号功能;
● ExistUserExternalBizRegion 查询用户(玩家)是否在线
● ForcedOfflineExternalBizRegion 强制用户(玩家)下线
重复登录 具体查看 https://gitee.com/iohao/iogame/issues/I5J7G5
顶号 具体查看 https://gitee.com/iohao/iogame/issues/I5J7GI
ExternalBizRegion 扩展具体查看 https://www.yuque.com/iohao/game/ivxsw5
新增:元信息 - 附加信息 - 在 action 中得到附加数据
废弃 HeadMetadata.extJsonField 字段,由 attachment 字段代替,attachment 为 byte[] 类型。
在处理 action 时,我们可以通过 FlowContext.userId 可以很方便得到当前用户(玩家)id,userId 实际的保存地方是游戏对外服的 UserSession 中。每次请求时会在游戏对外服中,将当前 userId 设置到 RequestMessage 的元信息对象中;如果开发者想在处理 action 时,携带上一些自定义的信息时,可以通过 HeadMetadata.attachmentData 属性来完成。
假如我们想要把 channel 的 ip(由于这些数据只在游戏对外服中),携带上到 action 业务处理中得到,我们就可以把这些数据设置到 HeadMetadata.attachmentData 属性中,在游戏对外服转发请求到网关之前设置就好的。
当设置好需要携带到游戏逻辑服的数据时,我们可以通过 FlowContext.getAttachment () 方法来获取我们在游戏对外服设置的数据
具体查看 https://gitee.com/iohao/iogame/issues/I5J96X
新增:严格登录,路由访问权限的控制
严格登录指的是,如果玩家没有登录,是不能访问其他业务方法的(即 action)。
var accessAuthenticationHook = ExternalGlobalConfig.accessAuthenticationHook;
// 表示登录才能访问业务方法
accessAuthenticationHook.setVerifyIdentity(true);
// 添加不需要登录(身份验证)也能访问的业务方法 (action)
accessAuthenticationHook.addIgnoreAuthenticationCmd(1, 1);
/** 通常这段代码放到游戏对外服中,因为是在游戏对外服做的权限控制。 */
当 setVerifyIdentity = true 时,是不能访问任何业务方法的,包括开发者编写的登录业务方法。但我们可以放开权限,使得玩家可以访问我们的业务方法。上面的伪代码中,放开了路由 1-1 的访问权限,这样不需要登录也可以访问游戏逻辑服的业务方法了。
默认配置下,setVerifyIdentity = false ,就是不登录就可以访问所有的业务方法。
具体查看 https://gitee.com/iohao/iogame/issues/I5J7HG
2022-07-19
v17.1.3 (#I5H8NV、#I5H8H9)
#I5H8H9
增强:相同路由可以用在 action 与广播上;当 action 返回值为 void 时,可以复用路由来作为广播的响应路由。
#I5H8NV
-- 3类通讯方式相关 - 广播,新增 --
广播推送添加新成员,新增顺序特性成员。 BroadcastOrderContext
BroadcastOrderContext 可以确保消息是严格顺序的
```java
... ... 省略部分代码
// 得到严格顺序的广播上下文
var broadcastOrderContext = BrokerClientHelper.getBroadcastOrderContext();
// 使用示例
for (int i = 0; i < 10; i++) {
BarHelloPb helloPb = new BarHelloPb();
helloPb.amount = i;
broadcastOrderContext.broadcastOrder(cmdInfo, helloPb);
}
```
如果没有特殊业务需求,建议使用 BroadcastContext;
因为实际的业务中,关于战斗中的广播都是会设置一个类似帧率的参数,只要不是太密集基本都没问题,
所以我们可以巧妙的利用帧率间隔来达到顺序广播的目的;
BroadcastContext 与 BroadcastOrderContext 的使用方式上基本是一致的;
广播日志 --- 严格顺序广播日志
# 广播给单个玩家
┏━━━━━ 严格顺序广播. [(Broadcast.java:121)] ━━━ [cmd:2 - subCmd:8 - cmdMerge:131080]
┣ userId: 1
┣ 广播数据: BarHelloPb(amount=7)
┣ 广播时间: 2022-07-14 18:26:49.786
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
# 广播给多个玩家
┏━━━━━ 严格顺序广播. [(Broadcast.java:121)] ━━━ [cmd:2 - subCmd:8 - cmdMerge:131080]
┣ userId: [1,5,7]
┣ 广播数据: BarHelloPb(amount=7)
┣ 广播时间: 2022-07-14 18:26:49.786
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
# 广播给全服玩家
┏━━━━━ 严格顺序广播. [(Broadcast.java:121)] ━━━ [cmd:2 - subCmd:8 - cmdMerge:131080]
┣ userId: 全服广播
┣ 广播数据: BarHelloPb(amount=7)
┣ 广播时间: 2022-07-14 18:26:49.786
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
广播日志 --- 默认的广播日志
# 广播给单个玩家
┏━━━━━ 广播. [(TankAction.java:116)] ━━━ [cmd:2 - subCmd:7 - cmdMerge:131079]
┣ userId: 1
┣ 广播数据: BarHelloPb(amount=7)
┣ 广播时间: 2022-07-14 18:31:02.253
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
# 广播给多个玩家
┏━━━━━ 广播. [(TankAction.java:116)] ━━━ [cmd:2 - subCmd:7 - cmdMerge:131079]
┣ userId: [1,5,7]
┣ 广播数据: BarHelloPb(amount=7)
┣ 广播时间: 2022-07-14 18:31:02.253
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
# 广播给全服玩家
┏━━━━━ 广播. [(TankAction.java:116)] ━━━ [cmd:2 - subCmd:7 - cmdMerge:131079]
┣ userId: 全服广播
┣ 广播数据: BarHelloPb(amount=7)
┣ 广播时间: 2022-07-14 18:31:02.253
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
2022-07-11
v17.1.2 (#I5G0FC、#I5GB1D)
3类通讯方式,逻辑服间的相互通信相关
InvokeModuleContext,新增无参请求方法,单个逻辑服与单个逻辑服通信请求 invokeModuleMessage
变更 BarMessage 成员变量类型(#I5G0FC)
BarMessage.dataClass 字段,由 Class<?> 类型改为 String类型
具体的原因可以查看 issu https://gitee.com/iohao/iogame/issues/I5G0FC
当建立多个项目时,在游戏逻辑服处理完业务却无法响应数据到请求端;但可以接收到来自请求端的请求数据; 由于 dataClass 变量是 Class<?> 类型的,如果游戏对外服、游戏网关服没有对应的 class 会造成解码失败,而引发 ClassNotFoundException
将 BarMessage.dataClass 改为 String 类型,这样即使没有在 游戏对外服、游戏网关、游戏逻辑服中引入 PB 业务类,也不会引发这些问题!
将 dataClass 改为 String 类型,这些改动不会对开发者造成影响!
新增综合示例 (#I5GB1D)
综合示例文档 https://www.yuque.com/iohao/game/ruaqza
综合示例内容包含
1. 多服多进程的方式部署
2. 多服单进程的方式部署(类似单体应用的方式部署与开发)
3. springboot 集成
4. JSR380验证
5. 断言 + 异常机制 = 清晰简洁的代码
6. 请求、无响应
7. 请求、响应
8. 广播指定玩家
9. 广播全服玩家
10. 单个逻辑服与单个逻辑服通信请求 - 有返回值(可跨进程)
11. 单个逻辑服与单个逻辑服通信请求 - 无返回值(可跨进程)
12. 单个逻辑服与同类型多个逻辑服通信请求(可跨进程)
13. 业务参数自动装箱、拆箱基础类型(解决协议碎片问题)
14. 游戏文档生成
15. 业务协议文件 .proto 的生成
JSR380相关
移除 JSR303 相关,使用符合 JSR380 标准的校验。这里推荐使用 hibernate-validator 用户需引入validation-api的实现,如:hibernate-validator。注意:hibernate-validator 还依赖了javax.el,需自行引入。
具体使用可以查看 https://www.yuque.com/iohao/game/ghng6g
增加,当触发 JSR380 验证时,会给请求端一些对应的错误信息
2022-07-06
v17.1.1 (上传到中央仓库)
(#I5EE8E、#I5DFRM)
ioGame上传到中央仓库;
ioGame 版本规则 x.y.z
x 表示当前使用的 JDK 版本
y 表示 ioGame API变更版本 (基本上不会变动、常规下是变动 x 才会变动 API)
z 表示 ioGame 新特性、新功能、新模块、bugfix 相关
ioGame 的 x 会跟着最新的 JDK LTS 版本来走的,目的是确保 ioGame 的API 不会发生很大的变化。
为了保持新活力与接受新鲜事物, ioGame 基本会用上最新的 JDK LTS;
x 一般延后 1~4 个季度,给开发者一个缓冲。即下一个 JDK LTS 出来后,那么 ioGame 的 x 会在 1~4个季度后跟上。
也就是说,下一个 x 将会是 21;
扩展库移到
https://gitee.com/iohao/ext-iogame
2022-06-30
(#I5EVQQ)
当开启登录验证时,客户端没登录而请求业务方法时,返回对应的错误码到请求端;
将网络游戏服务器框架的示例放到单独的 git 仓库;前期放在一起是为了方便运行演示,好给开发者进行一个快速的体验;
https://gitee.com/iohao/example-iogame
移除
BrokerClientContext.invokeModuleMessage
--> 请用 InvokeModuleContext.invokeModuleMessage(RequestMessage)
BrokerClientContext.invokeModuleCollectMessage
--> 请用 InvokeModuleContext.invokeModuleCollectMessage(RequestMessage)
参考 https://www.yuque.com/iohao/game/nelwuz#UwwUI
2022-06-27
v1.4.0 (#I5C57I、#I5DTZN)
新增业务参数自动装箱、拆箱基础类型
int : IntPb
List<Integer> : IntListPb
long : LongPb
List<Long> : LongListPb
文档 https://www.yuque.com/iohao/game/ieimzn
新增 ClientProcessorHooks
业务框架处理请求时,开发者可以自定义业务线程编排,
使得框架可以具备集成其他的并发框架的能力,可以无锁实现并发写的需求;
即逻辑服之间通信时,可以同时写,且不需要开发者显示的加锁。
建议配合 Disruptor 来使用,框架中提供了一个 Disruptor 的封装,领域事件 https://www.yuque.com/iohao/game/gmfy1k
文档 https://www.yuque.com/iohao/game/eixd6x
IdleProcessSetting
方法名变更 idleHandler --> idlePipeline,
因为与成员变量 ChannelHandler idleHandler 重名了,
重名理论上是方法重载的情况,因为方法参数不同;
但 lombok 似乎直接给覆盖了,导致成员变量 ChannelHandler idleHandler 不能设置
2022-06-08
v1.3.0 (#I5B8V4)
将模块之间的访问独立一个接口
新增单个逻辑服与单个逻辑服通信请求(可跨进程)无返回值
如: 模块A 访问 模块B 的某个方法,但是不需要任何返回值
文档 https://www.yuque.com/iohao/game/anguu6#cZfdx
新增 InvokeModuleContext 接口,使得在3类通讯方式上的语义与使用上更明确
2022-06-04
监控相关的
逻辑服数据上报
监控逻辑服接收来自各逻辑服的
2022-05-30
v1.2.0 (#I599B9、#I59O74)
支持对外服的玩家绑定指定的游戏逻辑服(可以做到动态分配逻辑服资源)
描述:
支持对外服的玩家绑定指定的游戏逻辑服id,如果用户绑定了指定的游戏逻辑服id,之后与该游戏逻辑服的请求都由这个绑定的游戏逻辑服来处理
场景举例:
1. 什么意思呢?这里用匹配与象棋的场景举例。
2. 假设我们部署了 5 台象棋逻辑服,在玩家开始游戏之前。我们可以在匹配服中进行匹配,当匹配逻辑服把A、B两个玩家匹配到一起了。
3. 此时我们可以通过 访问【同类型】的多个逻辑服方法,当得到象棋房间数最少的象棋逻辑服后(这里假设是房间数最少的象棋逻辑服是《象棋逻辑服-2》),把《象棋逻辑服-2》的逻辑服id 绑定到 A、B 两个玩家身上。
4. 之后与象棋相关的操作请求都会由《象棋逻辑服-2》这个游戏逻辑服来处理,比如:开始游戏、下棋、吃棋、和棋等。
5. 也可以简单点把这理解成,类似 LOL、王者荣耀的匹配机制。在匹配服匹配到玩家后,把匹配结果中的所有玩家分配到一个房间(节点)里面。
6. 这是一种动态分配资源最少的节点(逻辑服)的用法之一。
7. 这个版本先做成只能绑定一个逻辑服的,因为暂时没有想到多个的场景。
这是一种动态分配资源最少的节点(逻辑服)的用法之一。
这个版本先做成只能绑定一个逻辑服的,因为暂时没有想到多个的场景。
新增示例
示例目录 (#I599B9)
https://www.yuque.com/iohao/game/lxqbnb
钩子相关
心跳钩子在项目中的使用
用户上线、下线钩子在项目中的使用
示例目录 (#I59O74)
https://www.yuque.com/iohao/game/idl1wm
用户动态绑定逻辑服节点
DebugInOut (业务框架插件机制)
新增设置最小触发打印时间
之前的是任何请求都打印,现在可以设置一个最小触发打印时间了,
比如给 DebugInout 设置了 50 ms(构造重载),只有请求超过这个时间的请求才进行打印。
ioGame ActionMethodInOut 是业务框架的插件机制。
是很有用的,比如开发者想记录执行时间比较长的 action,可以通过该机制来做。
通过这个接口,你可以做很多事情,当然这要看你的想象力有多丰富了
https://www.yuque.com/iohao/game/pf3sx0
2022-05-23
v1.2.0
模块之间的访问,访问【同类型】的多个逻辑服 (#I58LNI)
如: 模块A 访问 模块B 的某个方法,因为只有模块B持有这些数据,这里的模块指的是逻辑服。
假设启动了多个模块B,分别是:模块B-1、模块B-2、模块B-3、模块B-4 等。框架支持访问【同类型】的多个逻辑服,并把多个相同逻辑服结果收集到一起
场景举例:
【象棋逻辑服】有 3 台,分别是:《象棋逻辑服-1》、《象棋逻辑服-2》、《象棋逻辑服-3》,这些逻辑服可以在不同有进程中。
我们可以在大厅逻辑服中向同类型的多个游戏逻辑服通信请求,意思是大厅发起一个向这 3 台象棋逻辑服的请求,框架会收集这 3 个结果集(假设结果是:当前服务器房间数)。
当大厅得到这个结果集,可以统计房间的总数,又或者说根据这些信息做一些其他的业务逻辑;当然实际中不会这么做;这里只是举个例子。 实际当中可以发挥大伙的想象力。
示例文档
https://www.yuque.com/iohao/game/rf9rb9
业务框架
action 的返回值支持 null
debugInout 新增逻辑服id、逻辑服类型的打印信息
SimpleHelper、SimpleRunOne、ClusterSimpleHelper、ClusterSimpleRunOne
的逻辑服参数改为由 BrokerClientStartup --> AbstractBrokerClientStartup
明确这是一个 BrokerClient 启动器
BrokerClientService --> BrokerClientApplication
2022-05-20
v1.0
异步化、事件驱动的架构设计;网关集群无中心节点、负载均衡
每个逻辑服都可以独立进程部署
新增 Broker 概念与 BrokerClient 概念
Broker 相当于之前的游戏网关,BrokerClient相当于之前的逻辑服
BrokerClient 负责与 Broker 建立连接
Broker 集群,集群使用 gossip 协议
简化游戏逻辑服的创建
业务框架新增
DataCodec 开发者可以自定义业务参数的编解码
新增广播(推送日志)与相关示例
包名变更
此次的架构更新很大,相关的文档也进行了更新
支持逻辑服(BrokerClient)与游戏网关(Broker)的数量扩展,并能很好的进行负载均衡。
在结构上进行了明确
1 业务框架目录 common
2 网络通信框架目录 net-bolt
3 内置模块目录
4 游戏实战目录
5 示例目录
game-collect --> example-game-collect
明确这个目录是一个示例目录
后续计划
日志传输、Metrics采集、染色日志、链路追踪。
Issues (#I57QAZ、#I510AK)
2022-05-08
新增 分布式锁-基于Redisson的简单实现 (#I53XW3)
参考: https://www.yuque.com/iohao/game/wz7af5
2022-04-13
新增 u3d、cocos 连接示例 和 tcp socket 的连接示例
u3d 连接示例 https://www.yuque.com/iohao/game/syv5mm
cocos 连接示例 https://www.yuque.com/iohao/game/ua4afq
tcp socket 示例 https://www.yuque.com/iohao/game/ywe7uc
游戏示例目录 game-collect 新增一些文档说明和单独启动逻辑服的方法
删除 game-test 示例目录
2022-04-06
为添加 alibroker 网络通信框架做准备 (#I510AK)
全异步化架构设计
https://alibroker.info/
独立 bolt 网络通信框架到单独目录 net-bolt。
2022-03-31
添加游戏部件抽象模块
用于游戏实践的开发,进一步减少开发实践过程中的工作量
只提供抽象骨架, 具体的逻辑实现由子游戏自定义
提供抽象流程的有:
游戏规则接口 RoomRuleInfoCustom
创建玩家接口 RoomPlayerCreateCustom
房间创建接口 RoomCreateCustom
进入房间接口 RoomEnterCustom
游戏开始接口 RoomGameStartCustom
提供抽象类的有:
抽象房间 AbstractRoom
抽象玩家 AbstractPlayer
业务操作接口 OperationHandler
玩法操作的处理对象, 享元工厂 OperationFlyweightFactory
2022-03-27
新增 spring 集成 (#I4Z2HS)
移除 widget-common 模块
业务框架优化
优化部分 list 结构改为 array
DefaultActionFactoryBean 新增创建 action 混合特性
业务框架文档相关
自动生成系统错误码到 doc_game.txt 文件中,不需要在手动配置
新增示例
example/example-for-spring
spring集成 相关 DemoSpringBootApplication.java
example/example-interaction
多逻辑服相互交互的 DemoInteractionApplication.java
FlowContext 新增方法
getCmdInfo 路由信息
invokeModuleMessageData (请求其他子服务器(其他逻辑服)的数据)
broadcast (广播)
changeName
ClientStartupConfig --> ClientStartup
ServerStartupConfig --> ServerStartup
ActionControllerFactoryBean --> ActionFactoryBean
InOutInfo --> InOutManager
AbstractExternalClientStartupConfig --> AbstractExternalClientStartup
2022-03-21
新增 UserSession (与 channel 是 1:1 的关系,可取到对应的 userId、channel 等信息。 )
FlowContext 新增动态属性
FlowOptionDynamic、FlowOption
登录相关
用户登录相关移 除虚拟userId
新增 UserIdSettingKit,简化开发者登录业务
优化业务框架
统一业务入口
优化 FlowContext
删除一些遗留代码 game-logic-all 相关
2022-03-14
新增心跳相关设置 IdleProcessSetting
心跳事件回调 IdleCallback
心跳 handler IdleHandler
(#I4XSCD)
新增ExternalJoinEnum:
UDP (udp socket 预留扩展)
EXT_SOCKET (特殊的预留扩展)
新增用户钩子接口 UserHook 上线时、下线时会触发
利用好该接口,可以把用户当前在线状态通知到逻辑服,比如使用 redis PubSub 之类的。
(#I4XSCH)
简化对外服务器 - 构建器 ExternalServerBuilder
2022-03-11
动态属性示例
2022-03-10
Copyright
2022-03-08
业务框架新增 InOutInfo 管理插件相关
把插件的执行放入 InOutInfo 中。
当只有一个插件时,不走 foreach
2022-03-07
新增基于 FXGL游戏引擎的游戏示例(坦克射击)
TankApp.java
新增基于FXGL的JAVA游戏引擎,示例 文档
网络游戏框架 change name, ioGame
2022-03-01
新增简单的启动器 SimpleRunOne
简化对外服 ExternalServer 的内部逻辑服启动
文档更新
移除 example 的示例,只保留少量
2022-02-25
文档更新:快速从零编写服务器完整示例
DebugInOut
打印微调
打印用户自定义异常的msg
新增 快速从零编写服务器完整示例代码
HelloReq
DemoAction
DemoLogicServer
DemoApplication
DemoWebsocketClient
BarSkeletonBuilderParamConfig 新增构建 BarSkeletonBuilder 方法
2022-02-23
文档更新
2022-02-21
游戏实践 game-one pom 添加 maven-assembly-plugin 打包 jar, 方便测试
业务框架 bugfix , 业务文档相关 在打包后没有java源码引发的 null
游戏框架对外服 默认连接协议改为 WEBSOCKET
2022-02-11
编写游戏框架文档
通信协议
Action的业务参数获取
快速入门示例
用户连接登录编写
对外服的协议说明
Action
路由 - 术语
异常机制
业务框架的构建器
开启JSR303+验证规范
2022-02-07
编写业务框架文档 https://www.yuque.com/iohao/game
异常机制
业务框架的构建器
游戏开发需要具备的知识
业务文档的生成
业务PB的生成
FlowContext
网关服的编写
逻辑服的编写
对外服的编写
新增对外服逻辑服的抽象类 AbstractExternalClientStartupConfig
2022-02-03
新增 游戏(错误码)文档的生成
新增 游戏(异常信息)文档的生成
游戏实践新增大厅服
与游戏逻辑服关联不强的业务逻辑或比较通用的业务就写在大厅服中
比如登录... 等.
2022-02-02
删除 DocActionBroadcast 统一使用 DocActionSends 来生成推送文档
新增 BarSkeletonBuilderParamConfig 构建参数的配置
新增注解 DocActionSends 消息推送文档的生成
配合 DocActionSend 生成多条推送文档
2022-02-01
新增抽象推送 AbstractFlowContextSend
新增推送文档注解
用于补充推送相关的文档,因为推送是不是用户主动发起的请求,
所以需要单独标记,以便业务框架生成推送文档。
文档在生成还未实现
新增动态属性 AttrOptionDynamic 接口
配合 AttrOption 可以更明确动态属性的类型
FlowContext 的动态属性由 AttrDynamic 改为 AttrOptionDynamic
可以更明确动态属性的类型
移除业务框架参数解析器的 userId 解析,全部由 FlowContext 接管,
因为 FlowContext 是流程上下文。
2022-01-30
移除广播小部件 模块 (感觉设计过于凌乱)
独立广播操作,将广播内嵌到(逻辑服、网关、对外服)中
新增客户端模拟
修复广播时的 bug (在逻辑服传输数据到网关时,response.data 对象如果没有实现 Serializable 会异常)
2022-01-29
新增游戏文档 广播相关(简单的业务方法版)
2022-01-25
新增轻量小部件 light-jprotobuf
简化 jprotobuf 的编写方式
不在需要 @Protobuf(description = "xxx") 来生成注释了
现在 jprotobuf 的类中,注释即文档
可将多个 jprotobuf 类 合并生成为一个原生的 .proto 文件, 不使用 jprotobuf 提供的生成插件,
因为 jprotobuf 生成的 .proto 文件太乱(会有重复的文件类),在阅读时也不方便
2022-01-24
坦克 pb 更新
2022-01-23
业务框架支持文档生成, java代码即文档
业务框架日志可定位代码行数
debug插件
启动时
删除部分编解码代码
2022-01-22
新增路由错误码: 一般是客户端请求了不存在的路由引起的
网关增加 路由错误码 逻辑,如果客户端请求了不存在的路由,直接响应错误
新增 websocket 编解码
增加 websocket 数据压缩扩展
对外服传输协议改为纯 PB
2022-01-21
网关新增路由检测:
对外服请求逻辑服时
如果没有找到对应的逻辑服来处理请求,不在往逻辑服发送
并立即返回错误码给对外服
2022-01-20
对外服的 socket 和 websocket 共用一个业务处理类 ExternalBizHandler (负责把游戏端的请求 转发给网关)
对外服的 socket 和 websocket 接收来自网关的响应也逻辑也保持一至
2022-01-19
登录业务 新增 ChangeUserIdKit 工具:
变更对外服的 userId, userId与channel 关联
用在用户登录时,从程序员的业务数据库中获得 userId
新增用户登录, 登录流程:
真实客户端发送请求 --> 对外服 --> 网关服 --> 逻辑服(
逻辑服通知对外服变更:逻辑服 --> 网关服 --> 对外服 --> 网关服 --> 逻辑服
) --> 网关服 --> 对外服
业务框架:
BarMessage 增加 rpcCommandType 字段:
特性如下:
在 bolt 中, 调用方使用
(com.alipay.remoting.rpc.RpcServer.oneway
或 com.alipay.remoting.rpc.RpcClient.oneway)的 oneway 方法
则 AsyncContext.sendResponse 无法回传响应
原因可阅读 com.alipay.remoting.rpc.protocol.RpcRequestProcessor.sendResponseIfNecessary 源码。
业务框架保持与 bolt 的风格一至使用 RpcCommandType
不同的是业务框架会用 RpcCommandType 区别使用什么方式来发送响应。
如果 rpcCommandType != RpcCommandType.REQUEST_ONEWAY ,
就使用 com.alipay.remoting.AsyncContext.sendResponse 来发送响应
具体发送逻辑可读 DefaultActionAfter 源码
2022-01-18
优化业务框架: 新增 action void 特性, 定义为 void 的业务方法,不在给调用端响应(除非有业务异常码)
优化业务框架: DebugInOut 日志可以支持 JSR 303、JSR 349、JSR 380 验证规范 的日志
优化业务框架: Flow 流程,在开启业务参数验证规范功能时,业务参数如果验证不通过,则直接响应带有错误码的消息给调用端
2022-01-17
业务框架支持 JSR 303、JSR 349、JSR 380 验证规范
业务框架新增 flow 上下文 (FlowContext), 生命周期存在于当前执行流程
2022-01-16
对外服 新增接收并处理 来自网关的广播消息
广播小部件 新增广播上下文
2022-01-15
整合 protobuf、mapstruct、lombok 的使用
新增坦克游戏相关 pb
规范子游戏的 cmd 编写方式
2022-01-14
业务框架加强规范异常处理
提供异常全局统一处理规范
领域事件新增默认异常处理
2022-01-13
对外服务器 支持 websocket
2022-01-12
业务框架支持 proto
实战(网关、对外服、逻辑服),简化配置
2022-01-11
编写对外服务器
对外服务器连接到网关
2022-01-07
轻量小部件多环境切换
2022-01-02
boot 加载项 BootConfig
动态属性
2021-12-26
轻量小部件-领域事件
1. 领域驱动设计,基于LMAX架构。
2. 单一职责原则,可以给系统的可扩展、高伸缩、低耦合达到极致。
3. 异步高并发,线程安全的并且基于lmax架构。可并发执行,性能超高,执行1000W次事件只需要1.1秒左右(这个得看你的电脑配置)。
4. 使用事件消费的方式编写代码,使得业务在复杂也不会使得代码混乱,维护代码成本更低。
5. 插件形式提供事件领域,做到了可插拔,就像玩乐高积木般有趣。
2021-12-21
业务框架更新
change ActionMethodInOut method
新增 InOutContext 上下文, 方便扩展 ActionMethodInOut
新增 ActionMethodInOut 实现类DebugInOut 用于开发时,打印一些参数
如:
┏━━━━━ Debug [BeeAction.java] ━━━ [.(BeeAction.java:1).hello]
┣ 参数 : beeApple : BeeApple(id=101, content= jackson )
┣ 返回值: : hello:
┣ 方法名: hello
┣ 时间 : 1 ms (业务方法总耗时)
┗━━━━━ Debug [BeeAction.java] ━━━
2021-12-20
完善客户端示例与启动流程
整合 sofa-bolt
2021-12-15
初始化项目
编写业务框架
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。