0%

Sentinel热点

Sentinel热点

热点即经常访问的数据。很多时候我们希望统计某个热点数据中访问频次最高的 Top K 数据,并对其访问进行限制,热点参数限流会统计传入参数中的热点参数,并根据配置的限流阈值与模式,对包含热点参数的资源调用进行限流。热点参数限流可以看做是一种特殊的流量控制,仅对包含热点参数的资源调用生效,Sentinel 利用 LRU 策略统计最近最常访问的热点参数,结合令牌桶算法来进行参数级别的流控。

热点规则

对应配置

热点参数规则(ParamFlowRule)类似于流量控制规则(FlowRule):

属性 说明 默认值
resource 资源名,必填
count 限流阈值,必填
grade 限流模式 QPS 模式
durationInSec 统计窗口时间长度(单位为秒),1.6.0 版本开始支持 1s
controlBehavior 流控效果(支持快速失败和匀速排队模式),1.6.0 版本开始支持 快速失败
maxQueueingTimeMs 最大排队等待时长(仅在匀速排队模式生效),1.6.0 版本开始支持 0ms
paramIdx 热点参数的索引,必填,对应 SphU.entry(xxx, args) 中的参数索引位置
paramFlowItemList 参数例外项,可以针对指定的参数值单独设置限流阈值,不受前面 count 阈值的限制。仅支持基本类型和字符串类型
clusterMode 是否是集群参数流控规则 false
clusterConfig 集群流控相关配置

使用@SentinelResource注解来定义资源,在页面中配置对应资源的参数索引、阈值以及统计窗口,如果参数超过阈值,则会执行blockHandler所配置的方法

这里的@SentinelResource与Hystrix的@HystrixCommand注解很相似

1
2
3
4
5
6
7
8
9
10
11
@RequestMapping("/testC")
@SentinelResource(value = "/test/testC",blockHandler = "blockHandler")
public String testC(@RequestParam("did") String did,
@RequestParam("ip") String ip){
return "testC";
}


public String blockHandler(String did, String ip, BlockException e){
return "blockHandler";
}

@SentinelResource

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface SentinelResource {

// 资源名称
String value() default "";


// entry类型
EntryType entryType() default EntryType.OUT;

/**
* @return the classification (type) of the resource
* @since 1.7.0
*/
int resourceType() default 0;


// 如果由于规则触发的BlockException则会执行blockHandler所配置的方法,如果没有配置,则使用默认的
String blockHandler() default "";


// 为了使业务处理与容错方法解耦,可以将容错处理抽离成一个类,blockHandlerClass配置该处理类,其中的方法使用static静态方法,使用blockHandler配置所调用的方法名称
Class<?>[] blockHandlerClass() default {};


// fallback的方法名称,与Hystrix中类似,处理异常方法,与blockHandler不同的是,blockHandler只能处理BlockException
String fallback() default "";

/**
* The {@code defaultFallback} is used as the default universal fallback method.
* It should not accept any parameters, and the return type should be compatible
* with the original method.
*
* @return name of the default fallback method, empty by default
* @since 1.6.0
*/
String defaultFallback() default "";


// 为了使业务处理与容错方法解耦,可以将容错处理抽离成一个类,fallbackClass配置该处理类,其中的方法使用static静态方法,使用fallback配置所调用的方法名称
Class<?>[] fallbackClass() default {};

/**
* @return the list of exception classes to trace, {@link Throwable} by default
* @since 1.5.1
*/
Class<? extends Throwable>[] exceptionsToTrace() default {Throwable.class};


// 所排除的异常,不会进入fallback逻辑
Class<? extends Throwable>[] exceptionsToIgnore() default {};
}