You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java/Spring+React双人游戏在Google App Engine的部署方案咨询

问题根因

这个问题和前后端部署方式没有直接关系,核心是后端的游戏状态存储作用域配置错误:你大概率把Connect 4的棋盘数据、回合状态、胜负标记存在了Spring单例Bean的全局变量、或是类静态成员变量中,所有进入后端的请求都会读写同一份内存数据,自然不管多少用户、从什么设备访问,都会进入同一局游戏。
不要尝试通过固定App Engine实例数为1、关闭弹性伸缩的方式绕开问题,这是治标不治本的方案,既浪费云资源,实例重启后还是会丢数据,也不符合正常Web开发的逻辑。

可落地实现方案

1. 先修正后端状态管理逻辑(必做,和部署无关)

  • 给每局独立游戏生成唯一gameId,用普通UUID即可,不需要复杂生成规则。用户第一次打开前端时,可以由前端生成UUID传给后端创建对局,也可以由后端创建对局后返回gameId给前端,存在浏览器localStorage里即可。
  • 立刻移除全局变量存储游戏状态的逻辑,改用ConcurrentHashMap<String, GameState>在内存中存储所有对局,key为gameId,value为对应对局的棋盘、玩家回合、胜负状态等结构化数据。
  • 前端后续所有落子、查询对局状态的请求,都必须带上当前对局的gameId参数,后端只操作对应key下的游戏状态,不会跨对局读写数据。
  • 如果只是做作品集演示,内存存储完全够用,不用一开始就上数据库徒增复杂度;如果要提升稳定性,后续可以对接免费额度的Firestore或轻量Redis存储对局状态,解决实例重启、请求路由到不同实例时的对局丢失问题。

2. 前后端部署方案(按学习阶段优先级排序)

  • 方案一(最省事,优先推荐用于作品集):同域部署
    把React项目执行npm run build后生成的静态资源(build目录下的html、js、css文件)直接放到Spring Boot项目的src/main/resources/static目录下,整个项目打为单个Jar包部署到GC App Engine即可。用户访问服务根路径直接加载前端页面,接口请求走同域,不需要额外配置跨域规则,部署步骤少,不容易出配置错误。
  • 方案二(适合练习前后端分离架构):分开部署
    React打包后的静态资源部署到GC Cloud Storage静态网站托管或Firebase Hosting,后端服务保留在GC App Engine。需要注意两个配置点:
    • 后端配置CORS规则,允许前端部署域名的跨域请求
    • 所有接口请求必须显式携带gameId参数,不要依赖服务端Session自动绑定对局——App Engine默认Session存在单实例内存中,多实例弹性伸缩时请求漂移会导致Session丢失,用户玩到一半对局会异常重置。
  • 方案三(后续扩展双人实时匹配可选):
    如果要做两个在线用户自动匹配进同一局的功能,不用HTTP轮询接口,给Spring Boot引入WebSocket依赖,客户端建立WS连接时携带gameId,后端直接路由到对应对局的消息通道即可,实时性更好也更省服务器资源。
本地测试方法

逻辑改完后不用每次都部署到云上验证,本地启动服务后开两个浏览器无痕窗口,传入不同的gameId测试落子操作,确认两个窗口的对局状态完全独立、互不影响,再部署到云上即可。

内容的提问来源于stack exchange,提问作者20 GOTO 10

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 11:31:11