全部产品
云市场

开始使用限流熔断

更新时间:2019-11-15 10:43:32

限流熔断 (Guardian) 是一个限流组件,您可通过在业务系统中集成该组件,配置限流规则来提供限流服务,从而保证业务系统不会被大量突发请求击垮,提高系统稳定性。

  • 支持对 RPC 接口和普通 Bean 的方法进行限流。
  • 支持方法限流和方法参数条件限流,参数条件限流支持 MVEL 的完整能力。
  • 支持多个方法合并限流。
  • 支持对 Web 请求以及 Web 请求的参数条件限流。
  • 支持监控模式和拦截模式。
  • 支持切换限流算法:QPS 计数算法和令牌桶算法。
  • 支持多种限流条件:单位时间计数、堆内存使用量、CPU 负载、并发线程数。
  • 支持多种限流后置处理,包括空处理(丢弃调用)、抛出异常等。

限流熔断的规则配置依赖于动态配置推送,所以接入限流熔断前必须先接入动态配置。

限流熔断快速入门

开始使用前,请确认您已经完成系统环境配置,详情见 前置条件

使用限流熔断限流的流程为:

  1. 开发编码并接入限流熔断客户端组件
  2. 云端部署应用
  3. 配置限流任务

开发编码并接入限流熔断客户端组件

引入 Maven 依赖

  1. 接入动态配置客户端,详见 动态配置快速开始
  2. 在工程 pom.xml 文件中引入限流熔断依赖:
    1. <dependency>
    2. <groupId>com.alipay.sofa</groupId>
    3. <artifactId>guardian-sofa-boot-starter</artifactId>
    4. </dependency>

配置 Spring Bean 和 AOP 拦截器

在上一步添加 guardian-sofa-boot-starter 后,应用已经可以对 SOFARPC 接口和 Spring MVC 请求进行限流。

如果还要对内部通过 Spring Bean 定义的方法限流,则需要在 Spring Bean 配置文件中添加配置 AOP 拦截器。示例如下:

  1. <!-- 引入限流熔断中定义的 bean -->
  2. <import resource="classpath:META-INF/spring/guardian-sofalite.xml"/>
  3. <!-- 配置 AOP 拦截器 -->
  4. <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
  5. <property name="interceptorNames">
  6. <list>
  7. <value>guardianExtendInterceptor</value>
  8. </list>
  9. </property>
  10. <property name="beanNames">
  11. <list>
  12. <!-- 配置需要被拦截的 bean -->
  13. <value>*DAO</value>
  14. </list>
  15. </property>
  16. <!-- 如要使用 CGLIB 代理,取消下面这行的注释 -->
  17. <!-- <property name="optimize" value="true" /> -->
  18. </bean>

云端部署应用

将开发完成的应用部署到 SOFAStack 上,以开始对平台上的应用进行限流配置。操作步骤请参考 SOFABoot 快速开始 > 发布部署

配置限流任务

应用部署完成后,您必须前往 微服务平台 > 微服务 > 限流熔断 进行限流任务的创建与配置。操作步骤如下:

  1. 如果要限流的应用不在应用列表中:
    1. 点击 新增应用
    2. 输入需要限流的应用名称。
    3. 点击 确定

      说明:如出现“数据库异常”错误,请检查输入的应用名称是否已经存在。

  2. 选择要限流的应用,点击 新建规则,跳转至规则详情页面。
  3. 配置以下规则信息,所有内容均为必填项。有关规则的详细说明,请参见 限流规则说明
    • 规则名称
    • 限流类型
    • 运行模式
    • 限流算法
      • 单机 QPS < 100 时,建议使用使用令牌桶算法。
      • 单机 QPS > 100 时,可以选择 QPS 算法和令牌桶算法。
      • 不能容忍单个周期放过的请求数超过限流值时,选择 QPS 算法。
    • 限流后置操作
    • 限流条件模型及阈值
    • 限流对象
  4. 选择提交或灰度推送:
    • 提交:确认保存并提交规则。
    • 灰度推送:将更改后的规则推送到指定的几台机器上用以验证。更改的规则仅保存在被推送的服务器内存中,不写入数据库。

使用灰度推送

