主要更新
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 类并无区别。如果只负责编写游戏业务,那么对于业务框架的学习可以到此为止了。
游戏编程就是如此简单!
适合人群?
- 长期从事 web 内部系统开发人员, 想了解游戏的
- 刚从事游戏开发的
- 未从事过游戏开发但却对其感兴趣的
- 对设计模式在实践中的应用和 sofa-bolt 有兴趣的学习者
推荐实际编程经验一年以上的人员!
ioGame 提供了丰富的在线高质量使用文档,为你们的团队助力,带上你们的小伙伴一起,这样就不用手把手的教了。