Cân bằng tải động với cổng Ocelot và Consul

1. Vai trò & Mục đích

Thiết lập cổng truy cập thống nhất để định tuyến đến nhiều dịch vụ backend, giúp ẩn địa chỉ thực tế của các microservice. Ocelot hỗ trợ tích hợp nhà cung cấp phát hiện dịch vụ (service discovery), cho phép xác định host/port của dịch vụ mục tiêu thông qua Consul. Kết hợp này cho phép mở rộng cluster dịch vụ tự động mà không cần chỉnh sửa cấu hình cổng.

2. Cài đặt cơ bản

2.1 Khởi tạo dự án

Install-Package Ocelot

2.2 Tạo file cấu hình ocelot.json

{
  "Routes": [],
  "GlobalConfiguration": {
    "BaseUrl": "http://127.0.0.1:8888"
  }
}

2.3 Đăng ký cấu hình

public class Program {
  public static void Main(string[] args) => 
    CreateHostBuilder(args).Build().Run();

  public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
      .ConfigureWebHostDefaults(webBuilder => {
        webBuilder.UseStartup<Startup>();
      })
      .ConfigureAppConfiguration(builder => {
        builder.AddJsonFile("ocelot.json");
      });
}

2.4 Cấu hình dịch vụ

public class Startup {
  public void ConfigureServices(IServiceCollection services) {
    services.AddOcelot().AddConsul();
  }

  public void Configure(IApplicationBuilder app, IWebHostEnvironment env) {
    if (env.IsDevelopment()) app.UseDeveloperExceptionPage();
    
    app.UseRouting();
    app.UseOcelot().Wait();
    
    app.UseEndpoints(endpoints => {
      endpoints.MapGet("/", async context => {
        await context.Response.WriteAsync("Gateway Running");
      });
    });
  }
}

3. Định tuyến tĩnh

{
  "Routes": [{
    "DownstreamPathTemplate": "/api/Users/GetUser?id={id}",
    "DownstreamScheme": "http",
    "DownstreamHostAndPorts": [{
      "Host": "127.0.0.1",
      "Port": 5211
    }],
    "UpstreamPathTemplate": "/Users/Get?id={id}",
    "UpstreamHttpMethod": ["Get", "Delete"]
  }]
}

Cấu hình này chuyển đổi request từ http://127.0.0.1:8888/Users/Get?id=1 sang http://127.0.0.1:5211/api/Users/GetUser?id=1

4. Cân bằng tải đa phiên bản

"DownstreamHostAndPorts": [{
    "Host": "127.0.0.1",
    "Port": 5210
  },{
    "Host": "127.0.0.1",
    "Port": 5211
  },{
    "Host": "127.0.0.1",
    "Port": 5212
  }],
  "LoadBalancerOptions": {
    "Type": "RoundRobin"
  }

5. Tích hợp Consul

5.1 Cấu hình động

{
  "Routes": [{
    "DownstreamPathTemplate": "/api/Users/GetUser?id={id}",
    "DownstreamScheme": "http",
    "UpstreamPathTemplate": "/Users/Get?id={id}",
    "ServiceName": "UserService",
    "UseServiceDiscovery": true,
    "LoadBalancerOptions": {
      "Type": "LeastConnection"
    }
  }],
  "GlobalConfiguration": {
    "ServiceDiscoveryProvider": {
      "Host": "localhost",
      "Port": 8500,
      "Type": "PollConsul",
      "PollingInterval": 2000
    }
  }
}

5.2 Tham số cấu hình

  • ServiceName: Tên dịch vụ đăng ký trên Consul
  • LoadBalancerOptions: Thuật toán phân tải (RoundRobin/LeastConnection)
  • PollingInterval: Chu kỳ kiểm tra Consul (ms)

6. Triển khai thực tế

6.1 Khởi động dịch vụ

dotnet MicroService.dll --urls="http://*:5213"

6.2 Kiểm tra

  1. Consul tự động phát hiện instance mới
  2. Ocelot cập nhật cấu hình định tuyến

Thẻ: ocelot consul Microservices ServiceDiscovery LoadBalancing

Đăng vào ngày 29 tháng 5 lúc 17:33