在您编辑限流规则时,若不确定规则是否正确,可以使用灰度推送功能,将限流规则推送到限定的几台机器上用以测试。操作步骤如下:

  1. 在规则列表中选择要推送的规则,点击 修改 进入规则编辑页面。
  2. 点击底部的 灰度推送
  3. 在弹窗中选择要推送的机器 IP 地址。只有该规则的订阅者机器 IP 会出现在列表中。您可以使用弹窗右上角的搜索栏进行快速筛选。
  4. 点击 推送
  5. 在对应的服务器上验证限流结果。

说明:限流熔断使用动态配置的灰度推送功能。灰度推送的数据不会保存到数据库,只会保存在于被推送到的服务器的内存中。服务器重启后推送的规则被还原,仍使用更改前的规则。

导入导出限流规则

若要将同一规则作用于多个应用,您可以导入导出限流规则,进行规则迁移。

导出限流规则

限流规则的导出是以应用为维度进行的,在应用右侧的 操作 列中点击 更多 > 导出 即可导出限流规则,如下图:

导入导出

导出数据格式说明

导出的数据为 JSON 格式,格式化后如下:

  1. [
  2. {
  3. "actionConfig": {
  4. "actionType": "LIMIT_EXCEPTION",
  5. "responseContent": "ssssssssss"
  6. },
  7. "calculationConfigs": [
  8. {
  9. "calculationType": "INVOKE_BY_TIME",
  10. "maxAllow": 1,
  11. "period": 1000
  12. }
  13. ],
  14. "desc": "GuardianApp.query",
  15. "enable": false,
  16. "globalLimit": false,
  17. "limitStrategy": "QpsLimiter",
  18. "limitType": "GENERIC_LIMIT",
  19. "maxBurstRatio": 0,
  20. "resourceConfigs": [
  21. {
  22. "baseName": "com.alipay.antcloud.dsrconsole.core.service.guardian.facade.GuardianAppFacade.query",
  23. "resourceType": "METHOD",
  24. "ruleIds": [ ]
  25. },
  26. {
  27. "baseName": "11.22",
  28. "resourceType": "METHOD",
  29. "ruleIds": [ ]
  30. }
  31. ],
  32. "resourceType": "METHOD",
  33. "runMode": "CONTROL",
  34. "trafficType": "ALL"
  35. }
  36. ]

说明

  • actionConfig:后置处理动作
    • actionType:后置动作类型
    • responseContent:如果后置动作类型为限流异常,则此字段表示异常信息
  • calculationConfigs:限流计算阈值
    • calculationType:限流计算类型
    • maxAllow:限流阈值
    • period:限流计算周期
  • desc:限流规则描述
  • enable:是否开启限流规则,导出规则均默认为不开启
  • limitStrategy:限流算法类型
  • maxBurstRatio:令牌桶算法的存量桶系数
  • resourceConfigs:限流对象
    • baseName:限流对象名,如接口名+方法名,Web 请求的 URI
    • resourceType:目标对象类型,如接口的方法、Web 请求
  • runMode:运行模式,如拦截模式/监控模式

导入限流规则

在应用右侧的 操作 列中点击 更多 > 导入,可通过导入上文所述的 JSON 文件来导入限流规则。

注意

  • 导入的限流规则均默认为不开启,如果需要启用,需要在界面上进行手动开启。
  • 导入和导出均以应用为维度进行,导出的规则可以导入至任何一个其他应用中。
  • 系统会根据规则名称过滤掉已存在的规则,所以在同一个应用中,同一个规则不会被重复导入。

查看限流日志

限流熔断的限流日志打印在 logs/guardian 中,该路径下存在多个日志文件,分别打印不同的日志内容。

限流熔断默认日志

限流熔断的默认日志是 guardian/guardian-default.log,主要打印推送下来的限流配置信息,日志内容没有固定格式.

