envoy与ratelimit对接需要完成两步,1 启用ratelimit 过滤器,2 配置触发条件。

一、启用ratelimit 过滤器

envoy要与ratelimit服务对接,需要在lds的http_filter配置上启用ratelimit filter,启用方式如下

 1 http_filters:
 2                   - name: envoy.filters.http.ratelimit
 3                     typed_config:
 4                       "@type": type.googleapis.com/envoy.extensions.filters.http.ratelimit.v3.RateLimit
 5                       domain: rl
 6                       request_type: external
 7                       stage: 0
 8                       rate_limited_as_resource_exhausted: true
 9                       failure_mode_deny: false
10                       enable_x_ratelimit_headers: DRAFT_VERSION_03
11                       rate_limit_service:
12                         grpc_service:
13                           envoy_grpc:
14                             cluster_name: ratelimit
15                         transport_api_version: V3
16                   - name: envoy.filters.http.router
17                     typed_config:
18                       "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router

对于七层协议,router filter一定要放在最后!

添加限流过滤器,指定限流服务器、domain、request_type
domain 与限流服务中定义的domain 保持一致,不一致不会报错,限流配置会失效。
request_type: 什么类型的请求使用限流服务,支持的配置 internal、external、both
判断规则,请求头中x-envoy-internal为true 则请求类型为internal,如果request_type 设置为external则不应用限流,反之亦然。
当request_type设置为both时 所有请求都应用限流(不一定触发,后面还有触发设置)
enableXRatelimitHeaders: 启用限流响应头类型,即当请求被限流后,envoy网关会在响应头中添加标头
X-RateLimit-Limit-:指示当前时间窗口中与客户端关联的请求配额,后跟配额策略的描述,例如:10, 10;w=1;name="per-ip", 1000;w=3600
X-RateLimit-Remaining-:当前时间窗口内剩余请求数量
X-RateLimit_Rest-: 限流重置剩余秒

完整配置如下图所示

二、配置触发规则

 1  - match:
 2       prefix: /test/testlimit/
 3     route:
 4       cluster: k8s_proxy
 5       rateLimits:
 6         - actions:
 7             - requestHeaders:
 8                 headerName: :path
 9                 descriptorKey: abc
10         - actions:
11             - requestHeaders:
12                 headerName: :path
13                 descriptorKey: minute100
14         - actions:  
15             - requestHeaders:
16                 headerName: userid
17                 descriptorKey: userid
18             - requestHeaders:
19                 headerName: :path
20                 descriptorKey: path
21         - actions:
22             - requestHeaders:
23                 headerName: userid
24                 descriptorKey: useridminute
25             - requestHeaders:
26                 headerName: :path
27                 descriptorKey: path

在vhds的路由配置中添加如上配置

该配置设置在路由层面,详细描述限流触发规则,每个actions 是同级别的代表它们同时生效。

actions内部是规则链,顺序很重要,例如示例中的 第三个actions 它触发的规则是 userid_useridvalue_path_pathvalue

参考地址 https://www.envoyproxy.io/docs/envoy/v1.28.0/api-v3/config/route/v3/route_components.proto#envoy-v3-api-msg-config-route-v3-ratelimit

特别备注

1. 对于每个请求,如果满足限流规则,envoy会将触发的key一次性传递给限流服务。
2. 如果限流服务不可用,则envoy直接放过请求,不做限流
3. 触发规则的统计是累加的,如果要放宽限制,要考虑累加的超限数量。 例如 10次/小时,如果超限了,客户端仍旧访问了100次即当前小时内该接口/服务被访问了110次/小时,业务找运维放宽限制至100次/小时,这个时候客户端访问依旧超限

posted @ 2024-04-02 18:52 王鹏翀 阅读(226) 评论(0) 推荐(0) 编辑
摘要: 直接采用官方提供的Docker镜像进行启动 编写docker-compose.yaml 文件 version: "3" services: ratelimit: image: envoyproxy/ratelimit:19f2079f command: /bin/ratelimit ports: - 阅读全文
posted @ 2024-03-07 19:58 王鹏翀 阅读(75) 评论(0) 推荐(0) 编辑
摘要: 23年的时候公司因调用企业微信接口超限,导致业务问题。架构组经过协商后决定上一个限流服务。 限流这块自然而然就落到我负责的网关这块,小公司我一个人负责api网关这块。 之前基于istio 给公司上线了一个本地的限流(我给公司开发了一个devops管理工具,可以用来管理k8s、istio、jenkin 阅读全文
posted @ 2024-03-01 16:16 王鹏翀 阅读(157) 评论(0) 推荐(0) 编辑
摘要: 在一些业务中,对于客户端发送的请求,需要调用grcp服务来确认是否合规,这个时候可以在入口网关做些统一的处理。 之前写的用go来编写wasm,在编写grpc调用时发现由于tinygo的原因导致无法进行grpc请求,在找了一圈后决定使用proxy-wasm-rust-sdk来完成该部分功能。 一、创建 阅读全文
posted @ 2024-02-01 19:54 王鹏翀 阅读(77) 评论(0) 推荐(0) 编辑
摘要: 一、创建项目 go mod init xxxxxx 二、安装proxy-wasm-go-sdk go get github.com/tetratelabs/proxy-wasm-go-sdk 三、创建main.go 文件 touch main.go 四、编辑代码 1 package main 2 3 阅读全文
posted @ 2023-02-11 12:03 王鹏翀 阅读(579) 评论(0) 推荐(0) 编辑
摘要: - "@type": type.googleapis.com/envoy.config.listener.v3.Listener name: beta.k8s.proxy address: socket_address: address: 0.0.0.0 port_value: 80 filter_ 阅读全文
posted @ 2021-09-04 10:06 王鹏翀 阅读(222) 评论(0) 推荐(0) 编辑
摘要: 昨天写了envoy的lds、cds基于文件系统的动态配置,今天整理一下eds的基于文件系统的动态配置。 resources: - "@type": type.googleapis.com/envoy.config.cluster.v3.Cluster connect_timeout: 1s name 阅读全文
posted @ 2021-08-29 09:38 王鹏翀 阅读(422) 评论(0) 推荐(0) 编辑
摘要: 一、基本概念 XDS、CDS、EDS、LDS、SDS、ADS、RDS、HDS 二、安装 三、动态文件配置 还没找到好的控制平面,为了解决动态更新CDS、LDS配置所以就采用了动态文件配置。 admin: access_log_path: /home/logs/envoy/admin.access.l 阅读全文
posted @ 2021-08-28 13:52 王鹏翀 阅读(536) 评论(0) 推荐(0) 编辑
摘要: 一、安装 我这里直接下载的二进制文件 https://github.com/dapr/dapr/releases/download/v1.3.0/daprd_linux_amd64.tar.gztar zxvf dapr_linux_amd64.tar.gzcp dapr /usr/bin/chmo 阅读全文
posted @ 2021-08-28 11:44 王鹏翀 阅读(759) 评论(0) 推荐(0) 编辑
摘要: 六月份如愿的转入了架构组,先上手搞了个CI服务器,把架构组的几个项目撸到上面去了。效果不错,接着就把其他两个项目组有单元测试的项目撸上去了,在桌子上放了个显示器当大屏用。 因为公司准备进行一个大的系统升级重构,准备上微服务,所以架构组前期的准备工作就是实现微服务的基础设施。 老大给我安排的主要工作就 阅读全文
posted @ 2018-07-24 21:32 王鹏翀 阅读(511) 评论(0) 推荐(0) 编辑
点击右上角即可分享
微信分享提示