业务框架
介绍
如果说 sofa-bolt 是为了让 Java 程序员能将更多的精力放在基于网络通信的业务逻辑实现上, 而业务框架正是解决业务逻辑如何方便实现这一问题上。 业务框架的职责是简化程序员的业务逻辑实现,使程序员能够快速的开始编写游戏业务。
业务框架对于每个 action 都是通过 ASM 与 Singleton、Flyweight 、Command 等设计模式结合, 对 action 的获取上通过 array 来得到,是一种近原生的方式。
业务框架平均每秒可以执行 1152 万次业务逻辑。
什么是 action
我们之前已经介绍过 Action 了,这里就简单的提一下。 action 由开发者定义,在 action 类中定义的方法就表示一个 action,代码如下
@ActionController(1)
public class DemoAction {
@ActionMethod(1)
public String here(String name) {
return name + ", I'm here";
}
action 处理流程
see DefaultActionCommandFlowExecute
框架为流程图中的接口提供了默认的实现,如有特殊业务的,开发者可自定义实现来替换流程中的任意处理环节。
- 1 ActionMethodInOut : 是业务框架插件。
- 2 ActionControllerFactoryBean : 负责创建用户定义的 Action 业务方法。
- 3 ActionMethodInvoke : 调用开发者编写的 action。
- 4 ActionMethodResultWrap : 结果包装器,将 action 业务方法产生的结果或者错误码包装到 ResponseMessage 响应对象中。
- 5 ActionAfter : 将数据发送给请求端。
BarSkeletonBuilder
BarSkeletonBuilder 是业务框架构建器,用于创建业务框架。
- code 5,创建业务框架构建器
- code 8 ~ 11,设置 ActionFactoryBean、ActionMethodInvoke、ActionMethodResultWrap、ActionAfter, 也就是上图中的 action 处理流程。如有特殊业务的,可自定义实现类。
- code 13,添加业务框架插件
- code 14,创建业务框架
public BarSkeleton createBarSkeleton() {
var config = new BarSkeletonBuilderParamConfig()
.scanActionPackage(DemoAction.class);
var builder = config.createBuilder();
builder
.setActionFactoryBean(new YourActionFactoryBean())
.setActionMethodInvoke(new YourActionMethodInvoke())
.setActionMethodResultWrap(new YourActionMethodResultWrap())
.setActionAfter(new YourActionAfter());
builder.addInOut(new DebugInOut());
return builder.build();
}
BarSkeletonBuilderParamConfig
BarSkeletonBuilderParamConfig 是业务框架构建器参数,用于创建业务框架构建器。
- code 3,开启广播日志,开启后可在控制台中看见触发广播的代码行数。
- code 4,内部会扫描当前类路径和子包路径下的所有类,无论有多少个 action 类,只需要配置任意一个类就行。
public BarSkeleton createBarSkeleton() {
var config = new BarSkeletonBuilderParamConfig()
.setBroadcastLog(true)
.scanActionPackage(DemoAction.class);
var builder = config.createBuilder();
...
return builder.build();
}
获取一些关联成员
我们可以在业务框架启动后,保存一些相关成员引用,下面的示例结合了 Runner 机制。
BarSkeletonBuilder builder = ...
builder.addRunner((barSkeleton) -> {
var executorRegion = barSkeleton.getExecutorRegion();
var eventBus = barSkeleton.option(SkeletonAttr.eventBus);
var brokerClient = barSkeleton.option(SkeletonAttr.brokerClientContext);
});