asp.net core + Ocelot 實現負載均衡、熔斷、認證、限流

lzy1666發表於2024-06-04

一、在nuget引用 Ocelot。

二、建立ocelot.json配置檔案

  

{
  //這裡注意,以前是ReRoutes現在是Routes
  "Routes": [
    {
      //Upstream表示上游請求,即客戶端請求到API Gateway的請求
      "UpstreamPathTemplate": "/client1/{url}", //請求路徑模板
      "UpstreamHttpMethod": [ "Get", "Post" ], //請求方法陣列

      //"UseServiceDiscovery": true, //啟用服務發現

      //Downstream表示下游請求,即API Gateway轉發的目標服務地址
      "DownstreamPathTemplate": "/{url}", //下游請求地址模板
      "DownstreamScheme": "http", //請求協議,目前應該是支援http和https

      //A***************指定單個轉發地址
      "DownstreamHostAndPorts": [ //請求服務地址,可以有多個
        {
          "Host": "43.138.199.247",
          "Port": 9000
        }
      ],
    // 限流配置
      "RateLimitOptions": {
        "ClientWhitelist": [], //白名單,不會被限流,為空表示訪問的都被限流
        "EnableRateLimiting": true, //是否被開啟
        "Period": "1s", //1秒鐘超過了Limit定義的會拋異常
        "PeriodTimespan": 1, //超過一秒後才可以重新請求
        "Limit": 1
      },
      "AuthenticationOptions": { //認證
        "AuthenticationProviderKey": "Bearer",
        "AllowedScopes": []
      },

//熔斷
"QoSOptions": {
"ExceptionsAllowedBeforeBreaking": 3,
"DurationOfBreak": 20,
"TimeoutValue": 5000
}

  • ExceptionsAllowedBeforeBreaking:允許多少個異常請求。
  • DurationOfBreak:熔斷的時間(秒)。
  • TimeoutValue:下游請求的處理時間超過多少則將請求設定為超時。
     }

]}

Downstream是下游服務配置
UpStream是上游服務配置
Aggregates 服務聚合配置
ServiceName, LoadBalancer, UseServiceDiscovery 配置服務發現
AuthenticationOptions 配置服務認證
RouteClaimsRequirement 配置Claims鑑權
RateLimitOptions為限流配置
FileCacheOptions 快取配置
QosOptions 服務質量與熔斷
DownstreamHeaderTransform頭資訊轉發
DownstreamPathTemplate:下游模板
DownstreamScheme:下游服務http schema
DownstreamHostAndPorts:下游服務的地址,如果使用LoadBalancer的話這裡可以填多項
UpstreamPathTemplate: 上游也就是使用者輸入的請求Url模板
UpstreamHttpMethod: 上游請求http方法,可使用陣列

LoadBalancerOptions:
LeastConnection – 將請求發往最空閒的那個伺服器
RoundRobin – 輪流傳送
NoLoadBalance – 總是發往第一個請求或者是服務發現

using Ocelot.DependencyInjection;
using Ocelot.Middleware;
using System.Net;

var builder = WebApplication.CreateBuilder(args);
builder.Configuration.AddJsonFile("ocelot.json", optional: false, reloadOnChange: true);
builder.Services.AddRazorPages();
builder.Services.AddOcelot(builder.Configuration);
var app = builder.Build();

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();
app.UseOcelot().Wait();
app.Run();

相關文章