Envoy代理gRPC Web请求无响应,直连后端正常问题排查求助
问题根因分析
- 核心错误是Envoy容器无法访问到gRPC后端服务:你在Envoy配置的上游集群
echo_service中,endpoint地址填的是0.0.0.0:50052,该地址在Envoy容器的网络命名空间内指向Envoy容器自身,而非跑在另一个Docker栈/宿主机上的Node.js gRPC服务,导致Envoy代理请求时一直尝试建立上游连接无响应,请求就会处于挂起状态。
解决方案(可选任意一种)
方案1:使用宿主机IP作为上游地址
将envoy.yaml中集群echo_service的socket_address地址修改为你宿主机的实际局域网IP(可通过ifconfig/ip addr命令查看),同时将集群类型从logical_dns改为STATIC更适配静态IP场景:
clusters: - name: echo_service connect_timeout: 0.25s type: STATIC # 修改集群类型 http2_protocol_options: {} lb_policy: round_robin load_assignment: cluster_name: cluster_0 endpoints: - lb_endpoints: - endpoint: address: socket_address: address: 192.168.xxx.xxx # 替换为你的宿主机实际IP port_value: 50052
修改后重启Envoy容器即可。
方案2:打通两个Docker Compose的网络(更规范)
- 在后端Node.js的
docker-compose.yaml中新增共享网络声明:
version: '3.9' networks: grpc-network: external: false services: postgres: # 原有配置不变 networks: - grpc-network states-service: # 原有配置不变 networks: - grpc-network
- 在前端/Envoy的
docker-compose.yaml中加入同一个共享网络:
version: '3.9' networks: grpc-network: external: true # 声明使用外部已创建的网络 services: envoy: build: . ports: - 8082:8082 networks: - grpc-network
- 修改
envoy.yaml的上游地址为后端服务名,Docker会自动完成内部DNS解析:
socket_address: address: states-service port_value: 50052
- 先启动后端Docker Compose栈,再启动前端Envoy栈即可。
排查验证方法
如果修改后仍然有问题,可进入Envoy容器查看trace日志确认错误原因:
# 进入Envoy容器 docker exec -it <你的Envoy容器名> bash # 查看运行日志 cat /tmp/envoy_info.log
正常情况下如果是网络不通,日志中会明确打印upstream connect error相关报错。
内容的提问来源于stack exchange,提问作者Alex Ironside
相关产品推荐
相关产品推荐

