Ocelot网关负载均衡问题:NET6中首节点不可用时未自动尝试次节点
Ocelot .NET6 故障转移不生效问题解决
你的配置已经启用了RoundRobin负载均衡和QoS熔断,但默认情况下Ocelot不会在单次请求失败时自动切换到下一个节点,只会在节点被熔断后(达到失败次数阈值),后续请求才会路由到可用节点。要实现即时故障转移,需要调整配置并添加重试策略:
1. 调整QoS熔断阈值
将ExceptionsAllowedBeforeBreaking设为1,这样单个节点失败1次就会被立即熔断,后续请求直接跳过该节点:
"QoSOptions": { "ExceptionsAllowedBeforeBreaking": 1, "DurationOfBreak": 5000, "TimeoutValue": 2000 }
2. 添加Polly重试策略
在路由配置中新增RetryPolicyOptions,指定重试次数和触发重试的异常类型,让Ocelot在遇到连接失败时自动重试其他节点:
"Routes": [ { "UpstreamPathTemplate": "/api/abc", "UpstreamHttpMethod": [ "POST" ], "QoSOptions": { "ExceptionsAllowedBeforeBreaking": 1, "DurationOfBreak": 5000, "TimeoutValue": 2000 }, "RetryPolicyOptions": { "NumberOfRetries": 1, "RetryOnExceptionTypes": [ "System.Net.Http.HttpRequestException" ] }, "DownstreamPathTemplate": "/api/qwe", "DownstreamScheme": "http", "DownstreamHostAndPorts": [ { "Host": "serverA", "Port": 2019 }, { "Host": "serverB", "Port": 2019 } ], "LoadBalancerOptions": { "Type": "RoundRobin" } } ]
关键说明
- QoS熔断负责将故障节点从可用列表中临时移除(
DurationOfBreak指定熔断时长) - 重试策略负责在单次请求遇到故障时,自动尝试其他可用节点
- 确保你的Ocelot版本支持
RetryPolicyOptions(Ocelot 16.0+版本已集成该配置)
内容的提问来源于stack exchange,提问作者Tiago
相关产品推荐
相关产品推荐

