29

Dingo Api 的限流在Laravel的限流基础上做了哪些修改?

 4 years ago
source link: https://www.tuicool.com/articles/JNJ7vea
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

今天看文档的时候看到 Laravel的 节流限速 (throttling) 。网络上搜索,又看到了Dingo 的节流限速的文档。因此查看Laravel 与Dingo的源码,对比两者之间的相同点与不同点。

相同点

两者都是通过中间件处理请求限流

处理方式都是记录缓存key,设置过期时间,在没过期的时候自增,直到超出限制,或key过期

Laravel 限流中间件 Illuminate\Routing\Middleware\ThrottleRequests 640?wx_fmt=jpeg

Dingo 限流中间件 Dingo\Api\Http\Middleware\RateLimit

640?wx_fmt=jpeg

不同点

从上面两个中间件的代码可以看出,Laravel只有再没有超过限制的情况下才会对缓存进行+1操作,而Dingo是先操作再进行判断

Dingo 限制key以请求路径hash为前缀,默认以用户ip作为key。 因此可以实现对用户每个url的限制,限制粒度更细

Dingo\Api\Http\RateLimit\Handler 代码如下:

640?wx_fmt=jpeg

Laravel 中使用用户信息或域名+ip作为限制key,限制粒度只在用户级别

Illuminate\Routing\Middleware\ThrottleRequests 代码如下:

640?wx_fmt=jpeg

Dingo支持修改限制key,Laravel默认没有支持修改方法

Dingo支持添加多个限制规则,逻辑上使用限制数最小的进行判断。

假设有两个限制器,且都符合限制条件。一个限制1分钟10次,另一个限制2分钟15次,会使用1分钟1次的进行限制判断。

Dingo 返回了过期限制到期时间,Laravel默认不返回限制到期时间

Dingo\Api\Http\RateLimit\Handler 获取限制最少的限制器代码如下:

640?wx_fmt=jpeg

Dingo\Api\Http\RateLimit\Handler 获取设置的返回头信息代码如下:

640?wx_fmt=jpeg

Illuminate\Routing\Middleware\ThrottleRequests 获取设置的返回头信息代码如下:

640?wx_fmt=jpeg

总结

两者实现原理相同,只是在细节上Dingo的功能更加强大。Dingo 限制粒度 更细 ,限制规则上,可扩展性,灵活性都比Laravel强。

两者都是通过中间件处理请求限流。 处理方式都是记录缓存key,设置过期时间,在没过期的时候自增,直到超出限制,或key过期。

Laravel只有再没有超过限制的情况下才会对缓存进行+1操作,而Dingo是先操作再进行判断; Dingo 限制key以请求路径hash为前缀,默认以用户ip作为key,限制粒度更细。Dingo支持修改限制key,Laravel默认没有支持修改方法;Dingo支持添加多个限制规则。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK