Skip to content

多服务器配置

该架构通过统一的 API 网关实现了对多个 Minecraft 服务器实例的集中管理,支持基于代理的服务器组(Velocity/BungeeCord)和独立服务器部署。该系统提供了灵活的服务器发现机制、统一的状态监控以及跨异构服务器环境的 Mod 分发。

配置架构

多服务器配置遵循分层合并策略,其中默认配置提供结构模板,而本地配置覆盖操作参数。位于 bootstrap.php 中的配置加载器将 config.default.php 与可选的 config.php 文件合并,允许开发人员维护基础设施默认值与环境特定设置之间的分离 来源:bootstrap.php

服务器定义结构

每个服务器实例在 minecraft_servers 配置键中定义为一个关联数组,包含五个核心属性,支持编程访问和用户识别 来源:config.default.php

服务器配置参数:

参数类型必填描述
namestring用于 UI 显示的人类可读名称
public_hoststringstring公共连接字符串(可能包含代理命令)
hoststring服务器主机名或 IP 地址
portinteger服务器端口(后端服务器通常不是 25565)
qportintegernull

public_hoststring 字段支持代理服务器命令(例如 mcserver.barian.moe /server youer1),这使其非常适合 Velocity/BungeeCord 环境,因为这类环境的公共入口点与后端服务器地址不同。

服务器实例化模式

Server 类通过多种构造函数模式提供灵活的实例化,使开发人员能够通过配置 ID、显式主机/端口参数选择服务器,或默认回退到主服务器 来源:src/McModUtils/Server.php

构造函数参数优先级:

  1. 通过 ID$server = new Server($id='youer1') - 从 minecraft_servers 数组加载完整配置
  2. 通过主机/端口覆盖$server = new Server($id='youer1', $port=24566) - 从 ID 加载但允许运行时端口覆盖
  3. 显式参数$server = new Server($host='127.0.0.1', $port=25565) - 直接指定,无需配置查找
  4. 默认回退$server = new Server() - 从 minecraft_hostminecraft_portminecraft_public_hoststring 键加载

构造函数灵活的参数处理机制支持动态服务器发现模式。使用代理系统时,传递后端服务器 ID 以加载代理感知配置;对于独立监控,使用显式的主机/端口参数。

多服务器 API 集成

所有服务器状态端点均通过 URL 路径参数支持可选的服务器标识符,从而无需定义单独的端点即可实现对多个服务器实例的统一 API 访问 来源:public/server.php

端点模式

端点URL 模式服务器选择默认行为
服务器状态/ping[/{serverId}]new Server($serverId)使用配置中的默认服务器
玩家列表/online-players[/{serverId}]new Server($serverId)使用默认服务器
服务器横幅/banner[/{serverId}]new Server($serverId)使用默认服务器
Query 协议/query/使用 minecraft_qport 配置不特定于服务器

API 请求示例:

BASH

bash curl https://api.example.com/ping # 特定服务器状态 curl https://api.example.com/ping/youer1 # 带有玩家列表的特定服务器横幅 curl https://api.example.com/banner/youer2?players=1 # 简单名称列表形式的在线玩家 curl https://api.example.com/online-players/youer1?otype=name

Mod 分发配置

多服务器环境通常需要在仅客户端、仅服务器和通用 Mod 之间进行隔离。配置系统通过三种 Mod 类型定义支持这一点,每种类型都有独立的路径解析和过滤规则 来源:config.default.php

Mod 类型配置矩阵

Mod 类型路径前缀ignore_serverside_prefixonly_serverside_prefix用例
common/modstruefalse客户端和服务器之间共享的 Mod
client/clientmodstruefalse客户端视觉/调整 Mod
server/modsfalsetrue服务器端性能/插件 Mod

服务端前缀过滤:

系统根据 serverside_prefixs 配置(['serveronly_', 'server_'])应用文件名前缀过滤。这无需单独的目录结构即可实现自动 Mod 分类:

  • 通用 Mod :包含没有服务端前缀的文件
  • 服务器 Mod :仅包含具有匹配前缀的文件
  • 客户端 Mod :排除具有服务端前缀的文件

API 端点结构:

路由系统通过配置映射为每种 Mod 类型动态生成端点,为所有 Mod 类别提供一致的 API 模式 来源:public/mods.php

PHP

$routerConfigMap = [ 'mods' => 'common', // → /mods, /mods/zip 等。 'client-mods' => 'client', // → /client-mods, /client-mods/zip 等。 'server-mods' => 'server', // → /server-mods, /server-mods/zip 等。 ];

Query 协议集成

除了标准的 ping 协议之外,为了进行高级服务器监控,系统通过 qport 参数支持 Minecraft 的 Query 协议。这提供了标准服务器列表 ping 无法获取的额外服务器信息 来源:public/server.php

Query 协议特性:

  • 协议 :基于 UDP 的 Query 协议(旧版 Minecraft 服务器协议)
  • 配置 :默认服务器使用 minecraft_qport,特定服务器使用 qport
  • 端点/query/ 返回 info(服务器详细信息)和 players(玩家列表)
  • 回退 :如果 qport 为 null,端点可能无法连接

Query 与 Ping 协议对比:

特性Ping 协议Query 协议
传输TCPUDP
信息MOTD、玩家数量、版本、示例玩家扩展服务器信息、完整玩家列表、插件
防火墙要求TCP 端口(默认 25565)UDP query 端口(通常与游戏端口相同)
响应格式JSON 结构分离的 infoplayers 对象

错误处理和服务器验证

系统在尝试连接之前实施可靠的服务器存在性验证,防止对未定义服务器的连接尝试 来源:src/McModUtils/Server.php

验证流程:

  1. 服务器 ID 检查isExistServerId($id) 验证配置中是否存在该 ID
  2. 配置加载loadFromServerId($id) 从配置填充服务器属性
  3. 连接尝试 :Ping/query 操作尝试与超时的服务器连接
  4. 异常传播MinecraftPingException 传播到错误处理程序

错误响应示例:

JSON

{ "error": "Failed to connect or create a socket: 111 (Connection refused)" }

响应格式系统自动处理 JSON 内容协商,确保 API 消费者无论底层异常如何都能收到结构化的错误响应 来源:src/App/ResponseFormatter.php

高级配置模式

代理服务器集成

对于 Velocity 或 BungeeCord 部署,将代理配置为默认服务器,同时维护后端服务器配置以进行详细监控:

PHP

'minecraft_public_hoststring' => 'play.example.com', 'minecraft_host' => '127.0.0.1', 'minecraft_port' => 25577, // 代理端口 'minecraft_servers' => [ 'survival' => [ 'name' => 'Survival World', 'public_hoststring' => 'play.example.com /server survival', 'host' => '127.0.0.1', 'port' => 25565, // 后端服务器端口 'qport' => 25565, ], ]

动态服务器发现

灵活的构造函数模式支持基于外部配置源进行运行时服务器发现:

PHP

// 从数据库或外部服务加载服务器 ID $serverId = fetchActiveServerFromDatabase(); $server = new Server($serverId); $status = $server->outputPing();

相关文档

要全面了解系统架构,请探索以下相关主题: