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

Ocelot API网关主节点不可用时重定向至备用节点方案咨询

Ocelot主备节点故障切换与自定义负载均衡器实现

一、实现主节点故障自动切换至备用节点

当前配置使用RoundRobin轮询策略,无法满足主备优先的需求。要实现主节点正常时仅访问主节点,主节点不可用时自动切换到备用节点,需做以下调整:

1. 修改配置文件(configuration.json)

  • 给下游节点添加Priority字段,主节点设为1(最高优先级),备用节点设为2
  • 将负载均衡类型改为Priority,该策略会优先选择优先级高的节点
  • 开启健康检查,让Ocelot自动检测节点可用性

修改后的配置如下:

{
  "Routes": [
    {
       "DownstreamPathTemplate": "/GetProductDetails",
       "DownstreamScheme": "http",
       "DownstreamHostAndPorts": [
         {
           "Host": "localhost",
           "Port": 5023,
           "Priority": 1 // 主节点,最高优先级
         },
         {
           "Host": "localhost",
           "Port": 5102,
           "Priority": 2 // 备用节点,次优先级
         }
       ],
       "UpstreamPathTemplate": "/",
       "LoadBalancerOptions": {
         "Type": "Priority" // 切换为优先级负载均衡策略
       },
      "UpstreamHttpMethod": [ "GET" ]
    }
  ],
  "GlobalConfiguration": {
    "HealthCheckOptions": {
      "Enabled": true, // 开启健康检查
      "Interval": 5000, // 每5秒检查一次节点健康状态
      "Timeout": 1000, // 检查超时时间1秒
      "Path": "/ocelot-health" // 健康检查接口路径
    }
  }
}

2. 启用健康检查服务(Program.cs)

在添加Ocelot服务时,启用健康检查扩展:

using Ocelot.DependencyInjection;
using Ocelot.Middleware;

var builder = WebApplication.CreateBuilder(args);

builder.Configuration.AddJsonFile(
"configuration.json", optional: false, reloadOnChange: true);

// 添加Ocelot并启用健康检查
builder.Services.AddOcelot(builder.Configuration)
    .AddHealthChecks();

var app = builder.Build();

app.MapControllers();

await app.UseOcelot();

app.Run();

配置完成后,Ocelot会持续监控主节点健康状态,主节点不可用时自动转发流量到备用节点;主节点恢复后,自动切回主节点。

二、编写自定义负载均衡器

Ocelot支持自定义负载均衡器,只需实现ILoadBalancer接口并注册到DI容器即可,以下是示例实现:

1. 实现自定义负载均衡器类

创建PrimaryBackupLoadBalancer类,实现ILoadBalancer接口,逻辑为优先选择主节点,主节点不可用时选择备用节点:

using Ocelot.LoadBalancer.LoadBalancers;
using Ocelot.ServiceDiscovery.Providers;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

public class PrimaryBackupLoadBalancer : ILoadBalancer
{
    private readonly ServiceDiscoveryProvider _provider;

    public PrimaryBackupLoadBalancer(ServiceDiscoveryProvider provider)
    {
        _provider = provider;
    }

    public async Task<Service> Lease(HttpContext context)
    {
        var services = await _provider.Get();
        
        // 优先选择优先级最高的可用节点
        var primaryNode = services.FirstOrDefault(s => s.Priority == 1 && s.IsHealthy);
        if (primaryNode != null)
        {
            return primaryNode;
        }
        
        // 主节点不可用时,选择备用节点
        return services.FirstOrDefault(s => s.Priority == 2 && s.IsHealthy) 
               ?? services.FirstOrDefault(s => s.IsHealthy);
    }

    public void Release(Service service)
    {
        // 无需额外释放逻辑,按需扩展
    }
}

2. 注册自定义负载均衡器

在Program.cs中注册自定义负载均衡器,指定名称(如PrimaryBackup):

builder.Services.AddOcelot(builder.Configuration)
    .AddHealthChecks()
    .AddLoadBalancer<PrimaryBackupLoadBalancer>("PrimaryBackup"); // 注册自定义负载均衡器

3. 配置使用自定义负载均衡器

在configuration.json的LoadBalancerOptions.Type中指定自定义负载均衡器的名称:

"LoadBalancerOptions": {
  "Type": "PrimaryBackup"
}

完成以上步骤后,即可使用自定义的负载均衡逻辑,可根据业务需求进一步调整负载均衡规则。

内容的提问来源于stack exchange,提问作者Raviteja Mulukuntla

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 23:47:38