# Apollo网络服架构

# 比较

# Java服

传统的Java服一般指使用Spigot等类似服务端的服务器,玩家使用任意客户端都可以加入游戏。这种服务器纯靠服务器进行驱动,如果不通过一些特殊手段,无法强制客户端安装一些mod来增强游戏体验。

# Apollo

Apollo服务器不仅可以类似Java服那样使用服务器进行驱动,还会同步发送相关与服务器匹配的Mod到客户端,并且使用这些Mod和服务器进行双向通信,来实现在触发某个事件后,打开界面,播放动画等效果。

需要注意的是,在Java服中经常使用ProtocolLib或者net.minecraft.server(简称NMS)来绕过Spigot API来实现各种功能,例如计分板,title等等。而在Apollo的开发中,并没有这些类似的协议API可供使用,但是可以使用ModSDK来实现更强大的客户端表现功能。例如计分板功能可以使用ModSDK制作一个Hud来实现。这里需要Java服插件开发者们提前了解并转变思想。

# 架构

如上图所示,Apollo网络服,拥有5种不同类型的服务器,客户端(Client)和数据库(DB)

# 服务器

# Proxy

Proxy即代理服务器,所有玩家的连接都会通过代理服务器,然后再分发到各个游戏服或大厅服中。功能和Java服的BungeeCord较为相似。只不过Proxy服务器无法像BungeeCord一样安装插件。

# Game

Game即游戏服,为玩家提供某个特定的玩法,是玩家的主要载体。一个在线玩家只能存在于一个Game或Lobby中。

# Lobby

Lobby即大厅服,主要作为各个玩法间的中转站。玩家可以在大厅服中选择自己想要玩的玩法,并提供跨服跳转的功能。其中Lobby服的接口和Game服基本一致。

# Service

Service即功能服,主要用作各个Game/Lobby服的后端服务器。可以使用Service服来集中处理一些其他服务器的数据。Service服可以主动/被动向各个服务器发送数据,其他服务器也可以监听Service服的消息,并调用回调完成一系列应答。

Service和Game的配合相对来说比较重要,下面将举一个例子来介绍。

  • gameA服务器制作了起床战争玩法。gameA服务器启动完成后,就会通知Service服务器可以让玩家进入本服务器。

  • 在gameA服务器上凑够了足够开局的玩家后,gameA就会开始游戏逻辑,并通知Service,不要再匹配新的玩家进入该服务器。

  • 在游戏结束后,gameA将玩家重新送回大厅,然后重置地图。

  • 待重置地图完成后,gameA再次通知Service,本服务器已经可以让玩家加入了。

更多通信相关的内容将会在下一节进行说明。

# Master

Master即控制服,可以使用Master服来调用管理员指令,完成一系列的运维操作。

# 客户端

客户端是玩家的终端,每个玩家都可以看作一个Client。

# 数据库

数据库即之前所提到的数据的载体,具体详见数据库的概念