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

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的网络(更规范)

  1. 在后端Node.js的docker-compose.yaml中新增共享网络声明:
version: '3.9'
networks:
  grpc-network:
    external: false
services:
  postgres:
    # 原有配置不变
    networks:
      - grpc-network
  states-service:
    # 原有配置不变
    networks:
      - grpc-network
  1. 在前端/Envoy的docker-compose.yaml中加入同一个共享网络:
version: '3.9'
networks:
  grpc-network:
    external: true # 声明使用外部已创建的网络
services:
  envoy:
    build: .
    ports:
      - 8082:8082
    networks:
      - grpc-network
  1. 修改envoy.yaml的上游地址为后端服务名,Docker会自动完成内部DNS解析:
socket_address:
  address: states-service 
  port_value: 50052
  1. 先启动后端Docker Compose栈,再启动前端Envoy栈即可。

排查验证方法

如果修改后仍然有问题,可进入Envoy容器查看trace日志确认错误原因:

# 进入Envoy容器
docker exec -it <你的Envoy容器名> bash
# 查看运行日志
cat /tmp/envoy_info.log

正常情况下如果是网络不通,日志中会明确打印upstream connect error相关报错。

内容的提问来源于stack exchange,提问作者Alex Ironside

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 14:24:03