限流降级可以根据服务提供方的能力和服务消费方的分配能力进行流量控制。其中服务提供方(Service Provider)是指对外提供请求的服务或应用;服务消费方(Service Consumer)是指调用该服务的下游应用。

根据服务提供方限流

为了保护服务提供方不被激增的流量拖垮影响稳定性,您可以为其配置QPS模式的流控规则。当每秒的请求量超过设定的阈值时,AHAS将拒绝多余的请求。提供方限流可以分为服务接口限流和服务方法限流。

  • 服务接口限流:适用于整个服务接口的QPS不超过一定数值的情况。例如:为对应服务接口资源配置QPS阈值。
  • 服务方法限流:适用于服务的某个方法的QPS不超过一定数值的情况。例如:为对应服务方法资源配置QPS阈值。

示例:

若应用A为服务提供方,其Web接口 /queryData对应的方法是queryData(java.lang.String)。假设应用A最多每秒只能承受10次调用。若调用次数超过,则应用A宕机。

ex_1

针对此类场景,可以对应用A按服务方法粒度设置流控规则,限制queryData(java.lang.String)方法每秒最多只能被调用10次,具体操作,请参见配置流控规则。若超过阈值,消费方将会收到一个BlockException异常,并且快速返回。

根据服务消费方限流

根据消费方限流是指根据调用方的需求来分配服务提供方的处理能力。

说明 若限流规则未设置调用方(default),则该限流规则对所有调用方生效。若限流规则设置了调用方,则限流规则仅对指定调用方生效。

示例:

有两个服务消费者A和B都向服务提供方发起调用请求,我们希望优先服务消费方A,而只对来自消费方B的请求进行限流。通过对消费方B设置限流规则(limitApp)来实现这个目的。

ex_2

对于默认框架例如Dubbo,AHAS会自动解析Dubbo消费方的application name作为调用方名称(origin),在进行资源保护的时候都会带上调用方名称。而对于非默认框架,只需要在Sentinel原有的代码中加入ContextUtil.enter(resourceName, origin)ContextUtil.exit()即可。示例代码如下:

Entry entry = null;

//这里代表消费者A的调用。
ContextUtil.enter(queryData, "A");

try {
  // 资源名可使用任意有业务语义的字符串。
entry = SphU.entry("queryData");
  // 被保护的业务逻辑。
} catch (BlockException e1) {
  // 资源访问阻止,被限流或被降级。
  // 进行相应的处理操作。
} finally {
  if (entry != null) {
    entry.exit();
  }
}
//调用结束。
ContextUtil.exit();
说明 ContextUtil.enter(xxx)方法仅在初次调用链路入口时才生效。

更多设置

限流规则中的limitApp(针对来源)支持以下三种选项,分别对应不同的场景:

  • default:适用于不区分消费者的场景。来自任何调用者的请求都将进行限流统计。如果这个资源名的调用总和超过了这条规则定义的阈值,则触发限流。
  • {some_origin_name}:适用于对特定的消费者限流的场景。只有来自这个调用者的请求才会进行流量控制。

    例如,资源A配置了一条针对消费者caller1的规则,那么当且仅当来自消费者caller1对资源A的请求才会触发流量控制。

  • other:表示针对除{some_origin_name}以外的其余调用方的流量进行流量控制。这个场景适用于资源对大部分消费者都有一个通用的阈值,对特定消费者有不一样的阈值的场景。
    例如,资源A可以对大部分消费者可以每秒提供10个请求,但是对于消费者caller1是个例外,对caller1,每秒可以提供200个请求。需配置两条规则,说明如下:
    • 为消费者caller1配置一条limitApp为caller1的限流规则,这条规则每秒的最大请求量设置为200;
    • 同时,配置一条limitApp为other的规则,这条规则每秒的最大请求量设置为10,那么任意来自非caller1对该resource的调用,都不能超过10。
说明 同一个资源名可以配置多条规则,规则的生效顺序为:{some_origin_name}>other>default。