Google Cloud Run如何使用WebSockets协议?非Socket.io方案咨询
在Google Cloud Run上实现原生WebSockets通信(Node.js)
Google Cloud Run本身支持原生WebSockets,你遇到的问题大概率是配置或代码实现上的疏漏,以下是具体的实现步骤和注意事项:
1. 开启Cloud Run服务的会话亲和性
WebSocket需要持续绑定到同一个实例,否则负载均衡会把后续请求分发到其他实例导致连接中断:
- 控制台操作:进入Cloud Run服务的设置页面,找到「会话亲和性」选项,设置为「开启」。
- 命令行操作:
gcloud run services update [你的服务名称] --session-affinity
2. Node.js后端的原生WebSocket实现
推荐使用ws库快速实现,步骤如下:
首先安装依赖:
npm install ws
编写服务端代码(示例文件名server.js):
const http = require('http'); const WebSocket = require('ws'); // 创建HTTP服务器(Cloud Run要求WebSocket必须基于HTTP服务封装) const server = http.createServer((req, res) => { res.writeHead(200); res.end('Native WebSocket server running on Cloud Run'); }); // 挂载WebSocket服务 const wss = new WebSocket.Server({ server }); // 处理客户端连接 wss.on('connection', (ws) => { console.log('New client connected'); // 接收客户端消息并回复 ws.on('message', (data) => { console.log(`Received message: ${data}`); ws.send(`Server echo: ${data}`); }); // 处理断开连接事件 ws.on('close', () => { console.log('Client disconnected'); }); }); // 监听Cloud Run指定的端口(必须使用PORT环境变量,不能硬编码) const PORT = process.env.PORT || 8080; server.listen(PORT, () => { console.log(`Server listening on port ${PORT}`); });
3. 配置Dockerfile
确保Dockerfile能正确打包服务,示例:
FROM node:18-alpine WORKDIR /app # 复制依赖文件并安装生产环境依赖 COPY package*.json ./ RUN npm install --production # 复制应用代码 COPY . . # 启动服务 CMD ["node", "server.js"]
4. 部署与测试
- 部署到Cloud Run:使用常规部署命令即可,比如
gcloud run deploy [服务名称] --source . - 前端测试:在浏览器控制台执行以下代码验证连接:
const ws = new WebSocket('wss://[你的Cloud Run服务域名]'); ws.onopen = () => { console.log('Connected to server'); ws.send('Hello from client!'); }; ws.onmessage = (event) => { console.log('Received from server:', event.data); }; ws.onclose = () => { console.log('Disconnected from server'); };
常见问题排查
- 连接失败优先检查会话亲和性是否开启,这是最常见的触发原因。
- 必须使用
PORT环境变量指定的端口,不能硬编码固定端口。 - Cloud Run实例会自动扩缩容,当实例被销毁时WebSocket连接会断开,建议前端实现重连逻辑。
内容的提问来源于stack exchange,提问作者Kritsada Suriyakul
相关产品推荐
相关产品推荐

