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
相关产品推荐
相关产品推荐

