diff --git a/docs/zh/document/plugin/flowcontrol.md b/docs/zh/document/plugin/flowcontrol.md index 96440c179..f40f3d2e4 100644 --- a/docs/zh/document/plugin/flowcontrol.md +++ b/docs/zh/document/plugin/flowcontrol.md @@ -1,266 +1,452 @@ # 流控 - -本文介绍如何使用[流控插件](https://github.com/huaweicloud/Sermant/tree/develop/sermant-plugins/sermant-flowcontrol)。 +本文介绍[流控插件](https://github.com/huaweicloud/Sermant/tree/develop/sermant-plugins/sermant-flowcontrol)及其使用方式。 ## 功能介绍 -流控插件基于[resilience4j](https://github.com/resilience4j) 框架,以"流量"切入点,实现"非侵入式"流量控制;当前支持**限流**、**熔断**、**隔离仓**、**错误注入**与**重试**、**熔断指标采集**、**系统规则**、**系统自适应**流控能力,并且支持配置中心动态配置规则,实时生效。 - -- **限流**:对指定接口限制1S秒内通过的QPS,当1S内流量超过指定阈值,将触发流控,限制请求流量,在客户端和服务端都可生效。 -- **熔断**:对指定接口配置熔断策略,可从单位统计时间窗口内的错误率或者慢请求率进行统计,当请求错误率或者慢请求率达到指定比例阈值,即触发熔断,在时间窗口重置前,隔离所有请求,在客户端和服务端都可生效。 -- **隔离仓**:对指定接口设置允许的最大并发量,当超过最大并发量时,对并发流量进行排队等待控制,等待超过最大等待时间则拒绝调用,避免瞬时并发流量过大导致服务崩溃,在客户端和服务端都可生效。 -- **重试**:当服务遇到非致命的错误时,可以通过重试的方式避免服务的最终失败。 -- **错误注入**:指在服务运行时,给指定服务配置错误注入策略,在客户端访问目标服务前,以指定策略模式返回。该策略多用于减少目标服务的访问负载,可作为降级的一种措施。 -- **熔断指标采集**:当服务配置了熔断策略后,插件会异步采集熔断的相关信息,并通过[监控插件](./monitor.md)进行指标上报。 -- **系统规则**:在服务运行时,若系统负载,CPU使用率,并发线程数,请求平均响应时间,请求qps任意指标超出阈值,将触发流控,限制请求流量。 -- **系统自适应**:在服务运行时,根据系统当前负载状态,以及过去一段时间内系统数据,对请求进行自适应流控。 - -## 参数配置 +流控插件基于[resilience4j](https://github.com/resilience4j) 框架实现,以"流量"为切入点,实现"非侵入式"流量控制;当前支持[限流](#限流)、[熔断](#熔断)、[隔离](#隔离)、[错误注入](#错误注入)、[重试](#重试)、[系统规则](#系统级流控),并且支持通过配置中心动态下发流控规则,实时生效。 -### Sermant-agent配置 +### 快速开始 +本插件的快速上手使用教程可参考[操作和结果验证](#操作和结果验证)。 -流控插件依赖动态配置中心,需要在Sermant-agent中配置动态配置中心的地址(`dynamic.config.serverAddress`),动态配置中心的类型(`dynamic.config.dynamicConfigType`),具体参考[Sermant-agent使用手册](../user-guide/sermant-agent.md#sermant-agent使用参数配置)。 +## 限流 +**限流能力对指定接口限制1S秒内通过的QPS,当1S内流量超过指定阈值,将触发限流,限制请求流量,在客户端和服务端都可生效。** -### 插件配置 +执行限流策略需要通过配置中心下发流量匹配规则和限流规则,主要分为两步: -流控插件需打开是否开启ServiceComb适配(`flow.control.plugin.useCseRule`),是否开启指标监控(`flow.control.plugin.enable-start-monitor`)等开关,可在`${path}/sermant-agent-x.x.x/agent/pluginPackage/flowcontrol/config/config.yaml`找到插件的配置文件,配置如下所示: +**下发流量匹配规则:** 下发流量匹配规则匹配满足要求的流量。 -```yaml -flow.control.plugin: - useCseRule: false # 是否开启ServiceComb适配 - enable-start-monitor: false # 是否启动指标监控 - enable-system-adaptive: false # 是否开启系统自适应流控,开启此开关需enable-system-rule配置项也开启 - enable-system-rule: false # 是否开启系统规则流控 -``` +**下发限流规则:** 下发限流规则对匹配的流量执行限流策略。 +### 示例 -| 参数键 | 说明 | 默认值 | 是否必须 | -| :---------- | ----------------------- | ----- | ------ | -| useCseRule | 是否开启ServiceComb适配;
**true**:插件根据应用配置,服务配置,自定义标签订阅配置
**false**:插件根据实例服务名进行配置订阅 | true | 是 | -| enable-start-monitor | 是否开启指标监控; **true**:熔断指标数据通过监控插件上传至Prometheus,详情查看[监控插件](./monitor.md) | false | 否 | -| enable-system-adaptive | 是否开启系统自适应流控;
**true**:根据系统负载对请求流量进行自适应流控 | false | 否 | -| enable-system-rule | 是否开启系统规则流控;
**true**:根据流控策略中的系统参数阈值进行流控 | false | 否 | +现有如下场景:在名称为flowcontrol的微服务中,对于API访问路径为/rateLimiting的流量,如果每秒请求数超过2次,将触发限流机制。具体下发的规则如下所示: -> useCseRule说明: Sermant当前支持zookeeper和ServiceComb-kie配置中心,默认采用zookeeper配置中心,若用户使用ServiceComb-kie,则需要设置**useCseRule**配置为**true** +#### 下发流量匹配规则 +为实现上述限流场景,首先下发流量匹配规则来匹配需要执行限流策略的流量。根据动态配置中心的配置模型,流量匹配规则由group、key和content组成,group用来约束流量匹配规则生效的微服务,key用来约束流量匹配规则生效的场景,content为具体的流量匹配规则,其内容如下所示: +* **group:** service=flowcontrol +* **key:** servicecomb.matchGroup.rateLimitingScene +* **content:** +```yaml + # 精确匹配api访问路径为/rateLimiting的流量 + matches: + - apiPath: + exact: /rateLimiting + ``` +流量匹配的更多规则说明请参考[流量匹配规则说明](#流量匹配规则说明), +动态配置的配置模型请参考[动态配置中心配置模型](../user-guide/configuration-center.md#sermant动态配置中心模型)。如何使用不同的动态配置中心请参考:[基于-zookeeper-的配置模型实现](../user-guide/configuration-center.md#基于-zookeeper-的配置模型实现),[基于-nacos-的配置模型实现](../user-guide/configuration-center.md#基于-nacos-的配置模型实现),[基于-servicecomb-kie-的配置模型实现](../user-guide/configuration-center.md#基于-servicecomb-kie-的配置模型实现)。 +> 说明1:流量匹配规则的group由`service=`和`${service.name}`组成,其中`${service.name}`为微服务的名称,由微服务配置文件的`dubbo.application.name`、`spring.applicaton.name`或`application`确定,优先级`dubbo.application.name` > `spring.applicaton.name` > `application`,本示例设定微服务名称为flowcontrol。 + +> 说明2:流量匹配规则的key由前缀`servicecomb.matchGroup`和自定义场景名称组成,本示例设定场景名称为`rateLimitingScene`。流量匹配规则和限流规则的key的自定义场景名称需保持一致,才能对匹配的流量执行限流策略。 +#### 下发限流规则 +下发流量匹配规则后,对匹配的流量执行限流策略还需要下发限流规则。根据动态配置中心的配置模型,限流规则由group、key和content三部分组成,group用来约束限流规则生效的微服务,key用来约束限流规则生效的场景,需和流量匹配规则的场景名称保持一致,content为具体的限流规则,其内容如下所示: +* **group:** service=flowcontrol +* **key:** servicecomb.rateLimiting.rateLimitingScene +* **content:** +```yaml + # 1秒内超过2个请求,则触发限流能力 + limitRefreshPeriod: 1000 + rate: 2 + ``` + 限流配置的更多规则说明请参考[限流规则说明](#限流规则说明),动态配置的配置模型请参考[动态配置中心配置模型](../user-guide/configuration-center.md#sermant动态配置中心模型)。如何使用不同的动态配置中心请参考:[基于-zookeeper-的配置模型实现](../user-guide/configuration-center.md#基于-zookeeper-的配置模型实现),[基于-nacos-的配置模型实现](../user-guide/configuration-center.md#基于-nacos-的配置模型实现),[基于-servicecomb-kie-的配置模型实现](../user-guide/configuration-center.md#基于-servicecomb-kie-的配置模型实现)。 +> 说明1:限流规则的group由`service=`和`${service.name}`组成,其中`${service.name}`为微服务的名称,由微服务配置文件的`dubbo.application.name`、`spring.applicaton.name`或`application`确定,优先级`dubbo.application.name` > `spring.applicaton.name` > `application`,本示例设定微服务名称为flowcontrol。 -## 详细治理规则 +> 说明2:限流规则的key由前缀`servicecomb.rateLimiting`和自定义场景名称组成,本示例设定场景名称为`rateLimitingScene`。流量匹配规则和限流规则的key的自定义场景名称需保持一致,才能对匹配的流量执行限流策略。 -流控配置主要基于`group`进行配置订阅,该`group`由多个键值对组成。下面详细说明`group`和键值对`key`和`value`的设置规则。 +## 熔断 +**熔断指对指定接口配置熔断策略,可从单位统计时间窗口内的错误率或者慢请求率进行统计,当请求错误率或者慢请求率达到指定比例阈值,即触发熔断,在时间窗口重置前,隔离所有请求,在客户端和服务端都可生效。** -> 关于`group` `key` 的介绍以及配置中心的设置参考[动态配置中心使用手册](../user-guide/configuration-center.md#发布配置)。 +执行熔断策略需要通过配置中心下发流量匹配规则和熔断规则,主要分为两步: -#### 根据采用配置中心的不同,`group`的值将会有所区别,以下介绍`group`的设置规则: +**下发流量匹配规则:** 下发流量匹配规则匹配满足要求的流量。 -- 采用`zookeeper` +**下发熔断规则:** 下发熔断规则对匹配的流量执行熔断策略。 - 此时插件将根据宿主应用的服务名进行订阅, 即应用配置的`spring.applicaton.name`, 插件订阅配置的group为`service=${spring.applicaton.name}`。 +### 示例 -- 采用`KIE` +现有如下场景:在名称为flowcontrol的微服务中,对api访问路径为/circuitBreaker的流量,在10秒内,若流量标记的接口请求次数超过3次,且错误率超过90%或者慢请求占比超过80%则触发熔断。具体下发的规则如下所示: - 此时插件将根据**应用配置**,**服务配置**以及**自定义配置**三项数据配置**同时**订阅, 而这三类配置可参考`${path}/sermant-agent-x.x.x/agent/config/config.properties`, 相关配置如下: +#### 下发流量匹配规则 +为实现上述熔断场景,首先下发流量匹配规则来匹配需要执行熔断策略的流量。根据动态配置中心的配置模型,流量匹配规则由group、key和content组成,group用来约束流量匹配规则生效的微服务,key用来约束流量匹配规则生效的场景,content为具体的流量匹配规则,其内容如下所示: +* **group:** service=flowcontrol +* **key:** servicecomb.matchGroup.circuitBreakerScene +* **content:** +```yaml + # 精确匹配api访问路径为/circuitBreaker的流量 + matches: + - apiPath: + exact: /circuitBreaker + ``` +流量匹配的更多规则说明请参考[流量匹配规则说明](#流量匹配规则说明), +动态配置的配置模型请参考[动态配置中心配置模型](../user-guide/configuration-center.md#sermant动态配置中心模型)。如何使用不同的动态配置中心请参考:[基于-zookeeper-的配置模型实现](../user-guide/configuration-center.md#基于-zookeeper-的配置模型实现),[基于-nacos-的配置模型实现](../user-guide/configuration-center.md#基于-nacos-的配置模型实现),[基于-servicecomb-kie-的配置模型实现](../user-guide/configuration-center.md#基于-servicecomb-kie-的配置模型实现)。 +> 说明1:流量匹配规则的group由`service=`和`${service.name}`组成,其中`${service.name}`为微服务的名称,由微服务配置文件的`dubbo.application.name`、`spring.applicaton.name`或`application`确定,优先级`dubbo.application.name` > `spring.applicaton.name` > `application`,本示例设定微服务名称为flowcontrol。 - ```properties - # 服务app名称 - service.meta.application=default - # 服务版本 - service.meta.version=1.0.0 - # serviceComb 命名空间 - service.meta.project=default - # 环境 - service.meta.environment=development - # 自定义标签,按需配置,用于后续的配置订阅 - service.meta.customLabel=public - service.meta.customLabelValue=default - ``` +> 说明2:流量匹配规则的key由前缀`servicecomb.matchGroup`和自定义场景名称组成,本示例设定场景名称为`circuitBreakerScene`。流量匹配规则和熔断规则的key的自定义场景名称需保持一致,才能对匹配的流量执行熔断策略。 - 应用配置,服务配置,自定义配置说明参考[CSE配置中心概述](https://support.huaweicloud.com/devg-cse/cse_devg_0020.html)。 - - 应用配置:由`service.meta.application`与`service.meta.environment`组成, 对应的`group`为`app=default&environment=development`。 - - 服务配置:由`service.meta.application`、`service.meta.environment`以及服务名组成,此处服务即`spring.application.name`, 对应的`group`为`app=default&environment=development&service=DynamicConfigDemo`。 - - 自定义配置:由`service.meta.customLabel`与`service.meta.customLabelValue`组成, 对应的`group`为`public=default`。 +#### 下发熔断规则 +下发流量匹配规则后,对匹配的流量执行熔断策略还需要下发熔断规则。根据动态配置中心的配置模型,熔断规则由group、key和content三部分组成,group用来约束熔断规则生效的微服务,key用来约束熔断规则生效的场景,需和流量匹配规则的场景名称保持一致,content为具体的熔断规则,其内容如下所示: +* **group:** service=flowcontrol +* **key:** servicecomb.circuitBreaker.circuitBreakerScene +* **content:** +```yaml + # 在10秒内,若流量标记的接口请求次数超过3次,且错误率超过90%或者慢请求占比超过80%则触发熔断 + failureRateThreshold: 90 + minimumNumberOfCalls: 3 + slidingWindowSize: 10S + slidingWindowType: time + slowCallRateThreshold: 80 + ``` +熔断配置的更多规则说明请参考[熔断规则说明](#熔断规则说明),动态配置的配置模型请参考[动态配置中心配置模型](../user-guide/configuration-center.md#sermant动态配置中心模型)。如何使用不同的动态配置中心请参考:[基于-zookeeper-的配置模型实现](../user-guide/configuration-center.md#基于-zookeeper-的配置模型实现),[基于-nacos-的配置模型实现](../user-guide/configuration-center.md#基于-nacos-的配置模型实现),[基于-servicecomb-kie-的配置模型实现](../user-guide/configuration-center.md#基于-servicecomb-kie-的配置模型实现)。 +> 说明1:熔断规则的group由`service=`和`${service.name}`组成,其中`${service.name}`为微服务的名称,由微服务配置文件的`dubbo.application.name`、`spring.applicaton.name`或`application`确定,优先级`dubbo.application.name` > `spring.applicaton.name` > `application`,本示例设定微服务名称为flowcontrol。 -#### 流控插件根据配置键`key`的前缀进行规则匹配,以下介绍配置键`key`的规则: +> 说明2:熔断规则的key由前缀`servicecomb.circuitBreaker`和自定义场景名称组成,本示例设定场景名称为`circuitBreakerScene`。流量匹配规则和熔断规则的key的自定义场景名称需保持一致,才能对匹配的流量执行熔断策略。 -流量治理采用流量标记+流控规则的方式对指定的流量进行流控,所谓流量标记,通俗讲为请求信息,例如接口路径、接口方法类型、请求头以及下游服务名。 +### 熔断指标采集 +服务配置了[熔断策略](#熔断)后,可以开启监控开关,插件会异步采集[熔断指标](./monitor.md#熔断指标),并通过[监控插件](./monitor.md)进行指标上报。 +在`${sermant-path}/agent/pluginPackage/flowcontrol/config/config.yaml`配置文件中开启监控开关: +```yaml + flow.control.plugin: + enable-start-monitor: true + ``` +> 说明:${sermant-path}为sermant包路径。 -流控规则是否生效取决于流量标记,当流量标记与请求相匹配,流控规则才会生效。而如何将流量标记对应上具体规则,则取决于业务场景名,通常流量标记与流控规则配置均要配置指定前缀。 +## 隔离 +**隔离对指定接口设置允许的最大并发量,当超过最大并发量时,对并发流量进行排队等待控制,等待超过最大等待时间则拒绝调用,避免瞬时并发流量过大导致服务崩溃,在客户端和服务端都可生效。** -例如流量标记的键key需以`servicecomb.matchGroup`为前缀, 而限流规则的键key需以`servicecomb.rateLimiting`为前缀,以一个具体的例子: +执行隔离策略需要通过配置中心下发流量匹配规则和限流规则,主要分为两步: -> 流量标记配置键key为:`servicecomb.matchGroup.flow`。 -> -> 限流规则配置键key为:`servicecomb.rateLimiting.flow`。 -> -> 如上,`flow`即为业务场景名,仅当两者业务场景名称一致,当请求匹配上流量标记时,限流规则才会生效。 +**下发流量匹配规则:** 下发流量匹配规则匹配满足要求的流量。 -#### 下面介绍流控规则配置键`key`对应值`value`的相关信息: +**下发隔离规则:** 下发隔离规则对匹配的流量执行隔离策略。 -- **流量标记** +### 示例 - **流量标记配置键前缀:** `servicecomb.matchGroup` +现有如下场景:在名称为flowcontrol的微服务中,对api访问路径为/bulkhead的流量,若最大并发数超过5,且新的请求等待10S,还未获取资源,则触发隔离异常。 - 以`zookeeper`为例,当使用`zookeeper`配置中心设置流量标记规则时,结合上述`group`和`key`的说明,需要在`zookeeper`中创建节点`/service=${spring.applicaton.name}/servicecomb.matchGroup.${sceneName}`,节点内容为流量标记规则,如下述yaml内容。 - - ```yaml - matches: # 匹配器集合,可配置多个 - - apiPath: # 匹配的api路径, 支持各种比较方式,相等(exact)、包含(contains)等 - exact: /degrade # 具体匹配路径 - headers: # 请求头 - key: - exact: value # 请求头值,此处为key=value, 比较方式同apiPath - method: # 支持方法类型 - - GET - name: degrade # 可选,配置名 +#### 下发流量匹配规则 +为实现上述隔离场景,首先下发流量匹配规则来匹配需要执行隔离策略的流量。根据动态配置中心的配置模型,流量匹配规则由group、key和content组成,group用来约束流量匹配规则生效的微服务,key用来约束流量匹配规则生效的场景,content为具体的流量匹配规则,其内容如下所示: +* **group:** service=flowcontrol +* **key:** servicecomb.matchGroup.bulkheadScene +* **content:** +```yaml + # 精确匹配api访问路径为/bulkhead的流量 + matches: + - apiPath: + exact: /bulkhead ``` +流量匹配的更多规则说明请参考[流量匹配规则说明](#流量匹配规则说明),动态配置的配置模型请参考[动态配置中心配置模型](../user-guide/configuration-center.md#sermant动态配置中心模型)。如何使用不同的动态配置中心请参考:[基于-zookeeper-的配置模型实现](../user-guide/configuration-center.md#基于-zookeeper-的配置模型实现),[基于-nacos-的配置模型实现](../user-guide/configuration-center.md#基于-nacos-的配置模型实现),[基于-servicecomb-kie-的配置模型实现](../user-guide/configuration-center.md#基于-servicecomb-kie-的配置模型实现)。 +> 说明1:流量匹配规则的group由`service=`和`${service.name}`组成,其中`${service.name}`为微服务的名称,由微服务配置文件的`dubbo.application.name`、`spring.applicaton.name`或`application`确定,优先级`dubbo.application.name` > `spring.applicaton.name` > `application`,本示例设定微服务名称为flowcontrol。 + +> 说明2:流量匹配规则的key由前缀`servicecomb.matchGroup`和自定义场景名称组成,本示例设定场景名称为`bulkheadScene`。流量匹配规则和隔离规则的key的自定义场景名称需保持一致,才能对匹配的流量执行隔离策略。 +#### 下发隔离规则 +下发流量匹配规则后,对匹配的流量执行隔离策略还需要下发隔离规则。根据动态配置中心的配置模型,隔离规则由group、key和content三部分组成,group用来约束隔离规则生效的微服务,key用来约束隔离规则生效的场景,需和流量匹配规则的场景名称保持一致,content为具体的隔离规则,其内容如下所示: +* **group:** service=flowcontroll +* **key:** servicecomb.bulkhead.bulkheadScene +* **content:** +```yaml + # 最大并发数超过5,且新的请求等待10S,还未获取资源,则触发隔离异常 + maxConcurrentCalls: 5 + maxWaitDuration: 10S + ``` +隔离配置的更多规则说明请参考[隔离规则说明](#隔离规则说明),动态配置的配置模型请参考[动态配置中心配置模型](../user-guide/configuration-center.md#sermant动态配置中心模型)。如何使用不同的动态配置中心请参考:[基于-zookeeper-的配置模型实现](../user-guide/configuration-center.md#基于-zookeeper-的配置模型实现),[基于-nacos-的配置模型实现](../user-guide/configuration-center.md#基于-nacos-的配置模型实现),[基于-servicecomb-kie-的配置模型实现](../user-guide/configuration-center.md#基于-servicecomb-kie-的配置模型实现)。 +> 说明1:隔离规则的group由`service=`和`${service.name}`组成,其中`${service.name}`为微服务的名称,由微服务配置文件的`dubbo.application.name`、`spring.applicaton.name`或`application`确定,优先级`dubbo.application.name` > `spring.applicaton.name` > `application`,本示例设定微服务名称为flowcontrol。 - **流量标记解释:** +> 说明2:隔离规则的key由前缀`servicecomb.bulkhead`和自定义场景名称组成,本示例设定场景名称为`bulkheadScene`。流量匹配规则和隔离规则的key的自定义场景名称需保持一致,才能对匹配的流量执行隔离策略。 +## 错误注入 +**错误注入指在服务运行时,给指定服务配置错误注入策略,在客户端访问目标服务前,以指定策略模式返回。该策略多用于减少目标服务的访问负载,可作为降级的一种措施。** - - 请求路径为`/degrade`且方法类型为`GET`, 同时满足要求请求头包含`key=value`即匹配成功 +执行错误注入策略需要通过配置中心下发流量匹配规则和限流规则,主要分为两步: - 详细配置项可参考[ServiceComb开发文档](http://servicecomb.gitee.io/servicecomb-java-chassis-doc/java-chassis/zh_CN/references-handlers/governance.html#_2) 流量标记部分。 +**下发流量匹配规则:** 下发流量匹配规则匹配满足要求的流量。 - **流量标记请求路径(apiPath)配置说明** +**下发错误注入规则:** 下发错误注入规则对匹配的流量执行错误注入策略。 - 流量标记的请求路径会因不同的请求协议配置而存在差异,当前主要为Http(Spring)与Rpc(Dubbo)协议,下面分别说明两种请求协议的配置方式: +### 示例 - - Http协议 +现有如下场景:在名称为flowcontrol的微服务中,对api访问路径为/faultInjection的流量,访问接口时100%将返回空值。 - 该协议依据请求路径进行匹配,例如请求路径为localhost:8080/test/flow, 则实际拿到的路径为`/test/flow`,因此若需设置匹配规则,需依据该路径进行配置。 +#### 下发流量匹配规则 +为实现上述错误注入场景,首先下发流量匹配规则来匹配需要执行错误注入策略的流量。根据动态配置中心的配置模型,流量匹配规则由group、key和content组成,group用来约束流量匹配规则生效的微服务,key用来约束流量匹配规则生效的场景,content为具体的流量匹配规则,其内容如下所示: +* **group:** service=flowcontrol +* **key:** servicecomb.matchGroup.faultInjectionScene +* **content:** +```yaml + # 精确匹配api访问路径为/faultInjection的流量 + matches: + - apiPath: + exact: /faultInjection + ``` +流量匹配的更多规则说明请参考[流量匹配规则说明](#流量匹配规则说明), +动态配置的配置模型请参考[动态配置中心配置模型](../user-guide/configuration-center.md#sermant动态配置中心模型)。如何使用不同的动态配置中心请参考:[基于-zookeeper-的配置模型实现](../user-guide/configuration-center.md#基于-zookeeper-的配置模型实现),[基于-nacos-的配置模型实现](../user-guide/configuration-center.md#基于-nacos-的配置模型实现),[基于-servicecomb-kie-的配置模型实现](../user-guide/configuration-center.md#基于-servicecomb-kie-的配置模型实现)。 +> 说明1:流量匹配规则的group由`service=`和`${service.name}`组成,其中`${service.name}`为微服务的名称,由微服务配置文件的`dubbo.application.name`、`spring.applicaton.name`或`application`确定,优先级`dubbo.application.name` > `spring.applicaton.name` > `application`,本示例设定微服务名称为flowcontrol。 + +> 说明2:流量匹配规则的key由前缀`servicecomb.matchGroup`和自定义场景名称组成,本示例设定场景名称为`faultInjectionScene`。流量匹配规则和错误注入规则的key的自定义场景名称需保持一致,才能对匹配的流量执行错误注入策略。 +#### 下发错误注入规则 +下发流量匹配规则后,对匹配的流量执行错误注入策略还需要下发错误注入规则。根据动态配置中心的配置模型,错误注入规则由group、key和content三部分组成,group用来约束错误注入规则生效的微服务,key用来约束错误注入规则生效的场景,需和流量匹配规则的场景名称保持一致,content为具体的错误注入规则,其内容如下所示: +* **group:** service=flowcontrol +* **key:** servicecomb.faultInjection.faultInjectionScene +* **content:** +```yaml + # 访问接口时100%将返回空值 + type: abort + percentage: 100 + fallbackType: ReturnNull + forceClosed: false + errorCode: 503 + ``` +错误注入配置的更多规则说明请参考[错误注入规则说明](#错误注入规则说明),动态配置的配置模型请参考[动态配置中心配置模型](../user-guide/configuration-center.md#sermant动态配置中心模型)。如何使用不同的动态配置中心请参考:[基于-zookeeper-的配置模型实现](../user-guide/configuration-center.md#基于-zookeeper-的配置模型实现),[基于-nacos-的配置模型实现](../user-guide/configuration-center.md#基于-nacos-的配置模型实现),[基于-servicecomb-kie-的配置模型实现](../user-guide/configuration-center.md#基于-servicecomb-kie-的配置模型实现)。 +> 说明1:错误注入规则的group由`service=`和`${service.name}`组成,其中`${service.name}`为微服务的名称,由微服务配置文件的`dubbo.application.name`、`spring.applicaton.name`或`application`确定,优先级`dubbo.application.name` > `spring.applicaton.name` > `application`,本示例设定微服务名称为flowcontrol。 - 值得注意的是,如果用户配置了contextPath, 则需要加上contextPath前缀才可生效,即流量标记中请求路径为`${contextPath}/test/flow`。 +> 说明2:错误注入规则的key由前缀`servicecomb.faultInjection`和自定义场景名称组成,本示例设定场景名称为`faultInjectionScene`。流量匹配规则和错误注入规则的key的自定义场景名称需保持一致,才能对匹配的流量执行错误注入策略。 +## 重试 +**重试策略指当服务遇到非致命的错误时,可以通过重试的方式避免服务的最终失败。** - - Rpc协议(Dubbo) +执行重试策略需要通过配置中心下发流量匹配规则和限流规则,主要分为两步: - 该协议调用需要基于接口+方法,例如请求的接口为com.demo.test, 其方法为flow, 则对应的请求路径为`com.demo.test.flow`, 特别的,如果用户有配置接口的版本,例如指定的version为1.0.0, 则请求路径为`com.demo.test:1.0.0.flow`。同时需要配置请求方法为`POST`, RPC协议仅支持POST类型。 +**下发流量匹配规则:** 下发流量匹配规则匹配满足要求的流量。 -- **限流** +**下发重试规则:** 下发重试规则对匹配的流量执行重试策略。 - **限流规则配置键前缀:** `servicecomb.rateLimiting` +### 示例 - **限流规则:** - - | 配置项 | 说明 | 默认值 | 是否必须 | - | ------------------ | ------------------------------------------------------------ | ---- | ---- | - | limitRefreshPeriod | 单位统计时间,单位毫秒, 若需配置秒则可增加单位`S`, 例如`10S` | 1000ms | 否 | - | rate | 单位统计时间所能通过的**请求个数** | 1000 | 否 | +现有如下场景:在名称为flowcontrol的微服务中,对api访问路径为/retry的流量,访问接口时,当请求抛出500异常时进行重试,直到重试成功或者达到最大重试次数。 - 以zookeeper为例,当使用`zookeeper`配置中心设置限流规则时,结合上述`group`和`key`的说明,需要在`zookeeper`中创建节点`/service=${spring.applicaton.name}/servicecomb.rateLimiting.${sceneName}`,节点内容为限流规则,如下述yaml内容: - - ```yaml - limitRefreshPeriod: 1000 - rate: 2 +#### 下发流量匹配规则 +为实现上述重试场景,首先下发流量匹配规则来匹配需要执行重试策略的流量。根据动态配置中心的配置模型,流量匹配规则由group、key和content组成,group用来约束流量匹配规则生效的微服务,key用来约束流量匹配规则生效的场景,content为具体的流量匹配规则,其内容如下所示: +* **group:** service=flowcontrol +* **key:** servicecomb.matchGroup.retryScene +* **content:** +```yaml + # 精确匹配api访问路径为/retry的流量 + matches: + - apiPath: + exact: /retry ``` - **上述限流规则解释:** 若1秒内超过2个请求,即触发流控效果。 +流量匹配的更多规则说明请参考[流量匹配规则说明](#流量匹配规则说明), +动态配置的配置模型请参考[动态配置中心配置模型](../user-guide/configuration-center.md#sermant动态配置中心模型)。如何使用不同的动态配置中心请参考:[基于-zookeeper-的配置模型实现](../user-guide/configuration-center.md#基于-zookeeper-的配置模型实现),[基于-nacos-的配置模型实现](../user-guide/configuration-center.md#基于-nacos-的配置模型实现),[基于-servicecomb-kie-的配置模型实现](../user-guide/configuration-center.md#基于-servicecomb-kie-的配置模型实现)。 +> 说明1:流量匹配规则的group由`service=`和`${service.name}`组成,其中`${service.name}`为微服务的名称,由微服务配置文件的`dubbo.application.name`、`spring.applicaton.name`或`application`确定,优先级`dubbo.application.name` > `spring.applicaton.name` > `application`,本示例设定微服务名称为flowcontrol。 + +> 说明2:流量匹配规则的key由前缀`servicecomb.matchGroup`和自定义场景名称组成,本示例设定场景名称为`retryScene`。流量匹配规则和重试规则的key的自定义场景名称需保持一致,才能对匹配的流量执行重试策略。 +#### 下发重试规则 +下发流量匹配规则后,对匹配的流量执行重试策略还需要下发重试规则。根据动态配置中心的配置模型,重试规则由group、key和content三部分组成,group用来约束重试规则生效的微服务,key用来约束重试规则生效的场景,需和流量匹配规则的场景名称保持一致,content为具体的重试规则,其内容如下所示: +* **group:** service=flowcontrol +* **key:** servicecomb.retry.retryScene +* **content:** +```yaml + # 访问接口时,当请求抛出500异常时进行重试,直到重试成功或者达到最大重试次数 + waitDuration: 2000 + retryStrategy: FixedInterval + maxAttempts: 2 + retryOnResponseStatus: + - 500 + ``` +重试配置的更多规则说明请参考[重试规则说明](#重试规则说明),动态配置的配置模型请参考[动态配置中心配置模型](../user-guide/configuration-center.md#sermant动态配置中心模型)。如何使用不同的动态配置中心请参考:[基于-zookeeper-的配置模型实现](../user-guide/configuration-center.md#基于-zookeeper-的配置模型实现),[基于-nacos-的配置模型实现](../user-guide/configuration-center.md#基于-nacos-的配置模型实现),[基于-servicecomb-kie-的配置模型实现](../user-guide/configuration-center.md#基于-servicecomb-kie-的配置模型实现)。 +> 说明1:重试规则的group由`service=`和`${service.name}`组成,其中`${service.name}`为微服务的名称,由微服务配置文件的`dubbo.application.name`、`spring.applicaton.name`或`application`确定,优先级`dubbo.application.name` > `spring.applicaton.name` > `application`,本示例设定微服务名称为flowcontrol。 -- **熔断** +> 说明2:重试规则的key由前缀`servicecomb.retry`和自定义场景名称组成,本示例设定场景名称为`retryScene`。流量匹配规则和重试规则的key的自定义场景名称需保持一致,才能对匹配的流量执行重试策略。 - **熔断规则配置键前缀:** `servicecomb.circuitBreaker` +## 系统级流控 +**系统级别的流控策略是指,在服务运行过程中,当系统的负载、CPU使用率、并发线程数、请求的平均响应时间或请求的每秒数量(qps)任何一个指标超过预设阈值时,将会启动流控机制,对请求流量进行限制。** - **熔断规则:** - - | 配置项 | 说明 | 默认值 | 是否必须 | - | ------------------------- | ------------------------------------------------------------ | ---- | ---- | - | failureRateThreshold | 熔断所需达到的错误率 | 50 | 否 | - | minimumNumberOfCalls | 滑动窗口内的最小请求数, 超过最小请求数才开始判断熔断条件 | 100 | 否 | - | name | 配置项名称,可选参数 | null | 否 | - | slidingWindowSize | 滑动统计窗口大小,支持毫秒与秒,例如`1000`为1000毫秒, `10S`代表10秒 | 100ms | 否 | - | slidingWindowType | 滑动窗口类型,目前支持`time`与`count`两种类型,前者基于时间窗口统计,后者基于请求次数 | time | 否 | - | slowCallDurationThreshold | 慢请求阈值,单位同滑动窗口配置 | 60s | 否 | - | slowCallRateThreshold | 慢请求占比,当慢调用请求数达到该比例触发通断 | 100 | 否 | - | waitDurationInOpenState | 熔断后恢复时间 | 60s | 否 | +使用系统级流控能力,需要在`${sermant-path}/agent/pluginPackage/flowcontrol/config/config.yaml`配置文件中开启系统级流控开关: +```yaml + flow.control.plugin: + enable-system-rule: true + ``` +> 说明:${sermant-path}为sermant包路径。 - 以zookeeper为例,当使用`zookeeper`配置中心设置熔断规则时,结合上述`group`和`key`的说明,需要在`zookeeper`中创建节点`/service=${spring.applicaton.name}/servicecomb.circuitBreaker.${sceneName}`,节点内容为熔断规则,如下述yaml内容: +执行系统规则策略需要通过配置中心下发流量匹配规则和限流规则,主要分为两步: - ```yaml - failureRateThreshold: 90 - minimumNumberOfCalls: 3 - name: degrade - slidingWindowSize: 10S - slidingWindowType: time - slowCallDurationThreshold: "1" - slowCallRateThreshold: 80 - waitDurationInOpenState: 10s - ``` - - **上述熔断规则解释:** 10秒内,若流量标记的接口请求次数超过3次,且错误率超过90%或者慢请求占比超过80%则触发熔断。 +**下发流量匹配规则:** 下发流量匹配规则匹配满足要求的流量。 -- **隔离** +**下发系统级流控规则:** 下发系统级流控规则对匹配的流量执行系统级流控策略。 - **隔离规则配置键前缀:** `servicecomb.bulkhead` +### 示例 - **隔离规则:** - - | 配置项 | 说明 | 默认值 | 是否必须 | - | ------------------ | ------------------------------------------------------------ | ---- | ---- | - | maxConcurrentCalls | 最大并发数 | 1000 | 否 | - | maxWaitDuration | 最大等待时间,若线程超过`maxConcurrentCalls`,会尝试等待,若超出等待时间还未获取资源,则抛出隔离仓异常 | 0 | 否 | - | name | 可选,配置名称 | null | 否 | +现有如下场景:在名称为flowcontrol的微服务中,对api访问路径为/system的流量,当系统负载超过5,或cpu使用率超过0.6,或qps超过1000,或请求响应时间小于100ms,或并发线程数大于200时,即触发限流,返回对应异常信息。 +#### 下发流量匹配规则 +为实现上述系统规则场景,首先下发流量匹配规则来匹配需要执行系统规则策略的流量。根据动态配置中心的配置模型,流量匹配规则由group、key和content组成,group用来约束流量匹配规则生效的微服务,key用来约束流量匹配规则生效的场景,content为具体的流量匹配规则,其内容如下所示: +* **group:** service=flowcontrol +* **key:** servicecomb.matchGroup.systemScene +* **content:** +```yaml + # 精确匹配api访问路径为/system的流量 + matches: + - apiPath: + exact: /system + ``` +流量匹配的更多规则说明请参考[流量匹配规则说明](#流量匹配规则说明), +动态配置的配置模型请参考[动态配置中心配置模型](../user-guide/configuration-center.md#sermant动态配置中心模型)。如何使用不同的动态配置中心请参考:[基于-zookeeper-的配置模型实现](../user-guide/configuration-center.md#基于-zookeeper-的配置模型实现),[基于-nacos-的配置模型实现](../user-guide/configuration-center.md#基于-nacos-的配置模型实现),[基于-servicecomb-kie-的配置模型实现](../user-guide/configuration-center.md#基于-servicecomb-kie-的配置模型实现)。 +> 说明1:流量匹配规则的group由`service=`和`${service.name}`组成,其中`${service.name}`为微服务的名称,由微服务配置文件的`dubbo.application.name`、`spring.applicaton.name`或`application`确定,优先级`dubbo.application.name` > `spring.applicaton.name` > `application`,本示例设定微服务名称为flowcontrol。 + +> 说明2:流量匹配规则的key由前缀`servicecomb.matchGroup`和自定义场景名称组成,本示例设定场景名称为`systemScene`。流量匹配规则和系统规则的key的自定义场景名称需保持一致,才能对匹配的流量执行系统规则策略。 +#### 下发系统级流控规则 +下发流量匹配规则后,对匹配的流量执行系统规则策略还需要下发系统规则。根据动态配置中心的配置模型,系统规则由group、key和content三部分组成,group用来约束系统规则生效的微服务,key用来约束系统规则生效的场景,需和流量匹配规则的场景名称保持一致,content为具体的系统规则,其内容如下所示: +* **group:** service=flowcontrol +* **key:** servicecomb.system.systemScene +* **content:** +```yaml + # 当系统负载超过5,或cpu使用率超过0.6,或qps超过1000,或请求响应时间小于100ms,或并发线程数大于200时,即触发限流,返回异常信息 + systemLoad: 5 + cpuUsage: 0.6 + qps: 1000 + aveRt: 100 + threadNum: 200 + ``` +系统级流控配置的更多规则说明请参考[系统级流控规则说明](#系统级流控规则说明),动态配置的配置模型请参考[动态配置中心配置模型](../user-guide/configuration-center. +md#sermant动态配置中心模型)。如何使用不同的动态配置中心请参考:[基于-zookeeper-的配置模型实现](../user-guide/configuration-center.md#基于-zookeeper-的配置模型实现),[基于-nacos-的配置模型实现](../user-guide/configuration-center.md#基于-nacos-的配置模型实现),[基于-servicecomb-kie-的配置模型实现](../user-guide/configuration-center.md#基于-servicecomb-kie-的配置模型实现)。 +> 说明1:系统规则的group由`service=`和`${service.name}`组成,其中`${service.name}`为微服务的名称,由微服务配置文件的`dubbo.application.name`、`spring.applicaton.name`或`application`确定,优先级`dubbo.application.name` > `spring.applicaton.name` > `application`,本示例设定微服务名称为flowcontrol。 - 以zookeeper为例,当使用`zookeeper`配置中心设置隔离规则时,结合上述`group`和`key`的说明,需要在`zookeeper`中创建节点`/service=${spring.applicaton.name}/servicecomb.circuitBreaker.${sceneName}`,节点内容为隔离规则,如下述yaml内容: +> 说明2:系统规则的key由前缀`servicecomb.system`和自定义场景名称组成,本示例设定场景名称为`systemScene`。流量匹配规则和系统规则的key的自定义场景名称需保持一致,才能对匹配的流量执行系统规则策略。 +### 系统自适应 +**系统自适应指在服务运行时,根据系统当前负载状态,以及过去一段时间内系统数据,对请求进行自适应流控。** - ```yaml - maxConcurrentCalls: "5" - maxWaitDuration: "10S" - name: "隔离仓" +使用系统自适应规则,需要在`${sermant-path}/agent/pluginPackage/flowcontrol/config/config.yaml`配置文件中开启系统规则开关和系统自适应开关,并下发[系统级流控规则](#下发系统级流控规则)。根据上述下发的系统级流控规则,系统自适应的规则为当系统负载大于5时,若当前并发线程数大于系统容量(系统容量由qps * minRt计算得出),则触发限流: +```yaml + flow.control.plugin: + enable-system-rule: true + enable-system-adaptive: true ``` - - **上述隔离规则解释:** 针对流量标记的接口, 若最大并发数超过5,且新的请求等待10S,还未获取资源,则触发隔离仓异常。 +> 说明1:${sermant-path}为sermant包路径。 +## 多流控能力配置 +**上述文档介绍了如何针对单个流控能力进行配置,本节介绍对于匹配的流量如何执行多个流控策略的配置。** -- **重试** +执行多个流控策略需要通过配置中心下发流量匹配规则和流控规则,主要分为两步: - **重试规则配置键前缀:** `servicecomb.retry` +**下发流量匹配规则:** 下发流量匹配规则匹配满足要求的流量。 - **重试规则:** - - | 配置项 | 说明 | 默认值 | 是否必须 | - | --------------------- | ------------------------------------------------------------ | ---- | ---- | - | waitDuration | 重试等待时间,默认毫秒;支持秒单位,例如2S | 10ms | 否 | - | retryStrategy | 重试策略,当前支持两种重试策略:固定时间间隔(FixedInterval), 指数增长间隔(RandomBackoff) | FixedInterval | 否 | - | maxAttempts | 最大重试次数 | 3 | 否 | - | retryOnResponseStatus | HTTP状态码,当前仅支持HTTP请求;针对dubbo请求,可通过配置异常类型确定是否需要重试,默认为RpcException | null | 否 | +**下发流控规则:** 下发多个流控规则对匹配的流量执行流控规则策略。 - 以zookeeper为例,当使用`zookeeper`配置中心设置重试规则时,结合上述`group`和`key`的说明,需要在`zookeeper`中创建节点`/service=${spring.applicaton.name}/servicecomb.retry.${sceneName}`,节点内容为重试规则,如下述yaml内容: +### 示例 - ```yaml - waitDuration: "2000" +现有如下场景:在名称为flowcontrol的微服务中,对api访问路径为/mutliCapability的流量,若1秒内超过2个请求,则触发限流能力,或者访问接口时,当请求抛出500异常时进行重试,直到重试成功或者达到最大重试次数。 + +#### 下发流量匹配规则 +为实现上述流控策略场景,首先下发流量匹配规则来匹配需要执行流控策略的流量。根据动态配置中心的配置模型,流量匹配规则由group、key和content组成,group用来约束流量匹配规则生效的微服务,key用来约束流量匹配规则生效的场景,content为具体的流量匹配规则,其内容如下所示: +* **group:** service=flowcontrol +* **key:** servicecomb.matchGroup.mutliCapabilityScene +* **content:** +```yaml + # 精确匹配api访问路径为/mutliCapability的流量 + matches: + - apiPath: + exact: /mutliCapability + ``` +流量匹配的更多配置规则请参考[流量匹配配置项](#流量匹配配置项), +动态配置的配置模型请参考[动态配置中心配置模型](../user-guide/configuration-center.md#sermant动态配置中心模型)。如何使用不同的动态配置中心请参考:[基于-zookeeper-的配置模型实现](../user-guide/configuration-center.md#基于-zookeeper-的配置模型实现),[基于-nacos-的配置模型实现](../user-guide/configuration-center.md#基于-nacos-的配置模型实现),[基于-servicecomb-kie-的配置模型实现](../user-guide/configuration-center.md#基于-servicecomb-kie-的配置模型实现)。 +> 说明1:流量匹配规则的group由`service=`和`${service.name}`组成,其中`${service.name}`为微服务的名称,由微服务配置文件的`dubbo.application.name`、`spring.applicaton.name`或`application`确定,优先级`dubbo.application.name` > `spring.applicaton.name` > `application`,本示例设定微服务名称为flowcontrol。 + +> 说明2:流量匹配规则的key由前缀`servicecomb.matchGroup`和自定义场景名称组成,本示例设定场景名称为`mutliCapabilityScene`。流量匹配规则和多个流控规则的key的自定义场景名称需保持一致,才能对匹配的流量执行多个流控策略。 +#### 下发限流规则 +下发流量匹配规则后,对匹配的流量执行限流策略还需要下发限流规则。根据动态配置中心的配置模型,限流规则由group、key和content三部分组成,group用来约束限流规则生效的微服务,key用来约束限流规则生效的场景,需和流量匹配规则的场景名称保持一致,content为具体的限流规则,其内容如下所示: +* **group:** service=flowcontrol +* **key:** servicecomb.rateLimiting.mutliCapabilityScene +* **content:** +```yaml + # 1秒内超过2个请求,则触发限流能力 + limitRefreshPeriod: 1000 + rate: 2 + ``` + 限流配置的更多配置规则请参考[限流策略配置项](#限流策略配置项)一节,动态配置的配置模型请参考[动态配置中心配置模型](../user-guide/configuration-center.md#sermant动态配置中心模型)。如何使用不同的动态配置中心请参考:[基于-zookeeper-的配置模型实现](../user-guide/configuration-center.md#基于-zookeeper-的配置模型实现),[基于-nacos-的配置模型实现](../user-guide/configuration-center.md#基于-nacos-的配置模型实现),[基于-servicecomb-kie-的配置模型实现](../user-guide/configuration-center.md#基于-servicecomb-kie-的配置模型实现)。 +> 说明1:限流规则的group由`service=`和`${service.name}`组成,其中`${service.name}`为微服务的名称,由微服务配置文件的`dubbo.application.name`、`spring.applicaton.name`或`application`确定,优先级`dubbo.application.name` > `spring.applicaton.name` > `application`,本示例设定微服务名称为flowcontrol。 + +> 说明2:限流规则的key由前缀`servicecomb.rateLimiting`和自定义场景名称组成,本示例设定场景名称为`mutliCapabilityScene`。流量匹配规则和限流规则的key的自定义场景名称需保持一致,才能对匹配的流量执行限流策略。 +#### 下发重试规则 +下发流量匹配规则后,对匹配的流量执行重试策略还需要下发重试规则。根据动态配置中心的配置模型,重试规则由group、key和content三部分组成,group用来约束重试规则生效的微服务,key用来约束重试规则生效的场景,需和流量匹配规则的场景名称保持一致,content为具体的重试规则,其内容如下所示: +* **group:** service=flowcontrol +* **key:** servicecomb.retry.mutliCapabilityScene +* **content:** +```yaml + # 访问接口时,当请求抛出500异常时进行重试,直到重试成功或者达到最大重试次数 + waitDuration: 2000 retryStrategy: FixedInterval maxAttempts: 2 retryOnResponseStatus: - 500 ``` - - **上述重试规则解释:** 针对流量标记的接口, 当请求抛出500异常时进行重试,直到重试成功或者达到最大重试次数。 +重试配置的更多配置规则请参考[重试策略配置项](#重试策略配置项),动态配置的配置模型请参考[动态配置中心配置模型](../user-guide/configuration-center.md#sermant动态配置中心模型)。如何使用不同的动态配置中心请参考:[基于-zookeeper-的配置模型实现](../user-guide/configuration-center.md#基于-zookeeper-的配置模型实现),[基于-nacos-的配置模型实现](../user-guide/configuration-center.md#基于-nacos-的配置模型实现),[基于-servicecomb-kie-的配置模型实现](../user-guide/configuration-center.md#基于-servicecomb-kie-的配置模型实现)。 +> 说明1:重试规则的group由`service=`和`${service.name}`组成,其中`${service.name}`为微服务的名称,由微服务配置文件的`dubbo.application.name`、`spring.applicaton.name`或`application`确定,优先级`dubbo.application.name` > `spring.applicaton.name` > `application`,本示例设定微服务名称为flowcontrol。 + +> 说明2:重试规则的key由前缀`servicecomb.retry`和自定义场景名称组成,本示例设定场景名称为`mutliCapabilityScene`。流量匹配规则和重试规则的key的自定义场景名称需保持一致,才能对匹配的流量执行重试策略。 +## 详细规则说明 +### 流量匹配规则说明 +流量匹配是使用流控能力的前提配置,用于给不同的流控能力匹配相应的流量。 +流量匹配规则的详细说明如下所示: + ```yaml + # 匹配器集合,可配置多个 + matches: + # 匹配的api路径, 支持各种比较方式,相等(exact)、包含(contains)等 + - apiPath: + # 具体匹配路径 + exact: /degrade + # 请求头 + headers: + key: + # 请求头值,此处为key=value + exact: value + method: + # 支持方法类型 + - GET + # 可选,自定义配置名 + name: degrade + ``` +该示例流量匹配规则用于匹配api路径为/degrade,请求头包含exact=value,请求方法类型为get的流量。 + +**流量标记请求路径(apiPath)规则说明** -- **错误注入** + 流量标记的请求路径会因不同的请求协议配置而存在差异,当前主要为Http(Spring)与Rpc(Dubbo)协议,下面分别说明两种请求协议的规则配置方式: - **错误注入规则配置键前缀:** `servicecomb.faultInjection` + - Http协议 + + 该协议依据请求路径进行匹配,例如请求路径为localhost:8080/test/flow,则实际拿到的路径为`/test/flow`,因此若需设置匹配规则,需依据该路径进行配置。 + + 值得注意的是,如果用户配置了contextPath,则需要加上contextPath前缀才可生效,即流量标记中请求路径为`${contextPath}/test/flow`。 + + - Rpc协议(Dubbo) - **错误注入规则:** + 该协议调用需要基于接口+方法,例如请求的接口为com.demo.test,其方法为flow, 则对应的请求路径为`com.demo.test.flow`,特别的,如果用户有配置接口的版本,例如指定的version为1.0.0, 则请求路径为`com.demo.test:1.0.0.flow`。同时需要配置请求方法为`POST`,RPC协议仅支持POST类型。 - | 配置项 | 说明 | 默认值 | 是否必须 | +### 限流规则说明 +| 规则项 | 说明 | 默认值 | 是否必须 | + | ------------------ | ------------------------------------------------------------ | ---- | ---- | + | limitRefreshPeriod | 单位统计时间,单位毫秒,若需配置秒则可增加单位`S`, 例如`10S` | 1000ms | 否 | + | rate | 单位统计时间所能通过的**请求个数** | 1000 | 否 | +### 熔断规则说明 +| 规则项 | 说明 | 默认值 | 是否必须 | + | ------------------------- | ------------------------------------------------------------ | ---- | ---- | + | failureRateThreshold | 熔断所需达到的错误率 | 50 | 否 | + | minimumNumberOfCalls | 滑动窗口内的最小请求数, 超过最小请求数才开始判断熔断条件 | 100 | 否 | + | name | 配置项名称,可选参数 | null | 否 | + | slidingWindowSize | 滑动统计窗口大小,支持毫秒与秒,例如`1000`为1000毫秒,`10S`代表10秒 | 100ms | 否 | + | slidingWindowType | 滑动窗口类型,目前支持`time`与`count`两种类型,前者基于时间窗口统计,后者基于请求次数 | time | 否 | + | slowCallDurationThreshold | 慢请求阈值,单位同滑动窗口配置 | 60s | 否 | + | slowCallRateThreshold | 慢请求占比,当慢调用请求数达到该比例触发通断 | 100 | 否 | + | waitDurationInOpenState | 熔断后恢复时间 | 60s | 否 | +### 隔离规则说明 +| 规则项 | 说明 | 默认值 | 是否必须 | + | ------------------ | ------------------------------------------------------------ | ---- | ---- | + | maxConcurrentCalls | 最大并发数 | 1000 | 否 | + | maxWaitDuration | 最大等待时间,若线程超过`maxConcurrentCalls`,会尝试等待,若超出等待时间还未获取资源,则抛出隔离仓异常 | 0 | 否 | + | name | 可选,配置名称 | null | 否 | +### 错误注入规则说明 +| 规则项 | 说明 | 默认值 | 是否必须 | | ------------ | ------------------------------------------------------------ | ---- | ---- | - | type | 错误注入类型, 目前支持abort(请求直接返回)与delay(请求延时) | delay | 否 | + | type | 错误注入类型,目前支持abort(请求直接返回)与delay(请求延时) | delay | 否 | | percentage | 错误注入触发概率 | -1 | 是 | | fallbackType | 请求调用返回类型,仅`type=abort`生效。当前支持两种`ReturnNull`:直接返回空内容,状态码200;`ThrowException`: 按照指定错误码返回,关联配置`errorCode` | ThrowException | 否 | - | errorCode | 指定错误码返回, 默认500, 仅在`type=abort`且`fallbackType=ThrowException`生效 | 500 | 否 | - | forceClosed | 是否强制关闭错误注入能力, 当为true时,错误注入将不会生效。默认false | false | 否 | - - 以zookeeper为例,当使用`zookeeper`配置中心设置错误注入规则时,结合上述`group`和`key`的说明,需要在`zookeeper`中创建节点`/service=${spring.applicaton.name}/servicecomb.retry.${sceneName}`,节点内容为错误注入规则,如下述yaml内容: + | errorCode | 指定错误码返回,默认500,仅在`type=abort`且`fallbackType=ThrowException`生效 | 500 | 否 | + | forceClosed | 是否强制关闭错误注入能力,当为true时,错误注入将不会生效。默认false | false | 否 | - ```yaml - type: abort - percentage: 100 - fallbackType: ReturnNull - forceClosed: false - errorCode: 503 - ``` - - **上述错误注入规则解释:** 当请求流量标记的接口时,100%将返回空。 - -- **系统规则** +### 重试规则说明 +| 规则项 | 说明 | 默认值 | 是否必须 | + | --------------------- | ------------------------------------------------------------ | ---- | ---- | + | waitDuration | 重试等待时间,默认毫秒;支持秒单位,例如2S | 10ms | 否 | + | retryStrategy | 重试策略,当前支持两种重试策略:固定时间间隔(FixedInterval), 指数增长间隔(RandomBackoff) | FixedInterval | 否 | + | maxAttempts | 最大重试次数 | 3 | 否 | + | retryOnResponseStatus | HTTP状态码,当前仅支持HTTP请求;针对dubbo请求,可通过配置异常类型确定是否需要重试,默认为RpcException | null | 否 | - **系统规则配置键前缀:** `servicecomb.system` +### 系统级流控规则说明 - | 配置项 | 说明 | 默认值 | 是否必须 | + | 规则项 | 说明 | 默认值 | 是否必须 | | ---------- | ------------------------------------------------------------ | ---- | ---- | | systemLoad | 系统负载阈值,仅支持linux | Double.MAX_VALUE | 否 | | cpuUsage | 系统cpu使用率阈值 | 1.0 | 否 | @@ -268,95 +454,40 @@ flow.control.plugin: | aveRt | 入口流量的平均响应时间阈值,单位ms | Long.MAX_VALUE | 否 | | threadNum | 入口流量的并发线程数阈值 | Long.MAX_VALUE | 否 | - 以zookeeper为例,当使用`zookeeper`配置中心设置系统规则时,结合上述`group`和`key`的说明,需要在`zookeeper`中创建节点`/service=${spring.applicaton.name}/servicecomb.system.${sceneName}`,节点内容为系统规则,如下述yaml内容: - - ```yaml - systemLoad: 5 - cpuUsage: 0.6 - qps: 1000 - aveRt: 100 - threadNum: 200 - ``` - - **上述系统规则解释:** - - 针对使用流控插件的应用示例来说,当系统负载超过5,或者cpu使用率超过0.6,或者qps超过1000,或者请求响应时间小鱼100ms,或者并发线程数大于200时,即触发限流,返回对应异常信息。 - - 若开启系统自适应开关,则当系统负载大于5时,若当前并发线程数大于系统容量(系统容量由qps * minRt计算得出),则触发限流。 - -### 基于配置文件设置规则 +### 基于配置文件设置流控规则 若应用未采用配置中心的方式配置流控规则,也可采用配置文件的方式使用流控能力。 -流控插件在应用启动时,会尝试的从SpringBoot加载的配置源读取流控规则以及对应的流量标记,用户需要在启动之前进行配置。如下为配置示例, 示例配置直接基于`application.yml`进行配置 +流控插件在应用启动时,会尝试从SpringBoot框架加载的配置源读取流控规则,用户需要在启动之前进行配置。如下为流控规则的配置示例,示例配置直接基于`application.yml`文件进行配置: ```yaml -servicecomb: # 流量标记前缀 - matchGroup: # 流量标记前缀 - demo-fault-null: # 错误注入场景 - matches: # 匹配器集合 - - apiPath: # 匹配的api路径 - exact: "/flow" # 具体匹配路径 - demo-retry: # 重试场景 +servicecomb: + matchGroup: + # 重试场景下的流量匹配规则 + demo-retry: matches: - apiPath: prefix: "/retry" serviceName: rest-provider - method: # 支持方法类型 - - GET - demo-rateLimiting: # 限流场景 + method: + - GET + # 限流场景下的流量匹配规则 + demo-rateLimiting: matches: - apiPath: exact: "/flow" - demo-circuitBreaker-exception: # 熔断场景 - matches: - - apiPath: - exact: "/exceptionBreaker" - demo-bulkhead: # 隔离舱场景 - matches: - - apiPath: - exact: "/flowcontrol/bulkhead" - demo-system: # 系统规则场景 - matched: - - apiPath: - prefix: / - rateLimiting: # 限流规则 + rateLimiting: + # 限流场景下的流控规则 demo-rateLimiting: rate: 1 - retry: # 重试规则 + retry: + # 重试场景下的流控规则 demo-retry: | maxAttempts: 3 retryOnResponseStatus: - 500 - circuitBreaker: # 熔断规则 - demo-circuitBreaker-exception: | - failureRateThreshold: 44 - minimumNumberOfCalls: 2 - name: 熔断 - slidingWindowSize: 10000 - slidingWindowType: time - waitDurationInOpenState: 5s - bulkhead: # 隔离规则 - demo-bulkhead: | - maxConcurrentCalls: 1 - maxWaitDuration: 10 - faultInjection: # 错误注入规则 - demo-fault-null: | - type: abort - percentage: 100 - fallbackType: ReturnNull - forceClosed: false - system: # 系统流控规则 - demo-system: | - systemLoad: 0.6 - cpuUsage: 0.6 - qps: 100 - aveRt: 20 - threadNum: 100 ``` -### 基于Sermant动态配置中心发布规则 - -基于Sermant动态配置中心发布规则,可以参考[动态配置中心使用手册](../user-guide/configuration-center.md)。 - ## 支持版本与限制 ### 支持版本 @@ -370,116 +501,92 @@ servicecomb: # 流量标记前缀 ### 限制 - 系统规则与系统自适应规则中`systemLoad`配置仅限于**Linux**。 -- 上述[基于配置文件设置配置](#基于配置文件设置配置) 仅限于**Springboot**应用。 +- 上述[基于配置文件设置配置](#基于配置文件设置流控规则) 仅限于**Springboot**应用。 ## 操作和结果验证 - -下面将演示如何使用流控插件,验证SpringBoot应用采用ZooKeeper配置中心,设置限流策略场景。 - +下面我们通过限流场景开始使用流控插件,通过简单的几个步骤,就可以开始对微服务执行限流。本次示例使用ZooKeeper作为动态配置中心。 ### 准备工作 -- [下载](https://github.com/huaweicloud/Sermant-examples/releases/download/v1.3.0/sermant-examples-flowcontrol-demo-1.3.0.tar.gz) Demo二进制产物压缩包 -- [下载](https://github.com/huaweicloud/Sermant/releases/download/v1.3.0/sermant-1.3.0.tar.gz) Sermant - Release包(当前版本推荐1.3.0版本) -- [下载](https://zookeeper.apache.org/releases#download) 并启动ZooKeeper +- [下载](https://github.com/huaweicloud/Sermant-examples/releases/download/v1.3.0/sermant-examples-dynamic-demo-1.3.0.tar.gz)流控Demo二进制产物压缩包 +- [下载](https://github.com/huaweicloud/Sermant/releases/download/v1.3.0/sermant-1.3.0.tar.gz)Sermant包(当前版本推荐1.3.0版本) +- [下载](https://zookeeper.apache.org/releases#download)并启动ZooKeeper -### 步骤一:获取Demo二进制产物 +### 限流示例 +#### 步骤一:启动流控Demo -解压Demo二进制产物压缩包,即可得到`spring-provider.jar`。 +解压准备工作下载的流控Demo获得可执行JAR包,即spring-provider.jar文件,参考如下命令启动Demo -### 步骤二:修改插件配置 - -参考[插件配置](#插件配置) 修改`${path}/sermant-agent-x.x.x/agent/pluginPackage/flowcontrol/config/config.yaml`文件为以下内容: ```shell -flow.control.plugin: - useCseRule: false # 是否开启ServiceComb适配 - enable-start-monitor: false # 是否启动指标监控 - enable-system-adaptive: false # 是否开启系统自适应流控 - enable-system-rule: false # 是否开启系统规则流控 -``` - -> **说明**: ${path}为sermant所在路径。 - -### 步骤三:启动Demo应用 - -参考如下命令启动Demo应用 - -```shell -# windwos -java -javaagent:${path}\sermant-agent-x.x.x\agent\sermant-agent.jar -Dspring.application.name=spring-flow-provider -Dspring.cloud.zookeeper.connectString=127.0.0.1:2181 -jar spring-provider.jar - #linux mac -java -javaagent:${path}/sermant-agent-x.x.x/agent/sermant-agent.jar -Dspring.application.name=spring-flow-provider -Dspring.cloud.zookeeper.connectString=127.0.0.1:2181 -jar spring-provider.jar +java -javaagent:${sermant-path}/agent/sermant-agent.jar -Dspring.application.name=spring-flow-provider -jar spring-provider.jar ``` -> **说明:** ${path}为sermant实际安装路径,x.x.x代表sermant某个版本号。 +> **说明:** ${sermant-path}为Sermant包路径。 -### 步骤四:发布流量标记 +#### 步骤二:发布流量匹配规则 -参考使用[动态配置中心使用手册](../user-guide/configuration-center.md),发布如下配置: +参考[动态配置中心使用手册配置模型](../user-guide/configuration-center.md#sermant动态配置中心模型),流量匹配规则由group、key和content三部分组成,group用来约束流量匹配规则生效的微服务,key用来约束流量匹配规则生效的场景,需和限流规则的场景名称保持一致,content为具体的流量匹配规则,其内容如下所示: +* **group:** service=spring-flow-provider +* **key:** servicecomb.matchGroup.flowScene +* **content:** +```yaml + # 精确匹配api路径为/flow并且请求方法类型为GET的流量 + matches: + - apiPath: + exact: /flow + method: + - GET + ``` +> 说明1:流量匹配规则的group由`service=`和`${service.name}`组成,其中`${service.name}`为微服务的名称,本示例所使用Demo的微服务名称为spring-flow-provider。 -```json -{ - "value": "alias: scene\nmatches:\n- apiPath:\n exact: /flow\n headers: {}\n method:\n - GET\n name: flow\n", - "group": "service=spring-flow-provider", - "key": "servicecomb.matchGroup.sceneFlow" -} -``` +> 说明2:流量匹配规则的key由前缀`servicecomb.matchGroup`和自定义场景名称组成,本示例设定场景名称为`flowScene`。流量匹配规则和限流规则的key的自定义场景名称需保持一致,才能对匹配的流量执行限流策略。 -利用ZooKeeper提供的命令行工具来发布流量标记策略和流控策略: +利用ZooKeeper提供的命令行工具下发流量匹配规则: -1. 在`${path}/bin/`目录执行以下命令创建节点`/service=spring-flow-provider` +1. 在`${zookeeper-path}/bin/`目录执行以下命令创建配置模型的group节点`/service=spring-flow-provider`: ```shell # linux mac ./zkCli.sh -server localhost:2181 create /service=spring-flow-provider - -# windows -zkCli.cmd -server localhost:2181 create /service=spring-flow-provider ``` -2. 在`${path}/bin/`目录执行以下命令创建节点`/service=spring-flow-provider/servicecomb.matchGroup.sceneFlow`和数据`"alias: scene\nmatches:\n- apiPath:\n exact: /flow\n headers: {}\n method:\n - GET\n name: flow\n"` +2. 创建完成group节点后,在`${zookeeper-path}/bin/`目录执行以下命令创建配置模型的key节点`/service=spring-flow-provider/servicecomb.matchGroup.flowScene`,并设置节点的content: ```shell # linux mac -./zkCli.sh -server localhost:2181 create /service=spring-flow-provider/servicecomb.matchGroup.sceneFlow "alias: scene -matches: +./zkCli.sh -server localhost:2181 create /service=spring-flow-provider/servicecomb.matchGroup.flowScene "matches: - apiPath: exact: /flow - headers: {} method: - - GET - name: flow" - -# windwos -zkCli.cmd -server localhost:2181 create /service=spring-flow-provider/servicecomb.matchGroup.sceneFlow "alias: scene -matches: -- apiPath: - exact: /flow - headers: {} - method: - - GET - name: flow" + - GET" ``` +> 说明:${zookeeper-path}为ZooKeeper的安装目录。 +#### 步骤三:发布限流规则 +参考[动态配置中心使用手册配置模型](../user-guide/configuration-center.md#sermant动态配置中心模型),限流规则由group、key和content三部分组成,group用来约束限流规则生效的微服务,key用来约束限流规则生效的场景,需和流量匹配规则的场景名称保持一致,content为具体的限流规则,其内容如下所示: +* **group:** service=spring-flow-provider +* **key:** servicecomb.rateLimiting.flowScene +* **content:** +```yaml + # 限制两秒内不能访问超过四次 + limitRefreshPeriod: 2S + rate: 4 + ``` +> 说明1:限流规则的group由`service=`和`${service.name}`组成,其中`${service.name}`为微服务的名称,本示例所使用Demo的微服务名称为spring-flow-provider。 -3. 在`${path}/bin/`目录执行以下命令创建节点`/service=spring-flow-provider/servicecomb.rateLimiting.sceneFlow`和数据`"limitRefreshPeriod: \"2S\"\nname: flow\nrate: \"4\"\n"` +> 说明2:限流规则的key由前缀`servicecomb.rateLimiting`和自定义场景名称组成,本示例设定场景名称为`flowScene`。流量匹配规则和限流规则的key的自定义场景名称需保持一致,才能对匹配的流量执行限流策略。 + +利用ZooKeeper提供的命令行工具下发限流规则: +1. 步骤二已经创建了group节点,在`${zookeeper-path}/bin/`目录执行以下命令创建配置模型的key节点`/service=spring-flow-provider/servicecomb.rateLimiting.flowScene`并设置节点的content: ```shell # linux mac -./zkCli.sh -server localhost:2181 create /service=spring-flow-provider/servicecomb.rateLimiting.sceneFlow "limitRefreshPeriod: 2S -name: flow -rate: 4" - -#windows -zkCli.cmd -server localhost:2181 create /service=spring-flow-provider/servicecomb.rateLimiting.sceneFlow "limitRefreshPeriod: 2S -name: flow +./zkCli.sh -server localhost:2181 create /service=spring-flow-provider/servicecomb.rateLimiting.flowScene "limitRefreshPeriod: 2S rate: 4" ``` -> 说明:${path}为ZooKeeper的安装目录。 +> 说明:${zookeeper-path}为ZooKeeper的安装目录。 ### 验证 -通过curl工具多次请求`localhost:8003/flow`, 若在2秒内请求数超过4个时返回`rate limited`,则触发流控成功,效果如下: - - +通过浏览器多次请求`localhost:8003/flow`若在2秒内请求数超过4个时返回`rate limited`,则触发流控成功,效果如下: + \ No newline at end of file