Google Compute Engine 300美元额度支持WebSocket吗?及订阅配置
关于Google Compute Engine赠金支持WebSocket及订阅配置的解答
1. Google 300美元赠金是否支持WebSocket?需要升级吗?
完全不需要升级账户,你的300美元免费赠金覆盖的GCE实例是完全支持WebSocket的。WebSocket本质是基于TCP的应用层协议,GCE本身没有对WebSocket做任何限制,只要你的实例在赠金可用的资源类型范围内(比如标准N1系列等),就可以正常使用WebSocket功能。出现订阅不工作的问题大概率是防火墙规则、服务绑定地址或者订阅服务器配置的问题,和赠金本身无关。
2. 配置VM实现subscriptions-transport-ws订阅功能的步骤
下面是一步步的配置指南,帮你搞定订阅功能:
第一步:配置GCE防火墙规则,开放WebSocket端口
首先要确保外部流量能到达你的WebSocket服务端口(比如常用的4000、8080,或者你自定义的端口):- 登录GCE控制台,进入「VPC网络」→「防火墙规则」
- 点击「创建防火墙规则」
- 填写规则名称(比如
allow-websocket),方向选择「入站」 - 目标选择「指定的目标标签」,然后给你的VM实例添加对应的标签(比如
websocket-server) - 来源IP范围填
0.0.0.0/0(测试环境用,生产环境建议限制特定IP) - 协议和端口选择「指定的协议和端口」,勾选
tcp并填入你的WebSocket端口(比如tcp:4000) - 保存规则
第二步:确保服务绑定正确的地址
你的Apollo服务必须监听0.0.0.0而不是localhost,否则外部无法访问。比如在启动服务时,要指定host为0.0.0.0:httpServer.listen({ port: 4000, host: '0.0.0.0' }, () => { console.log(`Server running on http://0.0.0.0:4000/graphql`); });第三步:正确集成subscriptions-transport-ws到Apollo Server
要把HTTP服务器和WebSocket订阅服务器绑定在一起,这里给你一个完整的示例代码:const { ApolloServer } = require('apollo-server-express'); const express = require('express'); const { createServer } = require('http'); const { SubscriptionServer } = require('subscriptions-transport-ws'); const { execute, subscribe } = require('graphql'); const { typeDefs, resolvers } = require('./your-schema'); const app = express(); const httpServer = createServer(app); // 初始化Apollo Server const apolloServer = new ApolloServer({ typeDefs, resolvers, context: ({ req, connection }) => { // 处理HTTP和WebSocket的上下文,根据需要添加逻辑 if (connection) { return connection.context; } return { req }; }, }); // 启动Apollo并挂载到Express async function startServer() { await apolloServer.start(); apolloServer.applyMiddleware({ app }); // 启动订阅服务器 new SubscriptionServer( { execute, subscribe, schema: apolloServer.schema, // 可选:处理WebSocket连接的上下文 onConnect: (connectionParams) => { console.log('Client connected'); return { /* 这里可以传递上下文数据 */ }; }, }, { server: httpServer, path: apolloServer.graphqlPath, // 订阅路径和GraphQL API路径一致,或者自定义比如'/subscriptions' } ); // 启动HTTP服务器 httpServer.listen({ port: 4000, host: '0.0.0.0' }, () => { console.log(`🚀 Server ready at http://0.0.0.0:4000${apolloServer.graphqlPath}`); console.log(`📡 Subscriptions ready at ws://0.0.0.0:4000${apolloServer.graphqlPath}`); }); } startServer();第四步:检查VM内部防火墙
如果你的GCE实例启用了内部防火墙(比如Ubuntu的ufw),要确保开放了对应的端口:sudo ufw allow 4000/tcp sudo ufw reload第五步:测试WebSocket连接
用wscat工具来测试连接是否正常:- 安装wscat:
npm install -g wscat - 运行测试命令:
wscat -c ws://<你的VM外部IP>:4000/graphql
如果连接成功,你会看到connected的提示,此时可以发送订阅的GraphQL消息来验证功能。
- 安装wscat:
内容的提问来源于stack exchange,提问作者Ibrahim Abdulrahman
相关产品推荐
相关产品推荐

