联机格斗游戏服务端架构
🛠 服务器架构概览(这是一篇我修改过的ai文章)
✅ 网关服(Gateway Server) - 处理玩家的连接和路由
✅ 登录服(Auth Server) - 负责用户认证和会话管理
✅ 匹配服(Matchmaking Server) - 处理玩家匹配
✅ 战斗服(Game Server) - 运行战斗逻辑(使用 Agones 部署)
✅ 房间管理服(Room Manager) - 管理战斗房间的生命周期
✅ 日志服(Logging Server) - 记录游戏日志和分析数据
✅ 社交服(Social Server) - 处理好友、战队、排行榜等功能
🖥 详细架构设计
1️⃣ 网关服(Gateway Server)
功能:处理客户端连接,作为代理转发请求到不同的后端服务,减少前端与多个服务的直接交互。
技术选型:
WebSocket 或 TCP/UDP
Nginx / Envoy(可选负载均衡)
部署方式:
横向扩展(可多开)
放置在边缘节点,降低网络延迟
2️⃣ 登录服(Auth Server)
功能:用户登录、注册、Token 认证、账号管理。
技术选型:
JWT / OAuth
Redis(存储 Token 和 Session)
MySQL / PostgreSQL(存储用户数据)
部署方式:
可水平扩展
放置在中央区域,与数据库紧密连接
3️⃣ 匹配服(Matchmaking Server)
功能:匹配对战玩家,根据 Elo/MMR 规则匹配合适对手。
匹配方式:
1v1、2v2、组队 vs 组队
Elo / MMR / 随机匹配
排位赛匹配(不同段位匹配)
技术选型:
Redis / Kafka(队列匹配)
Golang / Python(匹配算法)
部署方式:
分布式匹配集群(多实例同时处理)
可能需要 队列机制(如 Kafka)
4️⃣ 战斗服(Game Server) 🚀(使用 Agones 进行动态伸缩)
功能:运行战斗逻辑,维护游戏帧同步、碰撞检测、状态管理。
技术选型:
Unity / Unreal + C# / C++(游戏逻辑)
Golang / Rust / C++(服务器端)
UDP / TCP(实时通信协议)
Agones(Kubernetes 伸缩部署)
部署方式:
每场战斗一个实例
动态扩展(Agones 根据负载调整服务器数量)
短生命周期(游戏结束后销毁实例)
5️⃣ 房间管理服(Room Manager)
功能:管理战斗服务器的生命周期,调度服务器创建、回收资源。
技术选型:
Redis / etcd(房间状态存储)
Golang / Node.js(房间管理逻辑)
部署方式:
与 Agones 交互,动态分配服务器
集中式部署(少量实例即可支撑)
6️⃣ 日志服(Logging Server)
功能:记录战斗数据、用户行为日志、崩溃日志等,用于分析和回放战斗。
技术选型:
ELK(Elasticsearch + Logstash + Kibana)
Kafka(日志消息队列)
BigQuery(数据分析)
部署方式:
离线分析日志(异步处理,不影响游戏性能)
7️⃣ 社交服(Social Server)
功能:好友系统、排行榜、公会、战队等社交功能。
技术选型:
MySQL(存储好友关系)
Redis(缓存排行榜)
部署方式:
水平扩展(玩家增长时可增加实例)
🚀 部署方案
Kubernetes + Agones 部署
适用于战斗服(Game Server),自动扩展:
动态创建战斗实例
自动回收无用实例
减少服务器成本
传统 VM / 云服务器
适用于:
登录服 / 网关服 / 匹配服 / 日志服
这些服务 长时间运行,适合部署在固定服务器上
Redis + Kafka
Redis:存储在线玩家状态、房间数据、匹配队列
Kafka:处理日志和异步消息
🌟 部署方式
网关服、日志服、匹配服等(长时间运行的服务)—— 直接部署在云服务器或物理机上,可以使用 Docker 进行容器化,但不需要 Agones。
战斗服(每场战斗一个实例,短生命周期)—— 使用 Agones + Kubernetes 部署,动态创建和销毁,优化资源利用。
📌 游戏日志系统最佳实践
游戏日志一般分 三种:
运营日志(Game Event Logs):玩家登录、消费、交易等事件,通常存 MySQL / ClickHouse。
服务器日志(Server Logs):服务器状态、错误日志,存 ElasticSearch / Loki / CloudWatch。
战斗日志(Match Logs):战斗数据,存 对象存储(S3)或 Kafka + ClickHouse。
最轻量实践
1️⃣ 必要的服务器
登录服务器(Login Server)
功能:处理玩家的账号验证、登录认证、生成 Token、选择服务器。
技术选型:
语言:Go / Node.js(高并发、快速处理)
数据库:PostgreSQL 或 MySQL(存储用户数据)
缓存:Redis(存储 Session,提升性能)
鉴权:JWT(Token) / Session
验证码:集成 SMS / 短信验证码服务
网关服务器(Gateway Server)
功能:处理玩家的连接请求,路由到具体的战斗服(Game Server)。
技术选型:
语言:Go / Node.js(高并发、快速处理)
协议:WebSocket 或 TCP(低延迟的双向通信)
负载均衡:Nginx 或 Kubernetes(根据流量自动扩展)
战斗服务器(Game Server)
功能:处理玩家的实时战斗逻辑,维持游戏状态。
技术选型:
语言:Go / C++ / Java(低延迟、高并发)
网络协议:UDP(实时性要求高)
同步管理:状态同步机制,确保客户端一致性
日志服务器(Logging Server)
功能:记录玩家操作、战斗数据、异常日志等,用于分析和排查问题。
技术选型:
日志库:slog(Go原生日志)、ELK(Elasticsearch + Logstash + Kibana)
数据存储:Elasticsearch / PostgreSQL(方便搜索和分析)
2️⃣ 部署方案
使用 Docker 和 Kubernetes(K8s):
容器化:将各个服务(登录服、网关服、战斗服、日志服)打包成容器,易于管理和扩展。
Kubernetes:实现自动化的服务调度、负载均衡和高可用性。
数据库与缓存:
PostgreSQL / MySQL(用于存储玩家数据、游戏状态等)
Redis(存储 Session、验证码、游戏内排行榜)
日志与监控:
ELK Stack(Elasticsearch + Logstash + Kibana)用于日志收集和分析。
Prometheus + Grafana(监控服务器性能和资源使用)
负载均衡和高可用:
Nginx / HAProxy:进行 负载均衡,确保流量均匀分配到各个服务器。
自动扩展:根据玩家数量动态调整战斗服的实例数,确保流量不暴露性能瓶颈。
💡 不同服之间配合
客户端与网关服与游戏服同时通信
对于格斗游戏这种 低延迟、高实时性 的应用,通常推荐让 客户端同时与网关服和游戏服通信。下面是推荐的做法:
网关服:
负责 玩家身份验证、会话管理、连接管理 等。
客户端与网关服保持 WebSocket 长连接,进行身份验证、匹配、聊天等操作。
网关服负责将玩家请求转发到适当的 游戏服,并管理玩家会话数据。
游戏服:
负责处理 战斗数据、角色移动、攻击判定、技能计算 等。
客户端与 游戏服 保持 UDP 或 WebSocket 连接,实时发送操作数据(例如角色攻击、位置更新)和接收战斗状态反馈。
游戏服仅处理游戏逻辑,不涉及会话管理等操作。
通信流程:
玩家登录:客户端首先与网关服通信进行 Steam 登录 和 身份验证。
玩家匹配:网关服根据玩家的匹配请求,将其路由到一个特定的游戏服。
游戏过程:客户端直接与游戏服进行 UDP 或 WebSocket 的低延迟通信,传输战斗数据,进行实时交互。
登录服与网关服的配合:
登录服:
处理玩家的 身份验证,比如通过 Steam 登录、手机号验证、第三方认证等。
验证成功后,登录服返回一个 Token 或者 Session ID,由客户端在后续的请求中携带。
网关服:
网关服接收到客户端的登录请求后,首先 验证Token 或 Session ID 是否有效。
登录成功后,网关服会将请求路由到合适的 游戏服,并保持与客户端的长连接,确保玩家的所有后续操作都能流畅地进行。