Skip to main content

业务框架

介绍

如果说 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

框架为流程图中的接口提供了默认的实现,如有特殊业务的,开发者可自定义实现来替换流程中的任意处理环节。

An

  • 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);
});