由于连接被强制终止,使用 ngrok 测试 gRPC 失败

Posted

技术标签:

【中文标题】由于连接被强制终止,使用 ngrok 测试 gRPC 失败【英文标题】:Testing gRPC with ngrok fails due to connection forcefully terminated 【发布时间】:2020-04-20 13:41:49 【问题描述】:

我在通过 ngrok 公开 gRPC 服务器时遇到了一些问题。

我已经关注并从here 下载了演示代码。

通过 localhost 连接很好,但是通过 ngrok 连接会导致以下错误:

捕获错误:gRPC 错误(2,HTTP/2 错误:连接错误:连接被强制终止。(错误代码:10))

这是我在~/.ngrok2/ngrok.yml 文件中用于 ngrok 的隧道配置:

tunnels:
  grpc:
    proto: http
    addr: 8080
    bind_tls: true
    region: eu
    inspect: true

这就是我到目前为止所做的:

    dart bin/server.dart ngrok grpc 编辑 lib/src/client.dart 以使用来自 ngrok 的 forwarding 网址 dart bin/client.dart

虽然服务器正在侦听 8080,但客户端正在尝试连接到标准端口 443 上的 ngrok 的 url 以获取 https。

我正在考虑使用 HTTP2(gRPC 依赖于它),但根据 this ngrok 应该支持它(我正在运行版本 2.3.35)。

我错过了什么或做错了什么?

【问题讨论】:

【参考方案1】:

原来ngrokhttp 选项下表现不佳。

切换到proto:tcp 解决了我的问题。

我想这是因为 ngrok 在选择 proto: http! 时期望 gRPC 未提供的东西!

【讨论】:

您是否有机会将完整的 ngrok.yml 文件与您用于 gRPC 的隧道规范共享?在您提供的示例中,我尝试将 proto:http 更改为 proto:tcp,但无法使其正常工作 - 如果您有完整的工作配置,我很乐意看到它。谢谢! 嗨,我不知道我当前的 .yaml 是否一致,因为它已经过时了,在这个问题之后我可能已经将 ngrok 用于其他事情。我当前的 .yaml 与我的问题中的基本相同,但没有 bind_tls 行(只需删除它)。不过,阅读我的回答提示我,除了删除 bind_tls 之外,您还应该将 proto:http 更改为 proto:tcp

以上是关于由于连接被强制终止,使用 ngrok 测试 gRPC 失败的主要内容,如果未能解决你的问题,请参考以下文章

Ngrok SSH 连接被远程主机关闭

如何终止 SignalR 连接?

检测应用程序是不是通过单击应用程序图标或推送通知启动(当应用程序被用户强制终止时)

由于代理,ngrok 没有运行

如何强制终止卡在等待启动生命周期操作状态的aws实例

如何使用 ngrok 测试接收 Stripe webhook