前几在用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前返回,但第二个请求还是要等待的。