样例:

  1. 2016-12-12 19:49:09,610 INFO Registring GuardianCodeWrapperInterceptor
  2. 2016-12-12 19:49:10,757 WARN receive message with key=[guardianConfig] and value=[{"@type":"com.alipay.guardian.client.drm.GuardianConfig","engineConfigs":{"@type":"java.util.HashMap","LIMIT":{"@type":"com.alipay.guardian.client.engine.limit.LimitEngineConfig","actionConfigMap":{"@type":"java.util.HashMap",880:{"@type":"com.alipay.guardian.client.engine.limit.LimitActionConfig","actionType":"LIMIT_EXCEPTION","id":880,"responseContent":"限流配置-接口-多计算模型-抛出异常"}},"globalConfig":{"enable":true,"runMode":"CONTROL"},"resourceConfigList":[{"baseName":"com.alipay.guardiantestsofalite.facade.GuardianTestTrServiceFacade.testLimitBasicCondition","id":379,"resourceType":"METHOD","ruleIds":[880]}],"ruleConfigMap":{"@type":"java.util.HashMap",880:{"@type":"com.alipay.guardian.client.engine.limit.LimitRuleConfig","actionId":880,"calculationConfigs":[{"calculationType":"INVOKE_BY_TIME","maxAllow":10,"period":5000},{"calculationType":"INVOKE_BY_TIME","maxAllow":10,"period":5000},{"calculationKey":"[0].booleanValue","calculationType":"INVOKE_BY_TIME_CATEGORY","period":5000,"tairCompareKey":"true>5,false>6"}],"enable":true,"extParamConfigs":[],"id":880,"limitType":"GENERIC_LIMIT","paramConfigs":[{"checkMode":"BYVALUE","compare":"EQUALS","key":"[0].stringValue","value":"testStrMutilBasicParams"},{"checkMode":"BYVALUE","compare":"EQUALS","key":"[1].stringValue","value":"MultileCalculations"}],"paramRelation":"AND","ruleBizId":"[tr]限流配置-接口-基本参数多项-多个计算模型","runMode":"CONTROL","trafficType":"all"}}},"FUSE":{"@type":"com.alipay.guardian.client.engine.fuse.FuseEngineConfig","actionConfigMap":{"@type":"java.util.HashMap"},"ruleConfigMap":{"@type":"java.util.HashMap"}}},"version":1}]
  3. 2016-12-12 19:49:10,759 WARN after update with key=[guardianConfig]
  4. 2016-12-12 19:49:11,195 INFO Guardian Config version=1
  5. 2016-12-12 19:49:11,197 WARN rebuild Rules, GuardianFactory: class com.alipay.guardian.client.limit.LimitGuardianFactory

限流熔断运行错误日志

限流熔断的运行时错误日志是 guardian/guardian-error.log,主要打印一些错误信息,其中的错误堆栈信息需要重点关注,日志内容没有固定格式。

限流熔断限流统计日志

限流熔断的限流统计日志是 guardian/guardian-limit-stat.log,日志内容的固定格式如下:

  1. CONTROL/MONITOR,id,规则名称,统计间隔,开始时间,结束时间,统计类型,限流阈值,总请求数,放行数,限流数
  • MONITOR:表示当前的限流模式是监控模式
  • CONTROL:表示当前的限流模式是拦截模式
  • 倒数第四位:限流规则阈值
  • 倒数第三位:限流周期内的总请求数
  • 倒数第二位:限流周期内的放行请求数
  • 倒数第一位:表示当前限流周期内被限流的请求数

样例:

  1. 2016-11-21 00:00:02,001 INFO MONITOR, 43,规则名字,1000,2016-11-21T00:00:01,2016-11-21T00:00:02INVOKE_BY_TIME,10,40,10,30

配置参数条件过滤

对于接口方法类的限流规则,如果需要指定限流的指定具体的接口及方法,您必须完成方法签名的配置。

在配置方法名时,您可以根据实际情况选择是否在方法签名中添加参数。

方法不添加参数

如果没有重载方法,或需要对所有重载方法限流,则不需要添加参数。

例如,若限流对象接口中有以下几个同名方法:

  1. testBreakerScriptCondition(){}
  2. testBreakerScriptCondition(String name, Integer value){}
  3. testBreakerScriptCondition(int a, int[] al){}

配置限流对象方法为 testBreakerScriptCondition 则对所有同名方法的总流量限流。

方法添加参数

接口中有多个同名方法时,如果需要对某个具体方法限流,可以添加入参。添加参数时需要注意以下几点:

  • 不要使用形参。
  • 入参类型使用完整的类名。
  • 参数的逗号前后不要有空格。
  • 支持基本类型和基本类型数组。例如:对于方法 foo(int a, int[] al),因为 int[] 的类型是 [I,所以对应的方法配置为 foo(int,[I),其他基本类型的数组以此类推。

下面是添加参数的方法示例:

  • testBreakerScriptCondition(java.lang.String,java.lang.Integer)
  • testBreakerScriptCondition(int,[I)