# 微服务-限流

132 阅读3分钟

微服务-数据库

学习内容

微服务架构下使用数据库的最佳实践。 包括数据库部署、数据迁移、数据备份策略等方面。 推荐阅读资料:Seata微服务架构下数据分布式事务和一致性

微服务-监控与日志

学习内容

如何使用容器构建环境、实现安全性和可扩展性。   推荐阅读资料:Prometheus监控及Grafana可视化;(2)ELK日志收集系统;

微服务-网关

学习内容

APIGateWay,Zuul 推荐阅读资料:(1)深度剖析Spring  Cloud  源码与实战;(2)深入浅出JHipster

微服务-服务治理

学习内容

服务的注册,发现。服务网关,负载均衡,熔断,限流,链路追踪 推荐资料:Spring  Cloud微服务架构开发权威指南

微服务-限流

限流的定义

指定应用服务器的请求频次,用以防止因请求数量过大,而导致服务宕机。

限流的算法

固定窗体|计数器算法

系统维护一个计数器,记录单位时间内请求的次数,当请求次数大于设定的阈值时,拒绝请求。

滑动窗口

滑动时间窗口算法是将请求量限制在一个滑动的时间窗口内,滑动窗口的长度可以动态调整。相对于固定时间窗口算法,滑动时间窗口算法可以更灵活地适应流量的变化。

漏斗算法

请求按照一定的速率进行处理。当请求的输入量大于消费请求的速率,导致漏斗的容量满载时,开启拒绝策略。

令牌桶算法

令牌桶算法是将请求按照一定速率发放令牌,当请求到达时,只有当有可用令牌时才能继续处理,否则将被拒绝或者延迟处理。相对于固定时间窗口算法和滑动时间窗口算法,令牌桶算法能够更加平滑地控制流量。

限流实现的方式

配置级

nginx 中配置限流

  1. limit_conn_zone 模块  - 限制同一IP地址并发连接数。
    http{
      # 针对客户端地址,进行连接数限制
      limit_conn_zone $binary_remote_addr zone=perip:10m;
      # 针对域名,进行连接数限制
      limit_conn_zone $server_name zone=perserver:10m;
      limit_conn_log_level error;
      limit_conn_status 503;

      server {
          # 每个IP仅允许发起10个连接
          limit_conn perip 10;
          # 每个域名仅允许发起100个连接
          limit_conn perserver 100;
      }
  }
  1. limit_request 模块 - 限制同一 IP 某段时间的访问量。 请求速率的限制

    01 http {
    02     limit_req_zone$binary_remote_addr zone=mylimit:10m rate=10r/s;
    03   
    04     server {
    05         location /test/ {
    06             limit_reqzone=mylimit;
    07    
    08             proxy_pass http://api;
    09         }
    10     }
    11 }
    

    配置说明

    1. 第02 行声明限制请求域
    • 1.1, binary_remote_addr 客户端的IP 的二进制表示
    • 1.2, zone 限制域名称为myLimit 设定内存大小为10m。依据经验 1m 可存储16000 个IP,则10M 可存储160000个客户端IP
    • 1.3, rate= 10r/s 对于任意的客户端IP 限制其请求速率为 每秒10次请求
    1. 第 06 行应用02 行定义的限流策略,应用于具体的请求 http://api
    2. 在限流策略中也可按需配置峰值
      limit_reqzone=mylimit burst=20 在06行追加关键字 burst 配置其请求峰值
  2. core 模块提供 - limit_rate 限制同一 IP 流量。

并发链接数的限制

代码级