跳到主要内容

Sentinel限流用法

启动sentinel项目

com.alibaba.csp.sentinel.dashboard.JeecgSentinelDashboardApplication

访问地址

http://localhost:9000

账号密码:sentinel/sentinel

说明:第一次访问,内容是空。

访问任意接口,就会出现应用

规则配置

流控配置

1、限流整个微服务模块实例

通过RouteID通过(路由名称)限制整个服务模块的接口

测试验证: 打开接口文档进行测试,点击system模块中任意接口

2、通过API分组限制接口

通过API分组限制某一个或者某一组接口

测试同上,限流详细文档看 官方流控配置

熔断配置

Sentinel 提供以下几种熔断策略:

  • 慢调用比例 (SLOW_REQUEST_RATIO):选择以慢调用比例作为阈值,需要设置允许的慢调用 RT(即最大的响应时间),请求的响应时间大于该值则统计为慢调用。当单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数目,并且慢调用的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求响应时间小于设置的慢调用 RT 则结束熔断,若大于设置的慢调用 RT 则会再次被熔断。
  • 异常比例 (ERROR_RATIO):当单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数目,并且异常的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。异常比率的阈值范围是[0.0, 1.0],代表 0% - 100%。
  • 异常数 (ERROR_COUNT):当单位统计时长内的异常数目超过阈值之后会自动进行熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。

快速点击触发熔断

注:gateway层面只能针对网关进行路由熔断降级。 不能针对@SentinelResource(value ="test")中的tes限流降级, 详细看 官方文档

系统规则

配置说明 系统保护规则是从应用级别的入口流量进行控制,从单台机器的 load、CPU 使用率、平均 RT、入口 QPS 和并发线程数等几个维度监控应用指标,让系统尽可能跑在最大吞吐量的同时保证系统整体的稳定性。

系统保护规则是应用整体维度的,而不是资源维度的,并且仅对入口流量生效。入口流量指的是进入应用的流量(EntryType.IN),比如 Web 服务或 Dubbo 服务端接收的请求,都属于入口流量。

系统规则支持以下的模式:

  • Load 自适应(仅对 Linux/Unix-like 机器生效):系统的 load1 作为启发指标,进行自适应系统保护。当系统 load1 超过设定的启发值,且系统当前的并发线程数超过估算的系统容量时才会触发系统保护(BBR 阶段)。系统容量由系统的maxQps * minRt估算得出。设定参考值一般是CPU cores * 2.5
  • CPU usage(1.5.0+ 版本):当系统 CPU 使用率超过阈值即触发系统保护(取值范围 0.0-1.0),比较灵敏。
  • 平均 RT:当单台机器上所有入口流量的平均 RT 达到阈值即触发系统保护,单位是毫秒。
  • 并发线程数:当单台机器上所有入口流量的并发线程数达到阈值即触发系统保护。
  • 入口 QPS:当单台机器上所有入口流量的 QPS 达到阈值即触发系统保护。

一下配置表示全局所有入口每秒只能通过1次

测试如下

热点规则

何为热点?热点即经常访问的数据。很多时候我们希望统计某个热点数据中访问频次最高的 Top K 数据,并对其访问进行限制。比如:

  • 商品 ID 为参数,统计一段时间内最常购买的商品 ID 并进行限制
  • 用户 ID 为参数,针对一段时间内频繁访问的用户 ID 进行限制

热点参数限流会统计传入参数中的热点参数,并根据配置的限流阈值与模式,对包含热点参数的资源调用进行限流。热点参数限流可以看做是一种特殊的流量控制,仅对包含热点参数的资源调用生效。

配置说明

以sysetm模块职务列表为例说明

1.添加 @SentinelResource(value = "position")注解 value名字就是资源名如下图

2.添加热点规则

或者通过热点规则菜单添加

3.测试热点规则,此处设置参数索引为0,仅做测试,具体场景需要结合真实业务场景

4.编写热点规则拦截器,系统内置规则代码如下(当不满足业务规则时需自行修改拦截规则)

/**
* sentinel ip授权规则拦截器(黑名单白名单),改规则支持参数和IP拦截模式,当参数为空时走ip拦截模式
*
* @author zyf
*/
@Component
public class DefaultRequestOriginParser implements RequestOriginParser {
@Override
public String parseOrigin(HttpServletRequest request) {
//基于请求参数,origin对应授权规则中的流控应用名称,也可通过getHeader传参
String origin = request.getParameter("origin");
if (StringUtils.isNotEmpty(origin)) {
return origin;
} else {
//当参数为空使用ip拦截模式
String ip = IpUtils.getIpAddr(request);
return ip;
}
}
}

授权规则

很多时候,我们需要根据调用来源来判断该次请求是否允许放行,这时候可以使用 Sentinel 的来源访问控制(黑白名单控制)的功能。来源访问控制根据资源的请求来源(origin)限制资源是否通过,若配置白名单则只有请求来源位于白名单内时才可通过;若配置黑名单则请求来源位于黑名单时不通过,其余的请求通过。

规则配置

来源访问控制规则(AuthorityRule)非常简单,主要有以下配置项:

  • resource:资源名,即限流规则的作用对象。
  • limitApp:对应的黑名单/白名单,不同 origin 用,分隔,如appA,appB
  • strategy:限制模式,AUTHORITY_WHITE为白名单模式,AUTHORITY_BLACK为黑名单模式,默认为白名单模式。

1.添加授权规则

2.测试授权规则

当origin=app1时如下图

当origin=app2时如下图