连接到 GCP App Engine 上的 SocketIO 服务器时如何使用域而不是公共 IP?

Posted

技术标签:

【中文标题】连接到 GCP App Engine 上的 SocketIO 服务器时如何使用域而不是公共 IP?【英文标题】:How to use a domain instead of public IP when connecting to SocketIO server on GCP App Engine? 【发布时间】:2021-03-17 20:43:25 【问题描述】:

我已将 Java Spring 后端部署到 GAE 柔性环境。我使用netty-socketio 来托管socketIO 服务器。我可以使用为此处列出的实例提供的公共 IP 地址与 socket.io-client 连接:

这就是我连接它的方式:

const io = require("socket.io-client");

const socket = io("ws://<IP adress>:<PORT>", 
    reconnectionDelayMax: 10000,
    query: 
      "deviceId": serial
    
);
  
socket.on("connect", () => 
    console.log("Connected. Session ID: " + socket.id);
);

请注意,netty-socketio 仅支持 1.0+ 版本,所以我使用的是 socket.io-client 1.7.4,它不是最新版本。

我也在使用自定义域。我的问题是我只能使用 IP 地址连接到服务器,但是当我使用域名时,我遇到了超时错误:

socket.io-client:url parse ws://<DOMAIN>:<PORT> +0ms
  socket.io-client new io instance for ws://<DOMAIN>:<PORT> +4ms
  socket.io-client:manager readyState closed +3ms
  socket.io-client:manager opening ws://<DOMAIN>:<PORT> +0ms
  socket.io-client:manager connect attempt will timeout after 20000 +48ms
  socket.io-client:manager readyState opening +6ms
  socket.io-client:manager connect attempt timed out after 20000 +20s
  socket.io-client:manager connect_error +2ms
  socket.io-client:manager cleanup +1ms
Connect error: timeout
  socket.io-client:manager will wait 868ms before reconnect attempt +2ms
  socket.io-client:manager attempting reconnect +870ms
  socket.io-client:manager readyState closed +0ms
  socket.io-client:manager opening ws://<DOMAIN>:<PORT> +1ms
  socket.io-client:manager connect attempt will timeout after 20000 +4ms

这就是我想要的连接方式:

const io = require("socket.io-client");

const socket = io("ws://<DOMAIN>:<PORT>", 
    reconnectionDelayMax: 10000,
    query: 
      "deviceId": serial
    
);
  
socket.on("connect", () => 
    console.log("Connected. Session ID: " + socket.id);
);

到目前为止我所做的事情:

我在app.yaml 中有一个网络会话,配置如下:
network:
  session_affinity: true
  forwarded_ports:
    - <PORT>/tcp
我制定了防火墙规则以允许在我尝试连接的端口上进行连接: gcloud compute firewall-rules create default-allow-websockets --allow tcp:&lt;PORT&gt; --description "Allow websocket traffic"

我当然可以这样使用它,但是一旦我停止并重新启动实例,这个 IP 就会不断变化。希望你能给我一些建议!

【问题讨论】:

【参考方案1】:

您知道您的主机名是否在您的应用程序中解析吗?很多时候,像这样的服务可以使用拆分 DNS,因此您的代码可能无法解析您期望的相同公共 IP。

我建议您进行一次快速测试,看看您的 &lt;DOMAIN&gt; 解决了什么问题,以确保它符合您的预期。

【讨论】:

如果我使用nslookup,它确实会解析到与我可以连接的IP不同的IP。你能帮我理解它是如何工作的吗?因为如果我使用域向后端发出 HTTP 请求,它的工作方式与使用公共 IP 相同。

以上是关于连接到 GCP App Engine 上的 SocketIO 服务器时如何使用域而不是公共 IP?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用App Engine上的Python标准环境连接到Cloud SQL上的Postgres

连接到 Google App Engine 数据存储

使用 PHP 连接到 App Engine 中的本地 MySQL

App Engine Java Servlet 未连接到 Cloud SQL

使用GCP API密钥限制对特定GCP App Engine服务的访问?

如何将从谷歌域购买的网络域名连接到在谷歌 App Engine 上开发的网站?