连接到 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:<PORT> --description "Allow websocket traffic"
我当然可以这样使用它,但是一旦我停止并重新启动实例,这个 IP 就会不断变化。希望你能给我一些建议!
【问题讨论】:
【参考方案1】:您知道您的主机名是否在您的应用程序中解析吗?很多时候,像这样的服务可以使用拆分 DNS,因此您的代码可能无法解析您期望的相同公共 IP。
我建议您进行一次快速测试,看看您的 <DOMAIN>
解决了什么问题,以确保它符合您的预期。
【讨论】:
如果我使用nslookup
,它确实会解析到与我可以连接的IP不同的IP。你能帮我理解它是如何工作的吗?因为如果我使用域向后端发出 HTTP 请求,它的工作方式与使用公共 IP 相同。以上是关于连接到 GCP App Engine 上的 SocketIO 服务器时如何使用域而不是公共 IP?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用App Engine上的Python标准环境连接到Cloud SQL上的Postgres
使用 PHP 连接到 App Engine 中的本地 MySQL
App Engine Java Servlet 未连接到 Cloud SQL