.NET7之MiniAPI(特別篇) :Preview6 快取和限流
阿新 • • 發佈:2022-12-09
前幾在用MiniAPI時還想沒有比較優雅的快取,這不,Preivew6就帶來了。使用起來很簡單,注入Sevice,引用中介軟體,然後在Map方法的後面跟CacheOutput()就ok了,CacheOutpu也有不同的引數,可以根據每個方法定製,當然也可以有全域性配置,在新增Service時進行統一配置。
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddOutputCache();
var app = builder.Build();
app.UseOutputCache();
app.MapGet( "/cached", () => DateTime.Now.ToString()).CacheOutput();
app.MapGet("/query", () => DateTime.Now.ToString()).CacheOutput(p => p.VaryByQuery("key").Expire(TimeSpan.FromMinutes(10)));
app.Run();
本次Preview,還優化了限流,引入了TokenBucketLimiter,還優化了RateLimiterOptions中的屬性。我們通過一個例子來看一下TokenBucketLimiter.
using Microsoft.AspNetCore.RateLimiting;
using System.Threading.RateLimiting;
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
var limiterName = "MyLimiterName";
//間隔多少時間補發
var options = new RateLimiterOptions().AddTokenBucketLimiter(limiterName, new TokenBucketRateLimiterOptions(1 , QueueProcessingOrder.OldestFirst, 1, TimeSpan.FromSeconds(8), 1));
app.UseRateLimiter(options);
app.MapGet("/limit", () =>
{
app.Logger.LogInformation($"limit 開始 {DateTime.Now}");
Thread.Sleep(5000);
app.Logger.LogInformation($"limit 結束 {DateTime.Now}");
return DateTime.Now.ToString();
}).RequireRateLimiting(limiterName);
app.Run();
在構建Options時,有一個引數,TimeSpan,它是當等待的請求,與上一個請求開始之間的時間間隔,即等待多長時間開始。看結果,兩個請求,紅色的是間隔我們設的8s,後臺的兩個開始也是間隔8s,雖然第一個請求已於3s前返回,但第二個請求還是要等待的。
想要更快更方便的瞭解相關知識,可以關注微信公眾號