样例 apiVersion: traefik.containo.us/v1alpha1 kind: Middleware metadata: name: test-ratelimit spec: rateLimit: period: 1s average: 150 burst: 300 sourceCriterion: ipStrategy: depth: 1 excludedIPs: - 127.0.0.1/32 - 192.168.1.7 requestHeaderName: username requestHost: true 参数说明 均值average average是给定来源所允许的最大速率,默认情况下是每秒的请求数。 该参数的默认值是0,表示没有速率限制。 该速率实际上是用average除以period来定义的。因此,对于低于1 req/s的速率,需要定义一个大于一秒的period。 周期period period与average一起定义了实际的最大速率,例如:r = average / period。 该参数的默认值是1秒。 峰值burst burst是在任意短的同一时间段内允许通过的最大请求数。 该参数的默认值是1。 源规范sourceCriterion SourceCriterion定义了用于将来自公共源的请求分组的标准。优先级顺序是ipStrategy,然后是requestHeaderName,然后是requestHost。 如果未设置,则默认为使用请求的远程地址(remote address)字段(作为ipStrategy)。 sourceCriterion.ipStrategy ipStrategy选项定义两个参数,这些参数设置Traefik如何确定客户端IP:depth和excludedIPs。 ipStrategy.depth depth选项告诉Traefik使用X-Forwarded-For标头,并获取位于depth指定位置(从右开始)的IP。 如果depth大于X-Forwarded-For中IP的总数,则客户端IP将为空。 如果depth的值小于或等于0,则将被忽略。 ipStrategy.excludedIPs excludeedIPs告诉Traefik扫描X-Forwarded-For标头,并选择不在excludedIPs列表中的第一个IP(从右开始)。 如果设置了depth,那么excludedIPs将会被忽略。 sourceCriterion.requestHeaderName 对于给定header具有相同值的请求被分组为来自同一源。 sourceCriterion.requestHost 是否将请求主机视为源。
断路器可保护系统免于将请求堆叠到不正常的服务(导致级联故障)的麻烦。 系统运行状况良好时,电路处于闭合状态(正常运行)。 当系统运行不正常时,电路将断开,并且不再转发请求(而是由后备机制处理)。 为了评估您的系统是否健康,断路器不断监控服务。 CircuitBreaker仅分析将其加入到中间件链之后发生的情况。之前发生的事情对其状态没有影响。 CircuitBreaker仅影响使用它的路由器。不使用CircuitBreaker的路由器将不受其状态的影响。 注意 每个路由器最终将获得其自己的给定断路器的实例。 如果两个不同的路由器引用相同的断路器定义,则它们每个将获得一个实例。这意味着一个断路器可以断开,而另一个断路器保持闭合:它们的状态不共享。 这是预期的行为,我们希望您能够定义使服务正常运行的原因,而不必为每个路由声明断路器。 样例 apiVersion: traefik.containo.us/v1alpha1 kind: Middleware metadata: name: latency-check spec: circuitBreaker: expression: LatencyAtQuantileMS(50.0) > 100 状态描述 断路器有三种可能的状态: 关闭:服务运行正常 打开:后备机制接管了服务 正在恢复:断路器尝试通过逐步向服务发送请求来恢复正常操作 关闭 闭合时,断路器仅收集指标以分析请求的行为。 在指定的时间间隔(checkPeriod),它将评估expression以确定其状态是否必须更改。 打开 打开后,后备机制将在FallbackDuration期间接管正常的服务调用。在此持续时间之后,它将进入恢复状态。 正在恢复 在恢复时,断路器将逐步将请求再次发送到服务(以线性方式恢复RecoveryDuration)。 如果服务在恢复期间失败,则断路器将再次打开。 如果服务在整个恢复期间正常运行,则断路器将返回关闭状态。 参数 触发机制 可以指定一个expression,一旦匹配,该表达式将触发断路器(并应用后备机制而不再调用服务)。 expression可以检查三种不同的指标: 网络错误率,NetworkErrorRatio 状态码比例,ResponseCodeRatio 分位点的延迟(毫秒级别),LatencyAtQuantileMS NetworkErrorRatio 如果希望断路器以30%的网络错误率触发,则表达式将为NetworkErrorRatio() > 0.30。 ResponseCodeRatio 可以根据给定范围的状态码的比率来触发断路器。 ResponseCodeRatio接受四个参数,from,to,dividedByFrom,dividedByTo。 将要计算的操作是sum(to -> from)/ sum(dividedByFrom -> dividedByTo)。 如果sum(dividedByFrom -> dividedByTo)等于0,则ResponseCodeRatio返回0。 from是包括在内,to是唯一的。 例如,如果25%的请求返回5XX状态(在请求中返回的状态码为0到5XX),则ResponseCodeRatio(500,600,0,600) > 0.25表达式将触发断路器。 LatencyAtQuantileMS 当给定比例的请求变得太慢时,可以触发断路器。 例如,当中位数等待时间(分位点50)达到100毫秒(MS)时,表达式LatencyAtQuantileMS(50.0)> 100将触发断路器。指定一个分位点,50表示中位数,即有一半的请求都处于这个状态。 必须提供分位数点的浮点数形式(后跟.0)。 多指标判断 可以在表达式中使用运算符组合多个指标。支持的操作包括:AND(&&),OR(||)。 例如,ResponseCodeRatio(500, 600, 0, 600) > 0.30 || NetworkErrorRatio() > 0.10表示当30%的请求返回5XX状态码或者网络错误率达到10%时触发断路器。 操作符 支持的操作符列表: 大于(>) 大于等于(>=) 小于(<) 小于等于(<=) 等于(=) 不等于(!=) 后备机制 后备机制向客户端返回HTTP 503 Service Unavailable(而不是调用目标服务),无法修改这个值。 检查周期 用于评估expression并确定断路器状态是否必须更改的时间间隔。默认情况下,CheckPeriod为100ms,无法修改这个值。 后备机制运行时长 默认情况下,FallbackDuration是10秒,无法修改这个值。 正在恢复运行时长 恢复模式的持续时间(恢复状态)。 默认情况下,RecoveringDuration是10秒,无法修改这个值。