ioGame 源码完全开放、最新文档阅读完全开放;使用完全自由、免费(遵守开源协议)。
ioGame 是一个轻量级的网络编程框架,适用于网络游戏服务器、物联网、内部系统及各种需要长连接的场景。
版本更新汇总
[kit]
#291 增加轻量可控的延时任务
@Test public void example() { long timeMillis = System.currentTimeMillis(); DelayTask delayTask = DelayTaskKit.of(() -> { long value = System.currentTimeMillis() - timeMillis; log.info("1 - 最终 {} ms 后,执行延时任务", value); }) .plusTime(Duration.ofSeconds(1)) // 增加 1 秒的延时 .task(); // 启动任务 delayTask.plusTimeMillis(500); // 增加 0.5 秒的延时 delayTask.minusTimeMillis(500);// 减少 0.5 秒的延时时间 // 因为 taskId 相同,所以会覆盖之前的延时任务 String taskId = delayTask.getTaskId(); delayTask = DelayTaskKit.of(taskId, () -> { long value = System.currentTimeMillis() - timeMillis; log.info("2 - 最终 {} ms 后,执行延时任务", value); }) .plusTime(Duration.ofSeconds(1)) // 增加 1 秒的延时 .task(); // 启动任务 // 取消延时任务,下面两个方法是等价的 delayTask.cancel(); DelayTaskKit.cancel(taskId); // 可以通过 taskId 查找该延时任务 Optional<DelayTask> optionalDelayTask = DelayTaskKit.optional(taskId); if (optionalDelayTask.isPresent()) { var delayTask = optionalDelayTask.get(); } // 通过 taskId 查找延时任务,存在则执行给定逻辑 DelayTaskKit.ifPresent(taskId, delayTask -> { delayTask.plusTimeMillis(500); // 增加 0.5 秒的延时时间 }); }
细分时间日期相关工具。
see com.iohao.game.common.kit.time
[Archive]
#363 light-redis-lock 相关模块
将 light-redis-lock、light-redis-lock-spring-boot-starter 模块做归档。在过去的时间里,由于一直没有改动这些模块的相关内容,现决定将不再上传到 maven 库中,以节约公共资源。如果你使用了该模块的相关内容,请指定最后一个版本即可。如
<!-- https://mvnrepository.com/artifact/com.iohao.game/light-redis-lock --> <dependency> <groupId>com.iohao.game</groupId> <artifactId>light-redis-lock</artifactId> <version>21.15</version> </dependency> <!-- https://mvnrepository.com/artifact/com.iohao.game/light-redis-lock-spring-boot-starter --> <dependency> <groupId>com.iohao.game</groupId> <artifactId>light-redis-lock-spring-boot-starter</artifactId> <version>21.15</version> </dependency>
模块相关文档 – redis-lock 分布式锁 (yuque.com)
#364 light-timer-task 相关模块
将 light-timer-task 模块做归档。在过去的时间里,由于一直没有改动这些模块的相关内容;同时,也因为框架内置了类似的功能 #291 。现决定将不再上传到 maven 库中,以节约公共资源。如果你使用了该模块的相关内容,请指定最后一个版本即可。如
<!-- https://mvnrepository.com/artifact/com.iohao.game/light-timer-task --> <dependency> <groupId>com.iohao.game</groupId> <artifactId>light-timer-task</artifactId> <version>21.15</version> </dependency>
模块相关文档 – timer-task 任务延时器 (yuque.com)
类似的代替 轻量可控的延时任务 (yuque.com)
[core]
#365 支持对接文档生成时,可以根据路由访问权限来控制文档的生成
生成相关代码的使用及相关文档
-
ExternalGlobalConfig.accessAuthenticationHook
,相关文档 – 路由访问权限控制 (yuque.com) -
IoGameDocumentHelper,相关文档 – 游戏对接文档生成 (yuque.com)
public class MyExternalServer { public static void extractedAccess() { // https://www.yuque.com/iohao/game/nap5y8p5fevhv99y var accessAuthenticationHook = ExternalGlobalConfig.accessAuthenticationHook; ... 省略部分代码 // 添加 - 拒绝玩家访问权限的控制 accessAuthenticationHook.addRejectionCmd(RankCmd.cmd, RankCmd.internalUpdate); } } public class TestGenerate { ... 省略部分代码 public static void main(String[] args) { // 对外服访问权限控制 MyExternalServer.extractedAccess(); // (复用)设置文档路由访问权限控制 IoGameDocumentHelper.setDocumentAccessAuthentication(ExternalGlobalConfig.accessAuthenticationHook::reject); // ====== 生成对接文档、生成 proto ====== // generateCsharp(); // generateTypeScript(); // 生成文档 IoGameDocumentHelper.generateDocument(); // .proto 文件生成 // generateProtoFile(); } }
预览 – 没有做控制前的生成
==================== RankAction ==================== 路由: 4 - 1 --- 【listRank】 --- 【RankAction:48】【listRank】 方法参数: StringValue 排行类型 方法返回值: ByteValueList<RankUpdate> 玩家排行名次更新 路由: 4 - 10 --- 【玩家排行名次更新】 --- 【RankAction:60】【internalUpdate】 方法参数: RankUpdate 玩家排行名次更新 方法返回值: void
预览 – 加入了访问控制后的生成
我们可以看见,路由为 4-10 的 action 方法没有生成到对接文档中。
==================== RankAction ==================== 路由: 4 - 1 --- 【listRank】 --- 【RankAction:48】【listRank】 方法参数: StringValue 排行类型 方法返回值: ByteValueList<RankUpdate> 玩家排行名次更新
提示:除了文档文档的访问权限控制外,还支持 SDK TypeScript、SDK C# …等客户端代码生成的访问权限控制。
SDK 相关请阅读:SDK&对接文档 (yuque.com)
[其他更新]
<netty.version>4.1.113.Final</netty.version>
ioGame 使用趋势数据
关注 ioGame 的游戏服务器开发者持续增多,2022-09 ~ 至今各月的统计数据;
这里的统计信息是关于开发者关注 ioGame 框架相关的,从统计数据中可以看出,由于 ioGame 上手简单,功能强大等优点,得到了众多开发者的关注。如果你想知道 ioGame 有没有人在使用,可以先到这里看下统计数据、开发者的评价与讨论。
https://www.yuque.com/iohao/game/gpxk93#TwVa8
这里展示了每月的统计数据,统计数据来源于语雀后台,这些数据都是真实的、客观存在的、活的。
ioGame 的组成
ioGame 由 [网络通信框架] 和 [业务框架] 组成
- 网络通信框架:职责是各服务器之间的网络通信
- 业务框架:职责是业务逻辑的处理方式和编写方式
网络通信框架
SOFABolt 是蚂蚁金融服务集团开发的一套基于 Netty 实现的网络通信框架。
- 为了让 Java 程序员能将更多的精力放在基于网络通信的业务逻辑实现上,而不是过多的纠结于网络底层 NIO 的实现以及处理难以调试的网络问题,Netty 应运而生。
- 为了让中间件开发者能将更多的精力放在产品功能特性实现上,而不是重复地一遍遍制造通信框架的轮子,SOFABolt 应运而生。
Bolt 名字取自迪士尼动画 – 闪***,是一个基于 Netty 最佳实践的轻量、易用、高性能、易扩展的通信框架。
业务框架
如果说 sofa-bolt 是为了让 Java 程序员能将更多的精力放在基于网络通信的业务逻辑实现上。而业务框架正是解决业务逻辑如何方便实现这一问题上。业务框架是游戏框架的一部分,职责是简化程序员的业务逻辑实现,业务框架使程序员能够快速的开始编写游戏业务。
业务框架对于每个 action (即业务的处理方法) 都是通过 asm 与 Singleton、Flyweight 、Command 等设计模式结合,对 action 的获取上通过 array 来得到,是一种近原生的方式。
单线程中,业务框架平均每秒可以执行 1152 万次业务逻辑。