![102bfdc3e977466b9206b9e500eea2ec.png](https://i-blog.csdnimg.cn/blog_migrate/5113b57190fd058ce13353fde86c6c3e.png)
发布 | 才云 Caicloud
作者 | Keon(才云首席客户成功官)
应用微服务架构后,你是否遇到过这些问题? 后台资源被大量请求淹没耗尽、 客户端持续发起请求直至服务宕机、 分布式系统因超时而雪崩……随着微服务实施水平的不断深化,服务治理已经成为企业关注的一大核心话题。
在这篇文章中,才云科技首席客户成功官 Keon 将基于才云的成功实践,分享 Envoy 如何利用 lyft/ratelimit 实现快速、高性能和可靠的全局速率限制。
Service Mesh 由 Data Panel、Control Panel 两部分组成,虽然目前的 Service Mesh 已经进入了以 Istio、Conduit 为代表的第二代 Control Panel。但是以 Istio 为例,它也没有自己去实现 Data Panel,而是仍然基于 Envoy 做了 Control Panel 来达成目标,可见 Envoy 在 Service Mesh 中地位的重要性。
Envoy 是一款由 Lyft 开源的 L7 代理和通信总线,目前也是 CNCF 旗下的开源项目,代码托管在 GitHub 上,由 C++ 语言实现,拥有强大的定制化能力——通过其提供的 Filter 机制,Envoy 基本可以对请求转发过程中超过 50% 的流程做定制化。
本文主要分析 Envoy ratelimit filter 机制和 lyft/ratelimit 提供的 gRPC 服务。
gRPC ratelimit service
Envoy 可以集成一个全局的 gRPC ratelimit 服务。Envoy ratelimit 服务支持如下两个特性:
- 网络级别的速率限制过滤器:ratelimit 过滤器安装在 listener 上,Envoy 将为每个新连接调用 ratelimit 限速服务,这样能限制每秒该 listener 上建立的连接数
- HTTP 级别速率限制过滤器:该过滤器安装在服务路由上,该过滤器可以限制到目标 upstream cluster 的所有请求速率,也可以限制不同来源的到目标 upstream cluster 的请求速率
下面描述的 external ratelimit 服务是基于 lyft/ratelimit 进行的。
ratelimit 架构
如果调用限速服务发生错误或限速服务返回了一个错误,并且 failure_mode_deny 设置为 true,则返回 500 状态码。
ratelimit 架构包含两部分,一部分是 Envoy 中 ratelimit filter,一部分是 ratelimit gRPC 服务:
![a45be7087627cd7af41e3e5d07c13df7.png](https://i-blog.csdnimg.cn/blog_migrate/b34244fc32ab9105b8d4b82c51e5afd0.jpeg)
其中,Envoy 中 ratelimit filter 又包含:
- 配置 ratelimit service
- 启用 ratelimit filter
Envoy ratelimit service 配置
限速服务配置描述的是 Envoy 使用的全局限速服务,Envoy 需要与该全局限速服务通信,从而做出全局速率限制的决定。如果 Envoy 没有配置全局限速服务,将使用“NULL”限速服务,当 Envoy 使用“NULL”限速服务做出限速决定的时候,“NULL”限速服务总是返回 OK,表示仍然没有超过限制,实际上就是不限速。
Envoy ratelimit service 配置说明:
![1d5dc8e4ce7e4fc466741810bb8228fe.png](https://i-blog.csdnimg.cn/blog_migrate/6909b338b679bd2e6ae39121de8e9b59.jpeg)
配置举例:
![622696dce4552ec0056d5092c99b2421.png](https://i-blog.csdnimg.cn/blog_migrate/8409cc82ee6d48e2b51034439b6d80fd.jpeg)
Envoy ratelimit filter 配置
![81ef714cacbe9d986a51efa85878a5ec.png](https://i-blog.csdnimg.cn/blog_migrate/a144b91159629e0275c67cdee304fa2c.jpeg)
外部限速服务
Envoy 对 ratelimit service 的规定
ratelimit service client 和 server 的描述请见github.com/envoyproxy/go-control-plane/envoy/service/ratelimit/v2/rls.pb.go
和envoyproxy/go-control-plane/envoy/service/ratelimit/v2/rls.proto
。
- RateLimitServiceClient
RateLimitServiceClient 的定义如下:
![393aeee01ed2317b5f4f8e293f30001a.png](https://i-blog.csdnimg.cn/blog_migrate/a07c648d417dd10d07d82f9da5273e0f.jpeg)
ratelimit service client 定义了 ShouldRateLimit 方法,而该方法将调用 ratelimit service server 的 ShouldRateLimit 方法:
![bd51aee69762d571d45ebc90f3cf73dd.png](https://i-blog.csdnimg.cn/blog_migrate/b6d03894c81782408ab17c1fba8e82a8.jpeg)
- RateLimitServiceServer
RateLimitServiceServer 的定义如下: