.NET7之MiniAPI(特别篇) :Preview6 缓存和限流

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

.NET7之MiniAPI(特别篇) :Preview6 缓存和限流