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

Posted dotNET跨平台

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了.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 缓存和限流的主要内容,如果未能解决你的问题,请参考以下文章

.NET7之MiniAPI(特别篇):.NET7 Preview3

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

.NET7之MiniAPI(特别篇) .NET Preview5参数绑定

.NET7之MiniAPI(特别篇) :Preview5优化了JWT验证(下)

MiniAPI:.NET7 Preview4之MiniAPI更新总览

.NET7 Preview4 之OpenAPI swagger改进