EnvoyProxy代理TCP/UDP回显服务无回显问题求助
问题排查与修复方案
错误码111是ECONNREFUSED,说明Envoy无法连接到后端Go服务,核心问题集中在网络连通性和配置匹配上,以下是具体排查点和修复方法:
1. 后端服务地址配置错误
在Envoy的CDS/LDS配置中,若上游地址写的是localhost或127.0.0.1,在Docker Compose环境下,这个地址指向Envoy容器自身,而非Go服务容器。必须改用Compose中定义的服务名称作为地址,比如Go服务在compose.yaml中叫echo-service,就配置为echo-service:8080(TCP端口)或echo-service:8081(UDP端口)。
2. Go服务监听范围限制
Go代码如果监听127.0.0.1:端口,服务仅能在容器内部访问,Envoy无法连接。必须修改为监听0.0.0.0:端口,绑定容器所有网络接口:
// TCP回显服务修正 listener, err := net.Listen("tcp", "0.0.0.0:8080") // UDP回显服务修正 conn, err := net.ListenUDP("udp", &net.UDPAddr{IP: net.IPv4(0, 0, 0, 0), Port: 8081})
3. Docker Compose网络配置问题
- 确保Envoy和Go服务在同一个网络中:默认
default网络会自动连通所有服务,若自定义了网络,需在compose.yaml中把两个服务都加入该网络。 - 无需给Go服务配置对外端口映射,只要保证容器内部端口正常暴露,Envoy能通过内部网络访问即可。
4. Envoy协议与监听器配置不匹配
- TCP服务:需配置
tcp_proxy过滤器,集群类型设为STATIC,指定正确的后端地址和端口。 - UDP服务:必须配置UDP监听器和
udp_proxy过滤器,示例配置如下:
# LDS中的UDP监听器片段 listeners: - name: udp_echo_listener address: socket_address: { address: 0.0.0.0, port_value: 9001 } udp_listener_config: idle_timeout: 300s filter_chains: - filters: - name: envoy.filters.network.udp_proxy typed_config: "@type": type.googleapis.com/envoy.extensions.filters.network.udp_proxy.v3.UdpProxy stat_prefix: udp_echo cluster: udp_echo_cluster # CDS中的UDP集群片段 clusters: - name: udp_echo_cluster connect_timeout: 0.25s type: STATIC lb_policy: ROUND_ROBIN load_assignment: cluster_name: udp_echo_cluster endpoints: - lb_endpoints: - endpoint: address: socket_address: { address: echo-service, port_value: 8081 }
5. 服务启动状态验证
- 查看Go服务容器日志,确认服务成功启动并监听端口:
docker logs <go-service-container-id> - 检查Envoy容器日志,确认配置加载无错误,集群地址解析正常。
验证步骤
修复后重启服务:
docker-compose down && docker-compose up -d
测试:
- TCP:
nc <envoy-host> <envoy-tcp-port>,输入内容后回车验证回显 - UDP:
nc -u <envoy-host> <envoy-udp-port>,输入内容后回车验证回显
内容的提问来源于stack exchange,提问作者aculnaig
相关产品推荐
相关产品推荐

