发布 | 才云 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 服务:
其中,Envoy 中 ratelimit filter 又包含:
- 配置 ratelimit service
- 启用 ratelimit filter
Envoy ratelimit service 配置
限速服务配置描述的是 Envoy 使用的全局限速服务,Envoy 需要与该全局限速服务通信,从而做出全局速率限制的决定。如果 Envoy 没有配置全局限速服务,将使用“NULL”限速服务,当 Envoy 使用“NULL”限速服务做出限速决定的时候,“NULL”限速服务总是返回 OK,表示仍然没有超过限制,实际上就是不限速。
Envoy ratelimit service 配置说明:
配置举例:
Envoy ratelimit filter 配置
外部限速服务
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 的定义如下:
ratelimit service client 定义了 ShouldRateLimit 方法,而该方法将调用 ratelimit service server 的 ShouldRateLimit 方法:
- RateLimitServiceServer
RateLimitServiceServer 的定义如下: