如果达到限制了,这些响应会返回429 Too many requests 状态码。有可能会包含一个Retry-After 响应Header,而响应的body应该包含解释当前状态的细节信息。当然这都是理论上要求的。
下面去实现,首先安装这个库 AspNetCoreRateLimit (https://github.com/stefanprodan/AspNetCoreRateLimit):
首先在Startup的ConfigureServices里面注册,用到了MemoryCache:
这里配置的是IP限制,它允许有很多规则,这里我只用了一个:针对所有的资源,每5分钟最多3次请求。
现在,我需要注册一个策略存储和速率限制计数器的存储,这两个是被中间件使用。所以还需要注册这两个服务:
这里都使用的是Singleton单例,因为我们需要的是针对全局的请求来做操作。
接下来要在管道里添加中间件,它应该放在靠前的位置,在日志和异常之后:
测试,发送一个请求看结果:
可以看到5分钟内还剩下两次请求的配额。限制重置的时间大约在5分钟之后。
发送请求超限之后,就会返回429:
Retry-After提示了再过294秒后可以再试试。。。
而响应的body是这样提示的:
我们再组合几个其它的规则:
现在允许5分钟10次请求,但是每10秒钟最多只能有两次请求。
第一次请求后:
5分钟内还剩9次,然后我10秒内连续发送两次请求,然后再发送一次请求:
这时超出了限制,Header里:
提示6秒后可以重试, 6秒后再次发送请求:
这个库还是挺灵活强大的,更多功能还需要看官方文档。
API 文档
业界通常会使用Swagger OpenAPI来对RESTful API进行格式化描述,而Swagger OpenAPI的当前版本是v3.
ASP.NET Core有一个第三方库Swashbuckle,它支持Swagger,但是只支持版本2,版本2有个重要的缺陷就是不支持Action重载,之前HATEOAS的文章里提到过我们需要使用这种重载。所以Swashbuckle暂时并不是完全合适,所以我就不装它了。
就暂时不弄自动文档了。。。
单元测试
需要使用到xUnit和Moq,这里不介绍了。
关于xUnit,我写过几篇文章,有兴趣可以参考下:
Moq的文章博客园应该有,如果需要的话,我可以写一下。
其它
其它可能需要了解的包括:POSTMAN/Newman自动化测试,CI,CD,GraphQL等等。我就不介绍了
这个系列文章就到这了。
源码(我还需要整理一下源码,现在有点乱):https://github.com/solenovex/ASP.NET-Core-2.0-RESTful-API-Tutorial