摘要: 1 前言 WebApiClient已成熟稳定,发布了WebApiClient.JIT和WebApiClient.AOT两个nuget包,累计近10w次下载。我对它的高可扩展性设计相当满意和自豪,但WebApiClient并不因此而停下脚步,在一年前,我产生了编写其core版本的想法,将asp.net 阅读全文
posted @ 2020-06-05 23:50 jiulang 阅读(6049) 评论(26) 推荐(29)

前言

同事问我Asp.netCore的RateLimiting是怎么使用的,我回答说很简单的,你只要按照如下步骤来:

  1. 在RateLimiterOptions上注册policy,记住policy对应的policyName
  2. 在Web应用添加UseRateLimiter()中间件
  3. 在api对应的Action上标注[EnableRateLimiting(policyName)]

半小时后,同事说要对我告知他的RateLimiter功能差评,因为他得写几十种policy工作量很大,就连policyName的取名都让他头大。

让RateLimiting更简单

我在基于Yarp的网关上做过RateLimiting,将每个服务的所有Endpoint描述导出放到网关做网关的子级路由,然后基于Endpoint做可配置化的限流,代码实现上很复杂但使用灵活度非常可观。
但今天我们的问题范围是在单体WebApplication中,如何减少我同事的限流工作量。

限流器Attribute化

假如我们造了如下的Attribute:

  • [RateLimiter.Concurrency(permitLimit: 10)]
  • [RateLimiter.FixedWindow(permitLimit: 10, windowSeconds: 60)]
  • [RateLimiter.SlidingWindow(permitLimit: 10, windowSeconds: 60, segmentsPerWindow: 5)]

让我的同事在Action上标记其中一个Attribute,他的开发时间短、代码可读性高,免去了他手写policy实现的巨量代码。

限流单元来源Attribute化

同事说他的众多接口中,需要整体限流的很少,几乎都是需要颗粒度更细的限流:

  1. 登录接口,需要对请求体的json对象的userName值做限流单元
  2. 找回密码接口,需要对请求路由里的userName值做限流单元
  3. 其它已经做了用户身份认证的接口,需要用userId值做限流单元
  4. xx特殊接口,需要用请求者IP值做限流单元
  5. yy接口需要从Form中取出yy值做限流单元
  6. zz接口需要从Header中取出zz值做限流单元
  7. 想自定义从HttpContext里获取限流单元

于是我们又造了一些Attribute,来处理上面的需求

  1. [RateLimiterUnit.FromBody(unitName: "$.userName")]
  2. [RateLimiterUnit.FromRoute(unitName: "userName")]
  3. [RateLimiterUnit.FromUser(unitName: ClaimTypes.NameIdentifier)]
  4. [RateLimiterUnit.FromRemoteIPAddress]
  5. [RateLimiterUnit.FromForm(unitName: "yy")]
  6. [RateLimiterUnit.FromHeader(unitName: "zz")]

再提供一个IRateLimiterUnitMetadata接口,让他实现自定义逻辑

public class YourRateLimiterUnitAttribute : Attribute, IRateLimiterUnitMetadata
{
    public ValueTask<string?> GetUnitAsync(HttpContext context)
    {
        throw new NotImplementedException();
    }
}

让RateLimiting能运行

上面提到的那些Attribute,目前只存在于我们理想中,我们需要把它变成实际。

我们需要实现实现一个policy,在policy里获取当前请求的Endpoint,从Endpoint的metadata里提取出我们上面定义的Attribute,根据Attribute的描述生成RateLimitPartition。

把这个唯一的policy注册到RatelimiterOptions中,再把它的policyName使用EnableRateLimitingAttribute添加到Endpoint的metadata中。

最后,使用标准的Asp.netCore的UseRateLimiter()中间件,就能把我们的限流器运行起来了。

最后

此项目是开源的,不管你在工作中有没有用到,但里面有意思的想法你可以来一起品。

