Nguon: Microsoft Learn · .NET 8.0

Giới hạn tốc độ trong YARP (YARP Rate Limiting)

Nguồn: YARP Rate Limiting

Giới thiệu

Reverse proxy (proxy ngược) có thể được sử dụng để giới hạn tốc độ yêu cầu trước khi chúng được proxy đến các server đích. Điều này có thể giảm tải cho các server đích, thêm một lớp bảo vệ và đảm bảo các policy nhất quán được triển khai trên các ứng dụng của bạn.

Tính năng này chỉ có sẵn khi sử dụng .NET 7 trở lên.

Mặc định

Không có giới hạn tốc độ nào được thực hiện trên các yêu cầu trừ khi được bật trong cấu hình route hoặc ứng dụng. Tuy nhiên, Rate Limiting middleware (phần mềm trung gian giới hạn tốc độ) (app.UseRateLimiter()) có thể áp dụng một limiter (bộ giới hạn) mặc định cho tất cả các route mà không cần opt-in từ cấu hình.

Ví dụ:

csharp
services.AddRateLimiter(options => options.GlobalLimiter = globalLimiter);

Cấu hình

Các policy Rate Limiter có thể được chỉ định cho từng route thông qua RouteConfig.RateLimiterPolicy và có thể được liên kết từ phần Routes của file cấu hình. Giống như các thuộc tính route khác, điều này có thể được sửa đổi và tải lại mà không cần khởi động lại proxy. Tên policy không phân biệt chữ hoa/thường.

Ví dụ:

json
{
  "ReverseProxy": {
    "Routes": {
      "route1" : {
        "ClusterId": "cluster1",
        "RateLimiterPolicy": "customPolicy",
        "Match": {
          "Hosts": [ "localhost" ]
        }
      }
    },
    "Clusters": {
      "cluster1": {
        "Destinations": {
          "cluster1/destination1": {
            "Address": "https://localhost:10001/"
          }
        }
      }
    }
  }
}

Các policy RateLimiter là một khái niệm của ASP.NET Core mà proxy sử dụng. Proxy cung cấp cấu hình ở trên để chỉ định một policy cho mỗi route và phần còn lại được xử lý bởi middleware giới hạn tốc độ ASP.NET Core hiện có.

Các policy RateLimiter có thể được cấu hình trong services (dịch vụ) như sau:

csharp
services.AddRateLimiter(options =>
{
    options.AddFixedWindowLimiter("customPolicy", opt =>
    {
        opt.PermitLimit = 4;
        opt.Window = TimeSpan.FromSeconds(12);
        opt.QueueProcessingOrder = QueueProcessingOrder.OldestFirst;
        opt.QueueLimit = 2;
    });
});

Sau đó thêm middleware RateLimiter:

csharp
app.UseRateLimiter();

app.MapReverseProxy();

Xem tài liệu Rate Limiting để thiết lập loại giới hạn tốc độ mong muốn.

Tắt Rate Limiting

Chỉ định giá trị disable trong tham số RateLimiterPolicy của route có nghĩa là middleware rate limiter sẽ không áp dụng bất kỳ policy nào cho route này, kể cả policy mặc định.