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

部署至Google Cloud Run后无法连接MQTT服务器的问题求助

Cloud Run单容器下.Net6应用MQTT服务无法连接的解决方案

核心问题

Google Cloud Run仅允许将单个端口暴露给外部入站流量,当前你的MQTT服务绑定1883端口,无法被外部访问;而8080端口的HTTP控制器可正常工作。以下是优先单容器的解决方案方向:


方案1:切换为MQTT over WebSocket(推荐)

利用现有已配置的WebSocket连接处理器,让MQTT服务复用8080端口,通过指定路径区分HTTP请求与MQTT连接。

修改Program.cs配置

移除1883端口的监听,仅保留8080端口,确保HTTP控制器和MQTT WebSocket服务共享该端口:

var builder = WebApplication.CreateBuilder(args);

// 仅监听Cloud Run允许的8080端口
builder.WebHost.UseKestrel(o =>
{
    o.ListenAnyIP(8080);
});

// 中间件配置保持不变...

var app = builder.Build();

app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();

app.UseEndpoints(endpoints =>
{
    // 保留MQTT WebSocket的路径映射
    endpoints.MapConnectionHandler<MqttConnectionHandler>("/mqtt",
        httpConnectionDispatcherOptions =>
            httpConnectionDispatcherOptions.WebSockets.SubProtocolSelector = protocolList => protocolList.FirstOrDefault() ?? string.Empty);
    
    // 映射HTTP控制器
    endpoints.MapControllers();
});

app.UseMqttServer(server => server.StartAsync());
app.Run();

客户端连接调整

将MQTT客户端的连接地址改为WebSocket协议:

  • 测试环境:ws://<你的Cloud Run服务域名>/mqtt
  • 生产环境:wss://<你的Cloud Run服务域名>/mqtt
    无需手动指定端口,Cloud Run会自动将外部80/443端口的流量转发到容器的8080端口。

方案2:在8080端口同时处理原生MQTT与HTTP协议

通过Kestrel的协议多路复用能力,在同一个端口上自动识别并处理原生MQTT和HTTP流量。

修改Program.cs配置

调整Kestrel监听规则,让8080端口同时支持MQTT原生协议和HTTP:

var builder = WebApplication.CreateBuilder(args);

builder.WebHost.UseKestrel(o =>
{
    o.ListenAnyIP(8080, l =>
    {
        // 启用HTTP1/HTTP2,并添加MQTT协议支持
        l.Protocols = HttpProtocols.Http1AndHttp2;
        l.UseMqtt();
    });
});

// 其余配置保持不变...

客户端连接调整

将MQTT客户端的连接端口改为8080,使用原生MQTT协议连接:

  • 连接地址示例:tcp://<你的Cloud Run服务域名>:8080

必要的Cloud Run配置验证

  • 部署时确认容器端口设置为8080(控制台部署或使用命令行参数--port 8080)。
  • 确保Cloud Run服务的Ingress设置为"允许所有流量"(默认配置),若使用私有VPC需调整网络规则。

内容的提问来源于stack exchange,提问作者Nick Prozee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 11:50:31