ioGame 网络游戏服务器框架 v1.2.0,实现 LOL、王者荣耀匹配后动态分配房间节点

来源: 投稿
作者: 渔民小镇
2022-05-30 11:52:00

主要更新

1.用户动态绑定逻辑服节点,实现类似LOL、王者荣耀匹配后动态分配房间节点(#I59O74

    支持对外服的玩家绑定指定的游戏逻辑服(可以做到动态分配游戏逻辑服资源)

    描述
        支持对外服的玩家绑定指定的游戏逻辑服id,如果用户绑定了指定的游戏逻辑服id,之后与该游戏逻辑服的请求都由这个绑定的游戏逻辑服来处理

    场景举例

        1.什么意思呢?这里用匹配与象棋的场景举例。
        2.假设我们部署了 5 台象棋逻辑服,在玩家开始游戏之前。我们可以在匹配服中进行匹配,当匹配逻辑服把A、B两个玩家匹配到一起了。
        3.此时我们可以通过 访问【同类型】的多个逻辑服方法,当得到象棋房间数最少的象棋逻辑服后(这里假设是房间数最少的象棋逻辑服是《象棋逻辑服-2》),把《象棋逻辑服-2》的逻辑服id 绑定到 A、B 两个玩家身上。
        4.之后与象棋相关的操作请求都会由《象棋逻辑服-2》这个游戏逻辑服来处理,比如:开始游戏、下棋、吃棋、和棋等。
        5.也可以简单点把这理解成,类似 LOL、王者荣耀的匹配机制。在匹配服匹配到玩家后,把匹配结果中的所有玩家分配到一个房间(节点)里面。
        6.这是一种动态分配资源最少的节点(逻辑服)的用法之一。
        7.这个版本先做成只能绑定一个逻辑服的,因为暂时没有想到多个的场景应用。

    大概简图如下

    玩家A和玩家B可以在不同在对外服上,两个玩家发起一个匹配请求。由匹配逻辑服来处理,假设是房间数最少的象棋逻辑服是《象棋逻辑服-2》,那么《象棋逻辑服-2》的逻辑服id 绑定到 A、B 两个玩家身后。

    之后的处理的简图如下:

  • 之后与 象棋相关的操作请求 都会由《象棋逻辑服-2》这个游戏逻辑服来处理,比如:开始游戏、下棋、吃棋、和棋等。
  • 也可以简单点把这理解成,类似 LOL、王者荣耀的匹配机制。在匹配服匹配到玩家后,把匹配结果中的所有玩家分配到一个房间(节点)里面。
  • 这是一种动态分配资源最少的节点(逻辑服)的用法之一。

这也是结合了上一篇资讯(ioGame 网络游戏服务器框架(Java) v1.1.0 发布)中介绍的同类型请求的应用实践,来实现的动态分配逻辑服节点的玩法。

2.新增示例
    示例目录-钩子相关#I599B9
        心跳钩子在项目中的使用
        用户上线、下线钩子在项目中的使用
    示例目录-用户动态绑定逻辑服节点#I59O74

3.DebugInOut (业务框架插件机制
    新增设置最小触发打印时间
    之前的是任何请求都打印,现在可以设置一个最小触发打印时间了,
    比如给 DebugInout 设置了 50 ms(构造重载),只有请求超过这个时间的请求才进行打印。

    ioGame ActionMethodInOut 是业务框架的插件机制。
    是很有用的,比如开发者想记录执行时间比较长的 action,可以通过该机制来做。
    通过这个接口,你可以做很多事情,当然这要看你的想象力有多丰富了
   

下版本预告 - 监控运维扩展

    扩展一个监控逻辑服,这样可以收集每个逻辑服的操作系统和硬件等各信息了。这一切可以做到无感知的,因为 ioGame 具备同类型请求的特性;

    意思是在监控逻辑服中,发起一个收集各逻辑服系统信息请求,各逻辑服在收到这个请求后,上报自身系统信息。采集指标包括,如:cpu相关的(使用率、温度)、内存使用率、磁盘(容量、IO)、硬盘SMART健康状态、逻辑服的数量、 对外服的在线人数、action相关的(action数量、action信息)。

网络游戏框架简介

ioGame 是国内首个基于蚂蚁金服 sofa-bolt 的网络游戏框架,游戏框架由 [网络通信框架] 和 [业务框架] 组成。

  • 网络通信框架负责服务器之间的网络通信
  • 业务框架:负责业务逻辑的处理方式和编写方式

    ioGame 是一个由 java 语言编写的网络游戏服务器框架。支持 websocket、tcp ,适用于全球同服、回合制游戏、策略游戏、即时战斗等游戏服务器的开发。具有高性能、稳定、易用易扩展、超好编程体验等特点。可做为 H5(HTML5)、手游、端游的游戏服务器。

    在 ioGame 中能让你遗忘 Netty,你几乎没有机会能直接的接触到 Netty 的复杂,但却能享受 Netty 带来的高性能。对开发者要求极低,为开发者节约开发时间。

    通过 ioGame 可以快速的搭建一个稳定的、集群无中心节点、自带负载均衡、高性能的、分步式、避免类爆炸设计的网络游戏服务器。

    游戏框架借助于蚂蚁金服 sofa-bolt 通信框架来提供稳定、高性能

    即使之前没有游戏编程的经验,也能参与到游戏编程中。如果你之前具备一些游戏开发或者 web MVC 相关的知识,则会更容易上手游戏服务的开发。

 

架构简图

 

通过 ioGame 你可以很容易的搭建出一个集群、分步式的网络游戏服务器!

游戏网关集群

    broker (游戏网关)可以集群的方式部署,集群无中心节点、自带负载均衡。ioGame 本身就包含服务注册,你不需要外接一个服务注册中心,如 Eureka,ZooKeeper 等(变相的节约服务器成本)。

    通过 broker (游戏网关) 的介入,之前非常复杂的负载均衡设计,如服务注册、健康度检查(后续版本提供)、到服务端的连接维护等这些问题,在 ioGame 中都不需要了,结构也简单了很多。

    实际上单台 broker (游戏网关) 性能已经能够满足了,因为游戏网关只做了转发。

逻辑服

    对外服和游戏逻辑服可以有很多个,逻辑服数量的理论上限是 netty 的连接上限。

 

通过 ioGame 可以使得游戏编程变得简单,下面是一个业务示例

Proto 协议文件定义

    首先我们自定义一个协议文件,这个协议文件作为我们的业务载体描述。这个协议是纯 java 代码编写的,使用的是 jprotobuf, jprotobuf 是对 google protobuf 的简化使用,性能同等。

    可以把这理解成DTO、POJO、业务数据载体等,其主要目的是用于业务数据的传输

/** 请求 */
@ProtobufClass
@FieldDefaults(level = AccessLevel.PUBLIC)
public class HelloReq {
    String name;
}

Action

    游戏服务的编程,游戏服务接收业务数据后,对业务数据进行处理;

@ActionController(1)
public class DemoAction {
    @ActionMethod(0)
    public HelloReq here(HelloReq helloReq) {
        HelloReq newHelloReq = new HelloReq();
        newHelloReq.name = helloReq.name + ", I'm here ";
        return newHelloReq;
    }
}

一个方法在业务框架中表示一个 Action(既一个业务动作)。

方法声名的参数是用于接收前端传入的业务数据,在方法 return 时,数据就可以被游戏前端接收到。程序员可以不需要关心业务框架的内部细节。

从上面的示例可以看出,这和普通的 java 类并无区别。如果只负责编写游戏业务,那么对于业务框架的学习可以到此为止了。

游戏编程就是如此简单

适合人群?

  1. 长期从事 web 内部系统开发人员, 想了解游戏的
  2. 刚从事游戏开发的
  3. 未从事过游戏开发但却对其感兴趣的
  4. 对设计模式在实践中的应用和 sofa-bolt 有兴趣的学习者

推荐实际编程经验一年以上的人员

ioGame 提供了丰富的在线高质量使用文档,为你们的团队助力,带上你们的小伙伴一起,这样就不用手把手的教了。

 

 

展开阅读全文
精彩评论
👍👍👍
2022-05-30 14:52
1
举报
16 收藏
分享
2 评论
16 收藏
分享
返回顶部
顶部