🛠 服务器架构概览(这是一篇我修改过的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 是否有效。

登录成功后,网关服会将请求路由到合适的 游戏服,并保持与客户端的长连接,确保玩家的所有后续操作都能流畅地进行。