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

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,或者你自定义的端口):

    1. 登录GCE控制台,进入「VPC网络」→「防火墙规则」
    2. 点击「创建防火墙规则」
    3. 填写规则名称(比如allow-websocket),方向选择「入站」
    4. 目标选择「指定的目标标签」,然后给你的VM实例添加对应的标签(比如websocket-server)
    5. 来源IP范围填0.0.0.0/0(测试环境用,生产环境建议限制特定IP)
    6. 协议和端口选择「指定的协议和端口」,勾选tcp并填入你的WebSocket端口(比如tcp:4000)
    7. 保存规则
  • 第二步:确保服务绑定正确的地址
    你的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工具来测试连接是否正常:

    1. 安装wscat:npm install -g wscat
    2. 运行测试命令:wscat -c ws://<你的VM外部IP>:4000/graphql
      如果连接成功,你会看到connected的提示,此时可以发送订阅的GraphQL消息来验证功能。

内容的提问来源于stack exchange,提问作者Ibrahim Abdulrahman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:32:32