ioGame 源码完全开放、最新文档阅读完全开放;使用完全自由、免费(遵守开源协议)。

ioGame 是一个轻量级的网络编程框架,适用于网络游戏服务器、物联网、内部系统及各种需要长连接的场景。

版本更新汇总

  • [kit] #291 增加轻量可控的延时任务

  • [kit] 细分时间日期相关工具。

  • [Archive] #363 light-redis-lock 相关模块

  • [Archive] #364 light-timer-task 相关模块

  • [core] 增加同一个 ActionController 相同的 action 方法名只允许存在一个的检测。

  • [core] Banner 增加启动时的错误数量提示。

  • [core] #365 支持对接文档生成时,可以根据路由访问权限来控制文档的生成

[kit]

#291 增加轻量可控的延时任务

文档 – 轻量可控的延时任务 (yuque.com)

 @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 支持对接文档生成时,可以根据路由访问权限来控制文档的生成

生成相关代码的使用及相关文档

 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 万次业务逻辑。


免责声明:本文系转载,版权归原作者所有;旨在传递信息,不代表一休教程网的观点和立场。