【问题标题】:Unable to call grpc server hosted behind traefik reverse proxy无法调用 traefik 反向代理后托管的 grpc 服务器
【发布时间】:2021-04-12 21:49:12
【问题描述】:

我面临一个奇怪的问题,我无法调用托管在 traefik 代理后面的 gRPC 服务器,该服务器运行在具有 http/2 的容器中,并且来自 asp.net 5 应用程序的自定义子域也托管在另一个容器中,并且另一个域名映射到它。 我收到以下错误:

 Status(StatusCode="Unavailable", Detail="Error starting gRPC call. HttpRequestException: Connection timed out (subdomain:443) SocketException: Connection timed out", DebugException="System.Net.Http.HttpRequestException: Connection timed out (subdomain:443)

当我尝试从开发 docker-compose 调用相同的托管 gRPC 服务器时,它工作正常。 我尝试了 Uri 地址(方案、主机和端口)的不同组合,这两种方法都是 Microsoft 在其网站上提供的调用 gRPC 服务器(控制台和 DI)的方法,我什至尝试将以下 AppContext 设置为 true,但看起来像托管应用无法启动通话。

 System.AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport");

grpc服务器的docker-compose为:

version: '3'
networks:
  web:
   external: true
  internal:
   external: false
services:
  grpcservice:
    image: <imagename:tag>
    labels:
      - traefik.protocol=h2c
      - traefik.backend=grpcservice
      - traefik.frontend.rule=Host:<subdomain>
      - traefik.docker.network=web
      - traefik.port=9001
    networks:
      - internal
      - web
    environment:
      - ASPNETCORE_ENVIRONMENT=Production
      - FilePath__FPath=<some file>
      - Auth0__Domain=<Domain>
      - Auth0__Audience=<Audience>
    restart: on-failure

Asp.net 5 App 的 docker-compose 是:

version: '3'
networks:
  web:
   external: true
  internal:
   external: false
services:
  aspapp:
    image: <imagename:tag>
    labels:
      - traefik.backend=aspapp
      - traefik.frontend.rule=Host:<domain>
      - traefik.docker.network=web
      - traefik.port=9000
    networks:
      - internal
      - web
    environment:
      - ASPNETCORE_ENVIRONMENT=Production
      <Auth0 envoirnment vairables>
    restart: on-failure

Traefik.toml 配置为:

defaultEntryPoints = ["http", "https"]
[entryPoints]
  [entryPoints.dashboard]
    address = ":8080"
    [entryPoints.dashboard.auth]
      [entryPoints.dashboard.auth.basic]
        users = ["Auth credentials"]
  [entryPoints.http]
    address = ":80"
      [entryPoints.http.redirect]
        entryPoint = "https"
  [entryPoints.https]
    address = ":443"
      [entryPoints.https.tls]

[api]
entrypoint="dashboard"

[acme]
email = "email"
storage = "acme.json"
entryPoint = "https"
onHostRule = true
  [acme.httpChallenge]
  entryPoint = "http"

logLevel = "DEBUG"

[traefikLog]
  filePath = "traefik.log"
  format   = "json"

[docker]
domain = "domain"
watch = true
network = "web"

当我从托管应用程序和本地开发容器访问同一个 gRPC 服务器时,我无法理解为什么会出现行为差异,我该如何解决?

【问题讨论】:

    标签: c# asp.net-core grpc traefik grpc-c#


    【解决方案1】:

    这只是一个愚蠢的防火墙问题,阻止了 @ 443 的容器

    【讨论】:

    • 也许值得结束这个问题,我认为它对其他人没有太大价值。您的解决方案具体取决于您的系统/网络上的条件。
    猜你喜欢
    • 1970-01-01
    • 2021-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多