ioGame 21.10,netty 分布式游戏服务器框架;java 分步式游戏服务器框架;
文档与日志
版本更新汇总
- [core] #315 ResponseMessage 增加协议碎片便捷获取,简化跨服调用时的使用
- [core] ActionCommand 增加 containAnnotation、getAnnotation 方法,简化获取 action 相关注解信息的使用。
- [kit] [动态属性] 增加 ifNull 方法,如果动态属性值为 null,则执行给定的操作,否则不执行任何操作。执行给定操作后将得到一个返回值,该返回值会设置到动态属性中。
- [kit] TimeKit 增加 nowLocalDate 方法,可减少 LocalDate 对象的创建;优化 currentTimeMillis 方法的时间更新策略。同时,优化 nowLocalDate、currentTimeMillis 方法,不使用时将不会占用相关资源。
- [EventBus] 分布式事件总线增加 EventBusRunner 接口。EventBus 接口化,方便开发者自定义扩展。fix 订阅者使用自身所关联的 EventBus 处理相关事件。
[core] 315 ResponseMessage 增加协议碎片便捷获取,简化跨服调用时的使用
框架具备协议碎片特性。某些业务中,我们需要跨服访问其他游戏逻辑服,以获取某些业务数据;一些简单的数据,我们可以通过协议碎片来返回,从而避免定义过多的协议。
现为 ResponseMessage 增加协议碎片支持,简化跨服调用时的使用,新增的方法如下
public void test() {
ResponseMessage responseMessage = ...;
// object
responseMessage.getValue(Student.class);
List<Student> listValue = responseMessage.listValue(Student.class);
// int
int intValue = responseMessage.getInt();
List<Integer> listInt = responseMessage.listInt();
// long
long longValue = responseMessage.getLong();
List<Long> listLong = responseMessage.listLong();
// String
String stringValue = responseMessage.getString();
List<String> listString = responseMessage.listString();
// boolean
boolean boolValue = responseMessage.getBoolean();
List<Boolean> listBoolean = responseMessage.listBoolean();
}
示例说明
- HomeAction 是 【Home 游戏逻辑服】提供的 action
- UserAction 是 【User 游戏逻辑服】提供的 action
两个逻辑服的交互如下,UserAction 使用跨服方式调用了【Home 游戏逻辑服】的几个方法,并通过 responseMessage 的协议碎片支持,简化跨服调用时的使用。
示例中演示了 string、string list、object list 的简化使用(协议碎片获取时的简化使用)。
@ProtobufClass
@FieldDefaults(level = AccessLevel.PUBLIC)
public class Student {
String name;
}
// home 游戏逻辑服提供的 action
public class HomeAction {
@ActionMethod(HomeCmd.name)
public String name() {
return "a";
}
@ActionMethod(HomeCmd.listName)
public List<String> listName() {
return List.of("a", "b");
}
@ActionMethod(HomeCmd.listStudent)
public List<Student> listStudent() {
Student student = new Student();
student.name = "a";
Student student2 = new Student();
student2.name = "b";
return List.of(student, student2);
}
}
@ActionController(UserCmd.cmd)
public class UserAction {
@ActionMethod(UserCmd.userSleep)
public void userSleep(FlowContext flowContext) {
flowContext.invokeModuleMessageAsync(HomeCmd.of(HomeCmd.name), responseMessage -> {
String name = responseMessage.getString();
log.info("{}", name);
});
flowContext.invokeModuleMessageAsync(HomeCmd.of(HomeCmd.listName), responseMessage -> {
var listName = responseMessage.listString();
log.info("{}", listName);
});
flowContext.invokeModuleMessageAsync(HomeCmd.of(HomeCmd.listStudent), responseMessage -> {
List<Student> studentList = responseMessage.listValue(Student.class);
log.info("{}", studentList);
});
}
}
[core] ActionCommand 增加 containAnnotation、getAnnotation 方法,简化获取 action 相关注解信息的使用。
ActionCommand actionCommand = flowContext.getActionCommand();
bool contain = actionCommand.containAnnotation(DisableDebugInout.class);
var annotation = actionCommand.getAnnotation(DisableDebugInout.class);
[EventBus] 分布式事件总线
- [增强扩展] 将抽象类 AbstractEventBusRunner 标记为过时的,由接口 EventBusRunner 代替。
- [增强扩展] 分布式事件总线 EventBus 接口化,方便开发者自定义扩展。增加总线相关的 javadoc。
- [fix] 订阅者使用自身所关联的 EventBus 处理相关事件。
关于 fix 订阅者使用自身所关联的 EventBus 处理相关事件,在此之前可能引发 bug 的场景如下
- 【游戏逻辑服 A】 发布事件。
- 【游戏逻辑服 B】 订阅者接收事件并处理,在处理过程中又调用了【游戏逻辑服 A】 某个 action 方法。
该业务场景,会在多服单进程下会引发调用超时,但在多服多进程下则不会超时。
[kit] TimeKit
增强 TimeKit 增加 nowLocalDate 方法,可减少 LocalDate 对象的创建;
优化 currentTimeMillis 方法的时间更新策略。
优化 nowLocalDate、currentTimeMillis 不使用时将不会占用相关资源。
@Test
public void test() {
long millis = TimeKit.currentTimeMillis();
Assert.assertTrue(millis > 0);
LocalDate localDate = TimeKit.nowLocalDate();
Assert.assertTrue(localDate.isEqual(LocalDate.now()));
}
[kit] 动态属性
[动态属性] 增加 ifNull 方法,如果动态属性值为 null,则执行给定的操作,否则不执行任何操作。执行给定操作后将得到一个返回值,该返回值会设置到动态属性中。
public class AttrOptionDynamicTest {
// 动态属性 key
AttrOption<AttrCat> attrCatOption = AttrOption.valueOf("AttrCat");
@Test
public void ifNull() {
var myAttrOptions = new MyAttrOptions();
Assert.assertNull(myAttrOptions.option(attrCatOption));
// 如果 catAttrOption 属性为 null,则创建 AttrCat 对象,并赋值到属性中
myAttrOptions.ifNull(attrCatOption, AttrCat::new);
Assert.assertNotNull(myAttrOptions.option(attrCatOption));
}
private static class AttrCat {
String name;
}
@Getter
private static class MyAttrOptions implements AttrOptionDynamic {
final AttrOptions options = new AttrOptions();
}
}
[其他 - 相关库升级]
<netty.version>4.1.111.Final</netty.version>
<jctools-core.version>4.0.5</jctools-core.version>
<jprotobuf.version>2.4.23</jprotobuf.version>