使用YARP代理时出现间歇性请求失败(下游服务毫秒级响应)
YARP代理间歇性返回状态码0,下游服务已正常响应的排查与解决
使用YARP做反向代理时,出现间歇性HTTP请求失败,返回状态码0的问题:YARP已成功转发请求,下游服务在毫秒级内完成处理并返回200状态码,但YARP端日志显示该请求延迟约40秒后以状态码0结束。
YARP代理日志
2024-03-27T14:27:55.2109958+05:00 [INF] (Microsoft.AspNetCore.Hosting.Diagnostics) Request starting HTTP/1.1 POST http://proxy.geekabyte.com.au/api?vendor=vendor1&msisdn=92XXXXXXXX application/xml 470 2024-03-27T14:27:55.2116887+05:00 [INF] (Yarp.ReverseProxy.Forwarder.HttpForwarder) Proxying to "http://api.geekabyte.com.au/ws?vendor=vendor1&msisdn=92XXXXXXXX" "HTTP/2" "RequestVersionOrLower" "no-streaming" 2024-03-27T14:28:35.2132571+05:00 [INF] (Microsoft.AspNetCore.Hosting.Diagnostics) Request finished HTTP/1.1 POST http://proxy.geekabyte.com.au/api?vendor=vendor1&msisdn=92XXXXXXXX application/xml 470 - 0 - - 40002.2840ms
下游服务日志
2024-03-27T14:47:26.3506452+05:00 [INF] (Microsoft.AspNetCore.Hosting.Diagnostics) Request starting HTTP/1.1 POST http://api.geekabyte.com.au/ws?vendor=vendor1&msisdn=92XXXXXXXX application/xml 470 ... 2024-03-27T14:47:26.6469643+05:00 [INF] (Microsoft.AspNetCore.Hosting.Diagnostics) Request finished HTTP/1.1 POST http://api.geekabyte.com.au/ws?vendor=vendor1&msisdn=92XXXXXXXX application/xml 470 - 200 1034 application/xml 296.3219ms
YARP代理配置
"ReverseProxy": { "Routes": { "locationServiceRoute": { "ClusterId": "locationServiceProvider", "AuthorizationPolicy": "invokeLocationServicePolicy", "Match": { "Path": "/api", "Methods": [ "POST" ] }, "Transforms": [ { "PathRemovePrefix": "/api" } ] } }, "Clusters": { "locationServiceProvider": { "Destinations": { "destination1": { "Address": "http://api.geekabyte.com.au/ws" } } } } }
排查方向与解决步骤
1. 调整请求超时配置
YARP默认超时可能过长,或者客户端提前断开连接,导致YARP无法回传下游响应。在集群配置中添加超时参数,确保等待时间匹配实际场景:
"Clusters": { "locationServiceProvider": { "Destinations": { "destination1": { "Address": "http://api.geekabyte.com.au/ws" } }, "HttpRequest": { "Timeout": "00:00:10" // 设置10秒超时,可根据业务调整 } } }
2. 修复HTTP版本兼容性问题
YARP日志显示用HTTP/2转发,但下游实际接收的是HTTP/1.1,版本协商异常可能导致连接中断。强制指定HTTP/1.1转发:
"Routes": { "locationServiceRoute": { // 其他配置不变 "Transforms": [ { "PathRemovePrefix": "/api" }, { "RequestVersion": "HTTP/1.1" } // 强制使用HTTP/1.1 ] } }
3. 优化连接池设置
TCP连接复用可能残留异常连接,导致YARP转发超时。限制连接复用时长和空闲超时:
"Clusters": { "locationServiceProvider": { "Destinations": { "destination1": { "Address": "http://api.geekabyte.com.au/ws" } }, "HttpClient": { "PooledConnectionLifetime": "00:05:00", // 连接最长复用5分钟 "PooledConnectionIdleTimeout": "00:02:00" // 空闲连接2分钟后关闭 } } }
4. 启用响应缓冲避免客户端断开影响
客户端提前断开与YARP的连接时,启用响应缓冲可确保YARP完整接收下游响应,避免异常标记:
"Routes": { "locationServiceRoute": { // 其他配置不变 "Transforms": [ { "PathRemovePrefix": "/api" }, { "ResponseBuffering": true } // 启用响应缓冲 ] } }
内容的提问来源于stack exchange,提问作者Waqas
相关产品推荐
相关产品推荐

