Thêm Giới Hạn Tốc Độ cho .NET Web API của Bạn (từ appsettings.json)
APIs rất tuyệt vời, nhưng chúng cũng có thể trở nên mong manh. Nếu một khách hàng gửi yêu cầu quá nhanh, API của bạn có thể chậm lại hoặc tệ hơn, có thể hoàn toàn ngừng hoạt động. Đó là lý do tại sao giới hạn tốc độ ra đời: nó giúp bạn kiểm soát lưu lượng truy cập và giữ cho mọi thứ ổn định.
Trong bài viết này, chúng ta sẽ sử dụng thư viện AspNetCoreRateLimit phổ biến, giúp thiết lập giới hạn tốc độ dựa trên IP trong .NET Web API một cách dễ dàng. Phần tốt nhất? Chúng ta sẽ cấu hình mọi thứ trong appsettings.json để có thể thay đổi quy tắc mà không cần chạm vào mã nguồn.
Bước 1: Thêm Gói NuGet
Đầu tiên, hãy cài đặt gói:
dotnet add package AspNetCoreRateLimit
Bước 2: Cấu Hình appsettings.json
Dưới đây là một ví dụ cấu hình với các quy tắc khác nhau dựa trên các phương thức HTTP:
"IpRateLimiting": {
"EnableEndpointRateLimiting": true,
"StackBlockedRequests": false,
"RealIpHeader": "X-FORWARDED-FOR", // Sử dụng header này khi ứng dụng của bạn nằm sau proxy/load balancer để lấy chính xác IP của khách hàng
"ClientIdHeader": "X-ClientId",
"HttpStatusCode": 429,
"GeneralRules": [
{
"Endpoint": "GET:/*",
"Period": "1s",
"Limit": 10
},
{
"Endpoint": "GET:/*",
"Period": "1m",
"Limit": 100
},
{
"Endpoint": "POST:/*",
"Period": "1s",
"Limit": 5
},
{
"Endpoint": "POST:/*",
"Period": "1m",
"Limit": 25
},
{
"Endpoint": "PUT:/*",
"Period": "1s",
"Limit": 5
},
{
"Endpoint": "PUT:/*",
"Period": "1m",
"Limit": 30
},
{
"Endpoint": "DELETE:/*",
"Period": "1m",
"Limit": 5
}
]
},
"IpRateLimitPolicies": {
"IpRules": []
}
Cấu hình này áp dụng nhiều lớp giới hạn:
- GET → 10 yêu cầu mỗi giây, 100 mỗi phút
- POST → 5 mỗi giây, 25 mỗi phút
- PUT → 5 mỗi giây, 30 mỗi phút
- DELETE → 5 mỗi phút
Bước 3: Đăng Ký Dịch Vụ trong Program.cs
Bây giờ hãy kết nối mọi thứ lại với nhau:
using AspNetCoreRateLimit;
var builder = WebApplication.CreateBuilder(args);
// Tải cấu hình từ appsettings.json
builder.Services.AddOptions();
builder.Services.AddMemoryCache();
// Tải cấu hình IpRateLimiting
builder.Services.Configure<IpRateLimitOptions>(
builder.Configuration.GetSection("IpRateLimiting"));
builder.Services.Configure<IpRateLimitPolicies>(
builder.Configuration.GetSection("IpRateLimitPolicies"));
// Tiêm các dịch vụ giới hạn tốc độ
builder.Services.AddInMemoryRateLimiting();
builder.Services.AddSingleton<IRateLimitConfiguration, RateLimitConfiguration>();
builder.Services.AddControllers();
var app = builder.Build();
// Bật giới hạn tốc độ IP
app.UseIpRateLimiting();
app.MapControllers();
app.Run();
Bước 4: Thêm một Controller Kiểm Tra
[ApiController]
[Route("api/[controller]")]
public class HelloController : ControllerBase
{
[HttpGet]
public IActionResult Get()
{
return Ok(new { Message = "Xin chào, thế giới!" });
}
[HttpPost]
public IActionResult Post()
{
return Ok(new { Message = "Bạn đã gửi một cái gì đó!" });
}
}
Bây giờ, nếu bạn gọi GET /api/hello nhiều hơn 10 lần mỗi giây hoặc 100 lần mỗi phút, bạn sẽ bắt đầu nhận được HTTP 429 Quá Nhiều Yêu Cầu. Tương tự cho POST, PUT và DELETE với các giới hạn riêng của chúng.
Kết Luận
Chỉ với vài dòng thiết lập, bạn đã thêm giới hạn tốc độ dựa trên IP cho .NET Web API của mình. Mọi thứ đều được kiểm soát bởi cấu hình trong appsettings.json, vì vậy việc điều chỉnh quy tắc trở nên đơn giản như việc chỉnh sửa JSON.
Cách tiếp cận này rất tốt để bảo vệ API của bạn khỏi lạm dụng, khách hàng lỗi hoặc thậm chí là các đợt tấn công DDoS. Và vì nó dựa trên địa chỉ IP, bạn có thể dễ dàng mở rộng nó với các chính sách để cung cấp giới hạn khác nhau cho các khách hàng cụ thể.
Bảo vệ API của bạn ngay từ đầu—cơ sở hạ tầng của bạn (và người dùng của bạn) sẽ cảm ơn bạn. 🚀
Thực Hành Tốt Nhất
- Theo dõi lưu lượng truy cập: Luôn luôn theo dõi lưu lượng truy cập API của bạn để điều chỉnh quy tắc giới hạn phù hợp.
- Cấu hình quy tắc hợp lý: Đảm bảo quy tắc giới hạn không quá nghiêm ngặt để không ảnh hưởng đến người dùng hợp pháp.
Cạm Bẫy Thường Gặp
- Quá nhiều yêu cầu từ một IP: Nếu quy tắc quá nghiêm ngặt, có thể dẫn đến tình trạng không truy cập được cho người dùng hợp pháp.
Mẹo Hiệu Suất
- Tối ưu hóa cache: Sử dụng bộ nhớ cache để cải thiện hiệu suất cho các yêu cầu lặp lại.
Giải Quyết Vấn Đề
- HTTP 429: Khi gặp mã lỗi này, hãy kiểm tra lại quy tắc giới hạn tốc độ và lưu lượng truy cập.
Câu Hỏi Thường Gặp (FAQ)
- Giới hạn tốc độ là gì?
Giới hạn tốc độ là kỹ thuật kiểm soát số lượng yêu cầu mà một người dùng có thể gửi đến API trong một khoảng thời gian nhất định. - Tại sao tôi cần giới hạn tốc độ?
Để bảo vệ API khỏi lạm dụng và đảm bảo rằng tất cả người dùng có thể sử dụng dịch vụ một cách công bằng.