什么是限流

限流即限制并发量,限制某一段时间只有指定数量的请求进入后台服务器,遇到流量高峰期或者流量突增时,把流量速率限制在系统所能接受的合理范围之内,不至于让系统被高流量击垮。而Envoy可以通过envoy.filters.http.ratelimit插件实现限流。

限流服务

Envoy实现限流需要依赖限速服务,Envoy官方为我们提供了基于Redis和Memcached的限速服务

https://github.com/envoyproxy/ratelimit

我们将其从github下载到本地,来看看其中的docker-compose.yaml的工作模式,我们注意到其中的example文件挂载目录

并且其中还制定了配置目录是example/ratelimit

我们来看看config.yaml和example.yaml的内容,发现其中定义了domain和描述符

所以根据文档的提示,我们在envoy配置中应该命中这些描述符才有效,下面我们通过docker-compose up启动ratelimit服务,启动之前我们需要调整docker-compose.yaml,需要将go mod代理指向国内的代理

启动ratelimit服务

配置Envoy

配置envoy之前我们需要注意一下几点

  • 需要用到envoy.filters.http.ratelimit过滤器
  • 指定其domain为example.yaml中对应的rl
  • 需要为其指定ratelimit服务的cluste
  • 需要为route配置限速规则

具体配置如下

admin:
address:
socket_address:
protocol: TCP
address: 0.0.0.0
port_value: 9902
static_resources:
listeners:
- name: listener_0
address:
socket_address:
protocol: TCP
address: 0.0.0.0
port_value: 10000
filter_chains:
- filters:
- name: envoy.filters.network.http_connection_manager
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
codec_type: AUTO
stat_prefix: ingress
http_filters:
- name: envoy.filters.http.ratelimit
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.http.ratelimit.v3.RateLimit
domain: rl
request_type: both
stage: 0
rate_limited_as_resource_exhausted: true
failure_mode_deny: false
enable_x_ratelimit_headers: DRAFT_VERSION_03
rate_limit_service:
grpc_service:
envoy_grpc:
cluster_name: ratelimit
transport_api_version: V3
- name: envoy.filters.http.router
typed_config: {}
route_config:
name: route
virtual_hosts:
- name: local_service
domains: ["*"]
routes:
- match:
prefix: "/"
route:
cluster: service_envoyproxy_io
rate_limits:
- actions:
- request_headers:
header_name: "foo"
descriptor_key: "foo"

clusters:
- name: ratelimit
type: STRICT_DNS
connect_timeout: 1s
lb_policy: ROUND_ROBIN
protocol_selection: USE_CONFIGURED_PROTOCOL
http2_protocol_options: {}
load_assignment:
cluster_name: ratelimit
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: 192.168.43.94
port_value: 8081
- name: service_envoyproxy_io
connect_timeout: 30s
type: strict_dns
# Comment out the following line to test on v6 networks
# dns_lookup_family: V4_ONLY
lb_policy: ROUND_ROBIN
load_assignment:
cluster_name: service_envoyproxy_io
endpoints:
- lb_endpoints:
- endpoint:
address:
socket_address:
address: 192.168.43.94
port_value: 5000

启动Envoy

docker run --rm -it -p 9902:9902 -p 10000:10000 -v D:/gateway/envoy/config/static/:/etc/envoy/ -v D:/gateway/envoy/logs:/logs envoyproxy/envoy-dev  -c /etc/envoy/envoy-ratelimit.yaml

测试限速

调用接口http://192.168.43.94:10000/Name,第三次的时候就会触发429超限请求

我们看看example/ratelimit/config/example.yaml,可以看到每分钟只允许2次请求,至此限速验证完成!!

最新文章

  1. MongoDB与衍生版的TokuMX对比
  2. mob免费短信验证码安卓SDK调用方法
  3. JQuery 表单校验插件 validate 使用纪录
  4. Mac 安装 home Brew以及 XCTool的过程记录
  5. Nginx upstream 长连接
  6. hrb 2134 素数
  7. Linux Screen命令使用
  8. 【剑指offer】面试题39:二叉树的深度
  9. Scala基础类型与操作
  10. role 'PLUSTRACE' does not exist
  11. Struts2第十二篇【模型驱动】
  12. svn 常用命令行
  13. 转:Xming + PuTTY 在Windows下远程Linux主机使用图形界面的程序
  14. WinCE系统声音定制
  15. Cookie Session 与Token
  16. Java 标记接口
  17. C#设计模式之6:抽象工厂模式
  18. oldboys21day03
  19. 存储开头结尾使用begin tran,rollback tran作用?
  20. Constructor构造方法

热门文章

  1. Docker系列(17)- MySQL同步数据
  2. javascript 自定义事件 发布-订阅 模式 Event
  3. HTML在网页上不能显示图片问题
  4. P4859-已经没有什么好害怕的了【容斥,dp】
  5. P7444-「EZEC-7」猜排列【dp】
  6. 用Fiddler抓不到https的包?因为你姿势不对!往这看!
  7. 老板说,你给我1分钟内下载1000张图片!So,easy!
  8. 深入浅出WPF-06.Binding(绑定)02
  9. PyTorch中的Batch Normalization
  10. T-SQL——关于SQL打开Excel文件