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

Traefik如何通过新子域名配置实现容器双端口承接Web和gRPC流量

解决方案

首先修正原配置的两处笔误,再新增gRPC路由的相关配置即可满足需求,完整的docker-compose labels配置如下:

labels:
  - "traefik.enable=true"
  # 常规HTTP流量路由(对应5000端口)
  - "traefik.http.routers.myApi-web.rule=Host(`api.example.com`)"
  - "traefik.http.routers.myApi-web.entrypoints=websecure"
  - "traefik.http.routers.myApi-web.tls.certresolver=myresolver"
  - "traefik.http.services.myApi-web.loadbalancer.server.port=5000"
  # gRPC流量路由(对应5001端口)
  - "traefik.http.routers.myApi-grpc.rule=Host(`api-grpc.example.com`)"
  - "traefik.http.routers.myApi-grpc.entrypoints=websecure"
  - "traefik.http.routers.myApi-grpc.tls.certresolver=myresolver"
  - "traefik.http.services.myApi-grpc.loadbalancer.server.port=5001"
  # 配置gRPC服务使用HTTP2协议通信,容器内无TLS用h2c,有内部TLS用h2
  - "traefik.http.services.myApi-grpc.loadbalancer.server.scheme=h2c"

配置说明

  • 两个路由完全独立,分别绑定两个子域名,不会出现流量串扰
  • 常规HTTP路由默认兼容HTTP1.1/HTTP2请求,直接转发到容器5000端口
  • gRPC路由强制使用HTTP2协议和容器5001端口通信,完全满足gRPC的协议要求,不需要使用gRPC-web做转换

注意事项

你需要确保.NET应用的Kestrel服务端口协议配置和需求一致,可在appsettings.json中添加如下配置:

{
  "Kestrel": {
    "Endpoints": {
      "Http": {
        "Url": "http://0.0.0.0:5000",
        "Protocols": "Http1"
      },
      "Grpc": {
        "Url": "http://0.0.0.0:5001",
        "Protocols": "Http2"
      }
    }
  }
}

优化建议

这个基于子域名拆分流量的方案已经是当前场景下的最优实现:

  • 无需修改现有业务代码
  • 流量边界清晰,故障排查方便
  • 后续如果需要拆分两个服务独立部署也可以直接调整配置,不需要修改路由规则

内容的提问来源于stack exchange,提问作者Troels Larsen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 14:06:02