限流是网关代理的核心能力之一,Nginx 和 Envoy 都有多种限流机制,来应对不同场景的限流需求
准备挖一个新坑,系列性的介绍 Envoy 的各种限流策略,大致按照这个思路:
- 功能介绍
- 核心代码实现
- 与 Nginx 对比
本文作为开头,先水一篇,来点概览性的介绍 ^_^
限制对象
从限制的对象来说,限流分为三种:
连接,包括:
新建连接频率
TLS 握手频率
并发连接数量
请求
一般是请求速率
带宽
包括单连接级,和某个范围聚合的
限流生效范围
从限流策略的生效范围来说,又分为两种
本地限流
也就是网关代理的单机级别,因为不需要远程通讯,执行效率最高,是很常见的一种方式,不过依赖流量在各个网关实例上相对平均
全局限流
跨越网关单机,全局级的限流,因为依赖远程通讯,执行效率会低一些,但是限流更准确
限流用途
限流有两类用途:
保护上游后端
因为上游后端的服务能力是有上限的,保证转发给后端的请求量,在后端的服务能力之内,从而保证服务的稳定,不至于产生过载/雪崩,导致服务不可用
防 CC 攻击
在对公网服务的网关中,很常规的保护机制,因为公网的流量可以认为是不授信的,而且恶意请求也是经常会发生的事情
Envoy vs Nginx
Nginx 开源已经 20 年了,Envoy 也开源 8 年了,年头都不算小了
我的个人观点,各有优劣势,也都有不够完善的地方,具体的细节,后面我们慢慢分析
在我看来,很大的一个区别是:
Nginx 作为成熟的南北向网关,在防 CC 攻击这块是更成熟的,Envoy 虽然也有用于南北向网关,不过,更多是在东西向网关,在防 CC 攻击这块,是明显更弱的
比如,防 CC 攻击,最常见的的策略是,针对每个 IP 限流,Envoy 还是不支持的(严谨的说,是官方还没有,第三方插件还是可以搞的)。因为在内网调用中,异常的调用来源,都是内部服务,可以追溯到应用 owner 来背锅的
如果是来自公网的异常调用,是很难找到攻击者来背锅的,这就必须依赖网关来做好基础防护了