文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Aeraki系列:如何设置本地限流规则

2024-12-02 09:57

关注

Aeraki 可以帮助你在服务网格中管理任何七层协议。目前 Aeraki 已经支持了 Dubbo、Thrit、Redis 等开源协议。你还可以使用 Aeraki 的 MetaProtocol 协议扩展框架来管理私有协议的七层流量。

本系列教程将介绍如何通过 Aeraki 来在服务网格中为 Dubbo、Thrift 等协议的服务提供七层流量路由、本地限流、全局限流,以及如何基于 Aeraki Protocol 快速开发一个自定义协议,并在 Istio 服务网格中对采用自定义协议的服务进行管理。

本篇教程介绍如何利用 Areaki 提供的 MetaRouter CRD 资源对基于 MetaProtocol 开发的应用协议设置本地限流规则。

安装示例程序

如果你还没有安装示例程序,请参照 快速开始(https://www.aeraki.net/zh/docs/v1.0/quickstart/) 安装 Aeraki,Istio 及示例程序。

安装完成后,可以看到集群中增加了下面两个 NS,两个 NS 中分别安装了基于 MetaProtocol 实现的 Dubbo 和 Thrift 协议的示例程序。你可以选用任何一个程序进行测试。

  1. ➜  ~ kubectl get ns|grep meta 
  2. meta-dubbo        Active   16m 
  3. meta-thrift       Active   16m 

Aeraki 的限流规则设计直观而灵活,既支持对一个服务的所有入向请求进行限流,也支持按照不同的条件对一个服务器的请求进行细粒度的限流控制。

对服务的所有入向请求进行限流

  1. kubectl apply -f- <
  2. apiVersion: metaprotocol.aeraki.io/v1alpha1 
  3. kind: MetaRouter 
  4. metadata: 
  5.   name: test-metaprotocol-thrift-route 
  6.   namespace: meta-thrift 
  7. spec: 
  8.   hosts: 
  9.   - thrift-sample-server.meta-thrift.svc.cluster.local 
  10.   localRateLimit: 
  11.     tokenBucket: 
  12.       fillInterval: 60s 
  13.       maxTokens: 2 
  14.       tokensPerFill: 2 
  15. EOF 

备注:因为本地限流是在一个服务实例上进行处理的,因此当服务有多个实例,实际的限流效果为限流数量乘以实例数量。

使用 aerakictl 命令来查看客户端的应用日志,可以看到客户端每分钟只能成功执行 4 次请求(有两个服务实例,每个服务实例限流为每分钟 2 次):

  1. ➜  ~ aerakictl_app_log client meta-thrift -f --tail 10 
  2. Hello Aeraki, response from thrift-sample-server-v1-5c8476684-842l6/172.17.0.40 
  3. Hello Aeraki, response from thrift-sample-server-v2-6d5bcc885-hpx7n/172.17.0.41 
  4. Hello Aeraki, response from thrift-sample-server-v1-5c8476684-842l6/172.17.0.40 
  5. Hello Aeraki, response from thrift-sample-server-v2-6d5bcc885-hpx7n/172.17.0.41 
  6. org.apache.thrift.TApplicationException: meta protocol local rate limit: request '5' has been rate limited 
  7.         at org.apache.thrift.TServiceClient.receiveBase(TServiceClient.java:79) 
  8.         at org.aeraki.HelloService$Client.recv_sayHello(HelloService.java:61) 
  9.         at org.aeraki.HelloService$Client.sayHello(HelloService.java:48) 
  10.         at org.aeraki.HelloClient.main(HelloClient.java:44) 
  11. Connected to thrift-sample-server 
  12. org.apache.thrift.TApplicationException: meta protocol local rate limit: request '1' has been rate limited 
  13. ... 

按条件对服务的入向请求进限流

Aeraki 支持按照条件为服务设置多个限流规则,以满足细粒度的限流要求。例如按照用户或者对接口对请求进行分组,并对每个分组设置不同的限流规则。

分组限流的匹配条件和路由匹配条件相同,任何可以从请求数据包中提取出来的属性都可以用于限流规则的匹配条件。

例如下面的规则为 sayHello 和 ping 两个接口分别设置了不同的限流条件:

  1. apiVersion: metaprotocol.aeraki.io/v1alpha1 
  2. kind: MetaRouter 
  3. metadata: 
  4.   name: test-metaprotocol-thrift-route 
  5.   namespace: meta-thrift 
  6. spec: 
  7.   hosts: 
  8.   - thrift-sample-server.meta-thrift.svc.cluster.local 
  9.   localRateLimit: 
  10.     conditions: 
  11.     - match: 
  12.         attributes: 
  13.           method: 
  14.             exact: sayHello 
  15.       tokenBucket: 
  16.         fillInterval: 60s 
  17.         maxTokens: 10 
  18.         tokensPerFill: 10 
  19.     - match: 
  20.         attributes: 
  21.           method: 
  22.             exact: ping 
  23.       tokenBucket: 
  24.         fillInterval: 60s 
  25.         maxTokens: 100 
  26.         tokensPerFill: 100 

同时设置按服务和按条件的限流规则

可以同时设置服务粒度的限流规则和按照条件的限流规则,这适用于需要对一个服务的所有请求设置一个整体的限流规则,同时又需要对某一组或者几组请求设置例外的情况。

例如下面的限流规则为服务设置了一个 1000 条/分钟的整体限流规则,同时单独为 ping 接口设置了 100 条/分钟的限流条件。

  1. apiVersion: metaprotocol.aeraki.io/v1alpha1 
  2. kind: MetaRouter 
  3. metadata: 
  4.   name: test-metaprotocol-thrift-route 
  5.   namespace: meta-thrift 
  6. spec: 
  7.   hosts: 
  8.   - thrift-sample-server.meta-thrift.svc.cluster.local 
  9.   localRateLimit: 
  10.     tokenBucket: 
  11.       fillInterval: 60s 
  12.       maxTokens: 1000 
  13.       tokensPerFill: 1000 
  14.     conditions: 
  15.     - match: 
  16.         attributes: 
  17.           method: 
  18.             exact: ping 
  19.       tokenBucket: 
  20.         fillInterval: 60s 
  21.         maxTokens: 100 
  22.         tokensPerFill: 100 

理解原理

Aeraki 向 Sidecar Proxy 下发的配置中为服务对应的 Listener 设置了 MetaProtocol Proxy,配置中设置了 local rate limit filter。

Aeraki 会将 MetaRouter 中配置的限流规则翻译为local rate limit filter 的限流配置,通过 Aeraki 下发给 MetaProtocol Proxy。

可以通过下面的命令查看服务的 sidecar proxy 的配置:

  1. aerakictl_sidecar_config server-v1 meta-thrift |fx 

其中 Thrift 服务的 Inbound Listener 中的 MetaProtocol Proxy 配置如下所示:

  1.  "name""envoy.filters.network.meta_protocol_proxy"
  2.  "typed_config": { 
  3.   "@type""type.googleapis.com/udpa.type.v1.TypedStruct"
  4.   "type_url""type.googleapis.com/aeraki.meta_protocol_proxy.v1alpha.MetaProtocolProxy"
  5.   "value": { 
  6.    "stat_prefix""inbound|9090||"
  7.    "application_protocol""thrift"
  8.    "route_config": { 
  9.     "name""inbound|9090||"
  10.     "routes": [ 
  11.      { 
  12.       "route": { 
  13.        "cluster""inbound|9090||" 
  14.       } 
  15.      } 
  16.     ] 
  17.    }, 
  18.    "codec": { 
  19.     "name""aeraki.meta_protocol.codec.thrift" 
  20.    }, 
  21.    "meta_protocol_filters": [ 
  22.     { 
  23.      "name""aeraki.meta_protocol.filters.local_ratelimit"
  24.      "config": { 
  25.       "@type""type.googleapis.com/aeraki.meta_protocol_proxy.filters.local_ratelimit.v1alpha.LocalRateLimit"
  26.       "stat_prefix""thrift-sample-server.meta-thrift.svc.cluster.local"
  27.       "token_bucket": { 
  28.        "max_tokens": 2, 
  29.        "tokens_per_fill": 2, 
  30.        "fill_interval""60s" 
  31.       } 
  32.      } 
  33.     }, 
  34.     { 
  35.      "name""aeraki.meta_protocol.filters.router" 
  36.     } 
  37.    ] 
  38.   } 
  39.  } 

 

来源:赵化冰内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