前言
限流这层按说是应该在网关那做的,这里为了学习go kit暂时放在这里
在middleware/rate.go使用gokit的endpointMiddleWare定义一个限流中间件,在main函数里面将要限流的接口用这个函数装饰一下,这个接口就能实现限流相关功能,本项目地址: github地址
1.限流原理
常见的限流方法有令牌桶和漏桶
- 令牌桶
令牌桶算法的原理是系统会以一个恒定的速度往桶里放入令牌,而如果请求需要被处理,则需要先从桶里获取一个令牌,当桶里没有令牌可取时,则拒绝服务。 - 漏桶
漏桶算法思路很简单,水(请求)先进入到漏桶里,漏桶以一定的速度出水(接口有响应速率),当水流入速度过大会直接溢出(访问频率超过接口响应速率),然后就拒绝请求,可以看出漏桶算法能强行限制数据的传输速率。 - 对比
漏桶的漏出速率是固定的参数,所以即使网络中不存在资源冲突(没有发生拥塞),漏桶算法也不能使流突发(burst)到端口速率,因此,漏桶算法对于存在突发特性的流量来说缺乏效率。令牌桶算法用来控制发送到网络上的数据的数目,并允许突发数据的发送,对于不稳定情况下的流量有一定的兼容性。本文使用更为常见的令牌桶算法进行限流。
2. 创建限流器
在middleware/rate.go使用gokit的endpointMiddleWare定义一个限流中间