← 返回文章列表

云部署实践:pygame-eat-bean 游戏服务架构梳理

pygame-eat-bean 游戏服务架构图

pygame-eat-bean 游戏服务架构(点击放大查看)

一、背景:用云部署一键搭建游戏服务

腾讯云智能顾问(TSA)提供了云部署最佳实践能力,可以基于经过验证的架构模板一键购买和部署云上资源。本文介绍的 pygame-eat-bean 吃豆游戏服务,正是通过智能顾问云部署能力快速搭建的一套完整游戏后端架构。

参考最佳实践腾讯云智能顾问 — 云部署最佳实践:游戏服务架构
通过智能顾问云部署,可以一键完成 CLB + CVM + CDB + Redis 的资源购买和网络配置,大幅降低手动搭建的复杂度和出错概率。

在云部署完成基础设施搭建后,我们登录到云服务器上,对已部署的游戏服务进行了完整的架构梳理和分析。以下是梳理报告。

二、整体架构概览

客户端 (Client)
CLB 负载均衡
EIP → 内网 VIP
HTTP :80 / :20000 / :30001
↓ 按端口分发
登录服 A
user_server :30001
(跳板机)
登录服 B
user_server :30001
游戏服 1
game_server :20000
游戏服 2
game_server :20000
登录服 → 用户注册/登录查询 游戏服 → 游戏数据/节点注册
CDB MySQL
:3306
DB: rumpetroll
Redis
:6379
会话/节点注册/心跳

后端节点分工

节点 角色 运行服务 端口
login2-跳板机登录服 Auser_server30001
login1登录服 Buser_server30001
game1游戏服 1game_server / golds20000
game2游戏服 2game_server / golds20000

三、云部署自动化搭建

整套架构通过腾讯云智能顾问云部署自动搭建,包括:

  • CLB 负载均衡:自动创建并配置后端绑定,实现登录服的流量分发
  • CVM 云服务器 x4:2 台登录服 + 2 台游戏服,自动配置安全组和网络
  • CDB MySQL:游戏数据持久化存储(数据库名:rumpetroll)
  • Redis 缓存:会话缓存和热数据存储
  • VPC 网络:所有资源在同一 VPC 内,内网互通
云部署完成后,游戏服务的安装包会自动从腾讯云镜像源下载并部署到 CVM,服务自动注册为 systemd 管理,开机自启。整个过程无需手动 SSH 到服务器进行配置。

四、代码部署结构

游戏服务通过 RPM 包自动安装到 /data/pygame_eat_bean/ 目录:

/data/pygame_eat_bean/
  ├── user_server    # 用户/登录服务 (18MB, ELF 64-bit 静态链接)
  ├── game_server    # 游戏逻辑服务 (30MB, ELF 64-bit 静态链接)
  └── golds          # 金币/货币服务 (9.2MB, ELF 64-bit 静态链接)

二进制文件特征

文件 大小 格式 用途
user_server18MBELF 64-bit 静态链接 (musl libc)用户认证/登录
game_server30MBELF 64-bit 静态链接 (musl libc)游戏核心逻辑
golds9.2MBELF 64-bit 静态链接 (musl libc)虚拟货币/金币

所有二进制文件均通过 PyInstaller + staticx 打包为完全静态链接的可执行文件,使用 musl libc 1.2.2,无需任何外部动态库依赖。

五、技术栈

层次 技术 说明
开发语言Python 3.11主要业务逻辑
打包方式PyInstaller + staticx编译为静态链接 ELF 可执行文件
C 运行时musl libc 1.2.2轻量级 libc,无外部依赖
并发模型greenlet轻量级协程
数据库 ORMSQLAlchemy关系型数据库访问
主数据库MySQL (CDB)持久化存储
缓存Redis会话缓存、热数据
Web 框架libonion (嵌入式)内嵌 HTTP 服务

六、服务管理

游戏服务通过 systemd 管理生命周期,支持自动重启和日志收集:

[Service]
Type=simple
WorkingDirectory=/data/pygame_eat_bean
ExecStart=/data/pygame_eat_bean/user_server
Restart=always
RestartSec=5
EnvironmentFile=/etc/db_environment
LimitNOFILE=65536

运行状态

指标
CPU 使用率0.1%
常驻内存 (RSS)86.5 MB
虚拟内存 (VSZ)273.9 MB
运行状态Active (running)

附:部署后故障排查与修复

云部署完成后,登录服务器进行验证时,发现了两个问题并完成了修复。

问题一:注册/登录返回"系统繁忙"

$ curl -X POST http://127.0.0.1:30001/register -H "Content-Type: application/json" -d '{"username":"test","password":"test123","gender":"男"}'
{"result": "系统繁忙,请稍后再试", "status": false}

根因:game_server 启动时未指定 --address 参数,向 Redis 注册了 0.0.0.0:20000 而非真实内网 IP。user_server 登录成功后从 Redis 获取游戏服地址,拿到 0.0.0.0:20000 无法连接。

修复:两台游戏服的 systemd service 添加 --address=<内网IP> 参数并重启,清理 Redis 中残留的旧注册记录。

修复后 Redis 注册状态:
rumpetroll::namespace → game1-ip:20000 (游戏服1)
rumpetroll::namespace → game2-ip:20000 (游戏服2)

问题二:外网 80 端口无法访问

根因:CLB 只配置了 30001(登录API)和 20000(游戏服)的监听规则,缺少 HTTP 80 端口监听器。游戏的 Web 前端由 game_server(端口 20000)提供。

修复:通过腾讯云 SDK 创建 HTTP 80 监听器,将前端端口 80 的请求转发到两台游戏服的 20000 端口。

修复后 CLB 监听器配置

前端端口 协议 后端端口 后端实例 说明
80HTTP20000game1, game2新增 — 用户默认访问端口
20000HTTP20000game1, game2游戏服直接访问
30001HTTP30001login1, login2登录/注册 API

修复验证

$ curl -si http://118.89.20.83/rumpetroll/login/
HTTP/1.1 200 OK
Server: TornadoServer/6.1
<!DOCTYPE html>... ← 游戏登录页正常返回

七、从云部署到架构梳理的完整流程

本次游戏服务的搭建和分析,展示了一个完整的「云部署 → 上机验证 → 架构梳理」工作流:

  1. 云部署阶段:通过智能顾问云部署最佳实践,一键购买 CLB + 4 台 CVM + CDB + Redis,自动完成网络配置和游戏服务安装
  2. 上机验证:SSH 登录云服务器,对服务器进行全面探测和架构分析
  3. 架构梳理:自动生成包含架构拓扑、代码结构、配置详情、技术栈、网络拓扑的完整分析报告
  4. 故障排查:发现并修复 game_server 注册地址错误和 CLB 80 端口缺失两个问题
  5. 报告传递:通过 GitHub 仓库将报告传递到博客平台,整理发布

核心价值:智能顾问云部署让基础设施搭建变成"一键操作",登录服务器后即可对代码和架构进行全面梳理——从资源购买到架构文档的全流程都可以在极短时间内完成。