envoy实现_微服务之服务治理:Envoy 全局 gRPC 限速服务 lyft/ratelimit 详解

102bfdc3e977466b9206b9e500eea2ec.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

其中,Envoy 中 ratelimit filter 又包含:

  • 配置 ratelimit service
  • 启用 ratelimit filter

Envoy ratelimit service 配置

限速服务配置描述的是 Envoy 使用的全局限速服务,Envoy 需要与该全局限速服务通信,从而做出全局速率限制的决定。如果 Envoy 没有配置全局限速服务,将使用“NULL”限速服务,当 Envoy 使用“NULL”限速服务做出限速决定的时候,“NULL”限速服务总是返回 OK,表示仍然没有超过限制,实际上就是不限速。

Envoy ratelimit service 配置说明:

1d5dc8e4ce7e4fc466741810bb8228fe.png

配置举例:

622696dce4552ec0056d5092c99b2421.png

Envoy ratelimit filter 配置

81ef714cacbe9d986a51efa85878a5ec.png

外部限速服务

Envoy 对 ratelimit service 的规定

ratelimit service client 和 server 的描述请见github.com/envoyproxy/go-control-plane/envoy/service/ratelimit/v2/rls.pb.goenvoyproxy/go-control-plane/envoy/service/ratelimit/v2/rls.proto

  • RateLimitServiceClient

RateLimitServiceClient 的定义如下:

393aeee01ed2317b5f4f8e293f30001a.png

ratelimit service client 定义了 ShouldRateLimit 方法,而该方法将调用 ratelimit service server 的 ShouldRateLimit 方法:

bd51aee69762d571d45ebc90f3cf73dd.png
  • RateLimitServiceServer

RateLimitServiceServer 的定义如下:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值