前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用lyft/ratelimit实现envoy全局限速

使用lyft/ratelimit实现envoy全局限速

作者头像
有点技术
发布2020-07-13 11:19:04
1.3K0
发布2020-07-13 11:19:04
举报
文章被收录于专栏:有点技术有点技术

envoy rate limit介绍

envoy中有以下限速方式:

  • 全局限速

Envoy的全局请求限速服务器,检查是否接受。全局意味着所有代理都将使用一个计数器作为评估请求的基础。每个代理都请求一个上游速率限制服务(在此示例中为Lyfts),该服务将在envoy外部运行以决定请求。

  • 本地限速

本地速率限制计数器在处理请求的单个envoy代理的上下文中运行。这意味着每个代理都跟踪其管理的连接并应用限速策略(即熔断)。最新的版本添加了一个使用自身令牌桶进行本地限速功能

环境准备

安装envoy

代码语言:javascript
复制
brew tap tetratelabs/getenvoy
brew install getenvoy

启动redis

代码语言:javascript
复制
docker run -p 6379:6379 redis

启动上游服务

代码语言:javascript
复制
python -m SimpleHTTPServer 1234

使用lyft/ratelimit进行限速

启动ratelimit

代码语言:javascript
复制
export USE_STATSD=false 
export LOG_LEVEL=debug
export REDIS_SOCKET_TYPE=tcp
export REDIS_URL=localhost:6379 
export RUNTIME_ROOT="./" 
export RUNTIME_SUBDIRECTORY=ratelimit
git clone https://github.com/lyft/ratelimit.git

cat >> config.yaml < EOF
domain: ratelimiter
descriptors:
- key: header_match
  value: lyft-rate-limit
  rate_limit:
    unit: minute
    requests_per_unit: 2
EOF

cd ratelimit
go get -v github.com/Masterminds/glide
glide install
go run src/service_cmd/main.go

启动envoy

代码语言:javascript
复制
cat >> config.yaml < EOF
admin:
  access_log_path: /tmp/admin_access.log
  address:
    socket_address: { address: 127.0.0.1, port_value: 9901 }

static_resources:
  listeners:
  - name: listener_0
    address:
      socket_address: { address: 127.0.0.1, port_value: 10000 }
    filter_chains:
    - filters:
      - name: envoy.http_connection_manager
        typed_config:
          "@type": type.googleapis.com/envoy.config.filter.network.http_connection_manager.v2.HttpConnectionManager
          stat_prefix: ingress_http
          codec_type: AUTO
          route_config:
            name: local_route
            virtual_hosts:
            - name: local_service
              domains: ["ratelimiter"]
              routes:
              - match: { prefix: "/" }
                route: { cluster: some_service }
              rate_limits:
              - actions:
                - header_value_match:
                    descriptor_value: lyft-rate-limit
                    expect_match: false
                    headers:
                    - name: ":path"
                      exact_match: "/"
                stage: 0
          http_filters:
          - name: envoy.rate_limit
            config:
              stage: 0
              domain: "ratelimiter"
              request_type: external
              failure_mode_deny: true
              rate_limit_service:
                grpc_service:
                  envoy_grpc:
                    cluster_name: rate_limit_service
          - name: envoy.local_rate_limit
            config:
              token_bucket:
                max_tokens: 10
                fill_interval: 1s
          - name: envoy.router
  clusters:
  - name: some_service
    connect_timeout: 0.25s
    type: STATIC
    lb_policy: ROUND_ROBIN
    load_assignment:
      cluster_name: some_service
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address:
                address: 127.0.0.1
                port_value: 1234
  - name: rate_limit_service
    connect_timeout: 0.25s
    type: static
    lb_policy: round_robin
    http2_protocol_options: {}
    hosts:
    - socket_address:
        address:  127.0.0.1
        port_value: 8081
EOF

envoy -c config.yaml

验证

前两次正常,第三次发现返回429,限速正常

代码语言:javascript
复制
$ curl -I -H 'HOST: ratelimiter' 127.0.0.1:10000
HTTP/1.1 429 Too Many Requests
x-envoy-ratelimited: true
date: Tue, 14 Jan 2020 07:14:35 GMT
server: envoy
transfer-encoding: chunked
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-01-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 有点技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • envoy rate limit介绍
  • 环境准备
    • 安装envoy
      • 启动redis
        • 启动上游服务
        • 使用lyft/ratelimit进行限速
          • 启动ratelimit
            • 启动envoy
            • 验证
            相关产品与服务
            云数据库 Redis
            腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档