posted @ 2024-12-25 15:30 jiulang 阅读(551) 评论(2) 推荐(3)
摘要: 我以前开发过HttpMouse的http内网反代中间件,但由于当时的知识点与设计水平受限,所以把它下马了。随着自身又遇到http内网反代的需求,在frp不能满足我需求情况下,我又启动了一个叫CYarp的http内网反代项目,这次它的设计完成度是相当高的。 开源仓库地址:https://github. 阅读全文
posted @ 2024-03-25 23:03 jiulang 阅读(3215) 评论(27) 推荐(34)
摘要: 0 前言 在物联网领域中,mqtt消息一直是海量设备连接到平台的标配协议,而平台向移动端开放的操作接口往往是http协议,这就要求平台为两种协议作消息一一适配。在某些情况下,这些设备是有操作系统的linux或安卓设备,如果我们换个思路,让这些设备直接提供http协议的操作接口(httpd服务器),平 阅读全文
posted @ 2024-03-19 22:17 jiulang 阅读(1995) 评论(8) 推荐(22)
摘要: ### 前言 随着dotnet的发展,DependencyInjection已经成为基础库的一部分,现在我们的很多新型应用程序很自然地应用了DependencyInjection功能。应用功能越多,往往服务类型数量也随着增加,如果依靠手写代码一个服务一个服务地进行注册则非常麻烦。如果使用特性标记服务 阅读全文
posted @ 2023-08-18 00:20 jiulang 阅读(687) 评论(3) 推荐(3)
摘要: ## 1 前言 [Microsoft.Extensions.Http](https://github.com/dotnet/runtime/tree/main/src/libraries/Microsoft.Extensions.Http)是一个设计非常优异的客户端工厂库,其提供了`IHttpCli 阅读全文
posted @ 2023-05-22 09:00 jiulang 阅读(909) 评论(0) 推荐(10)
摘要: 1 ServiceSelf 为.NET 泛型主机的应用程序提供自安装为服务进程的能力,支持windows和linux平台。 功能 自我服务安装 自我服务卸载 自我服务日志监听 2 自我服务安装 虽然.NetCore提供了Microsoft.Extensions.Hosting.Systemd和Mic 阅读全文
posted @ 2023-04-23 12:40 jiulang 阅读(1551) 评论(11) 推荐(25)
摘要: ServiceSelf 做过服务进程功能的同学应该接触过Topshelf这个项目,它在.netframework年代神一搬的存在,我也特别喜欢它。遗憾的是在.netcore时代,这个项目对.netcore程序的支持没有跟进,最近项目也存档停止更新了。 我在开源的一些工具里实现放了自安装和卸载服务的功 阅读全文
posted @ 2023-04-15 17:36 jiulang 阅读(874) 评论(5) 推荐(23)
摘要: 1 MQTTnet介绍 MQTTnet是一个高性能的 .NET MQTT库,它提供MQTT客户端和MQTT服务器的功能,支持到最新MQTT5协议版本,支持.Net Framework4.5.2版本或以上。 MQTTnet is a high performance .NET library for 阅读全文
posted @ 2022-12-16 22:51 jiulang 阅读(1679) 评论(3) 推荐(29)
摘要: 1 文章目的 本文讲解基于kestrel开发类似Fiddler应用的过程,让读者了解kestrel网络编程里面的kestrel中间件和http应用中间件。由于最终目的不是输出完整功能的产品,所以这里只实现Fiddler最核心的http请求和响应内容查看的功能。本文章是KestrelApp项目里面的一 阅读全文
posted @ 2022-12-14 08:32 jiulang 阅读(1496) 评论(4) 推荐(16)
摘要: 1 文章目的 本文讲解基于kestrel开发实现了部分redis命令的redis伪服务器的过程,让读者了解kestrel网络编程的完整步骤,其中redis通讯协议需要读者自行查阅,文章里不做具体解析。 2 开发顺序 创建Kestrel的Redis协议处理者 配置监听的EndPoint并使用Redis 阅读全文
posted @ 2022-12-12 10:12 jiulang 阅读(1746) 评论(6) 推荐(23)
点击右上角即可分享
微信分享提示