跳到主要内容

GM 后台

提示

当前文档不是必须阅读的内容,介绍了其他系统如何与 ionet 交互,建议时间充裕时阅读。

介绍

阅读当前使用文档后,开发者可以开发自己的 GM 后台,能模拟用户的请求来访问其他逻辑服。

本文最终目的,是为了让我们的 GM 后台即具备 http 的通信能力,又具备内部通信的能力。 对外可以提供 http 给三方使用,对内又能与其他逻辑服和用户交互。

我们只需要在 GM 后台项目中启动一个逻辑服就能与 ionet 交互了。

  • 外部通信,我们使用 http 对外提供 api,用于接收第三方平台的回调。
  • 内部通信,与逻辑服中的用户交互。

本篇文档将使用 web 项目来访问 action,后续称该 web 项目为 GM 后台。 GM 后台提供两个接口,分别是

  • 指定用户的充值回调。
  • 给全服发送广播消息。

整体流程为 : 访问 URL --> GM 后台处理该 http 请求 --> 在 web mvc controller 中模拟一个用户请求, 并将数据传递到逻辑服的 action 处理 --> 之后在 action 中通知用户。

Example Source Code

see https://github.com/iohao/ionet-examples

path : ionet-cookbook-code

  • GameManagerApplication
  • GameManagerAction

该 Action 是我们接下来演示用的。

  • code 6: 广播给当前充值用户。
  • code 12: 广播给全服用户。
@ActionController(GameManagerCmd.cmd)
public final class GameManagerAction {
@ActionMethod(GameManagerCmd.recharge)
private long internalRecharge(long money, FlowContext flowContext) {
long userId = flowContext.getUserId();
flowContext.broadcastMe(broadcastUserLong, money);
return money;
}

@ActionMethod(GameManagerCmd.notice)
private void internalNotice(String message, FlowContext flowContext) {
flowContext.broadcastMulticast(broadcastMulticastString, message);
}
}

GM

GM 后台是 web 项目,Controller 中演示了如何调用 action。


recharge 方法会通过 action 给用户充值

  • code 12: 充值金额。
  • code 13: 创建 RequestMessage 对象。
  • code 14: 绑定 userId,模拟用户的请求。
  • code 15: 通过 call 请求逻辑服。

在浏览器输入 http://localhost:8080/gm/recharge 可触发 recharge 方法。

@RestController
@RequestMapping("gm")
public final class GameManagerController {
static final AtomicLong messageId = new AtomicLong();
static final long userId = 1378604058;

@GetMapping("/recharge")
public String recharge() {
var rechargeCmd = GameManagerCmd.of(GameManagerCmd.recharge);
var communication = CommunicationKit.getCommunication();

long money = RandomKit.random(1, 1000);
var requestMessage = communication.ofRequestMessage(rechargeCmd, money);
requestMessage.bindingUserId(userId);
var response = communication.call(requestMessage);

return "userId:%s, recharge %d".formatted(userId, response.getLong());
}
}

notice 方法会通过 action 给全服的用户广播

  • code 10: 需要广播的消息。
  • code 11: 创建 SendMessage 对象。
  • code 12: 通过 send 请求逻辑服。

在浏览器输入 http://localhost:8080/gm/notice 可触发 notice 方法。

@RestController
@RequestMapping("gm")
public final class GameManagerController {
...
@GetMapping("/notice")
public String notice() {
var noticeCmd = GameManagerCmd.of(GameManagerCmd.notice);
var communication = CommunicationKit.getCommunication();

String message = "GM web message " + messageId.incrementAndGet();
var sendMessage = communication.ofSendMessage(noticeCmd, message);
communication.send(sendMessage);

return "notice: " + message;
}
}

小结

现在,我们的 GM 后台具备了 http 和内部通信的能力,对外可以提供 http 给三方使用,对内又能与其他逻辑服和用户交互。 http 的能力是由 SpringMVC 提供的,而内部通信的能力则是【GM 逻辑服】提供的。

GM 后台几乎是游戏服务器必备的一个模块,该模块存在的意义有以下几个方面

  • 接收其他平台的 http 回调,如充值 ... 等。
  • 与内部其他逻辑服通信、与用户通信。
  • GM 系统的其他辅助功能。