下载地址:github.com/alibaba/Sentinel/releases
Sentinel 分为两个部分:
1.核心库(java客户端)不依赖任何框架/库,能够运行于所有Java运行环境,同时对Dubbo/Spring Cloud等框架由较好的支持。
2.控制台(Dashboard)基于Spring Boot开发,打包后可以直接运行,不需要额外的Tomcat等应用。
3.流控规则
参数解释:
流控模式 -> 关联 :例如A 调用B,当B的QPS达到阈值时,就对A进行限流。以减轻B的压力。
流控效果 -> warm Up: 例如 单机阈值为9 ,预热时间为10,即请求从 9/3(冷加载因子)开始,经预热时长逐渐升至设定的QPS阈值。预热方式就是为了保护系统,可以慢慢将流量放进来,慢慢的把阈值增长到设置的阈值。
流控效果 -> 排队等待:这种方式主要用于间隔性突发的流量,比如在某一秒有大量的请求到来,而接下来的几秒则处于空闲状态,我们希望能够在接下来的空闲期间逐渐处理这些请求,而不是在第一秒直接拒绝多余的请求。
流控规则中资源名可使用 URL 亦可使用 @SentinelResource(value="sentinelresource") 中value属性的值。
4.降级规则
Sentinel熔断降级会在调用链路中某个资源出现不稳定状态时(例如调用超时或异常比例升高),对这个资源的调用进行限制,让请求快速失败,避免影响到其他的资源而导致级联错误。
当资源被降级后,在接下来的降级时间窗口内,对该资源的调用都自动熔断(默认行为是抛出DegradeException)
Sentinel熔断器是没有半开状态的。HystrIx 有半开状态。半开状态下,系统会自动检测此时过来的请求是否请求成功,如果成功则关闭断路器,失败则打开断路器
异常数:当资源近一分钟的异常数目超过阈值之后会进行熔断,注意由于异常数量统计的时间窗口时分钟级别的,若时间窗口小于60s,则结束熔断状态后仍可能再次进入熔断状态。
选择异常数熔断策略时间窗口一定要设置为大于等于60s
5.热点key规则
参数索引栏传入参数索引,从0开始。当请求带有这个参数时,QPS超过阈值则进行限流,可通过参数例外项指定参数进行限流。
可在代码中通过@SentinelResource注解的blockHandler配置当请求失败后调用的降级方法,该配置仅处理控制台配置的违规情况,不处理代码中出现的运行时异常。
@GetMapping(value = "test2")
@SentinelResource(value = "test2", blockHandler = "block_test2", fallback = "fallback_test2")
String test2() {
return "test2";
}
String block_test2() {
return "block_test2";
}
String fallback_test2() {
return "fallback_test2";
}
6.系统规则
Sentinel系统自适应限流从整体维度对应用入口流量进行控制,结合应用的Load,CPU使用率,总体平均RT,入口QPS和线程并发数等几个维度的监控指标,通过自适应的流控策略,让系统的入口流量和系统的负载达到一个平衡,让系统尽可能地跑在最大吞吐量的同时保证系统整体的稳定性。
这相当于是一个总的配置,可管理系统中所有的url。例如配置入口QPS 阈值为 1,则该系统中所有地址的QPS 阈值都设置为1
7.@SentinelResource
示例:
@SentinelResource(value = "test2", blockHandlerClass=SentinelBlockHandler .class ,blockHandler = "testHandlerException", fallback = "fallback_test2")
value :指定该配置的名称,一般是当前方法URL 去掉/
blockHandlerClass:指定该方法违背限流规则后,在哪个类中去找 blockHandler属性配置的方法名:
blockHandler:兜底方法名。
例如:
@SentinelResource(value = "test2", blockHandlerClass=SentinelBlockHandler .class ,blockHandler = "testHandlerException")
例如这个方法的QPS超过配置的阈值后,就回去执行下面那个类中的testHandlerException方法。
public class SentinelBlockHandler {
public static String testHandlerException() {
return "这是自定义限流处理方法";
}
}
当@SentinelResource 配置了blockHandler 属性会使用blockHandler 配置的方法进行限流,没配会返回Sentinel自带的限流处理结果。
@SentinelResource 更多属性解释:
8.服务熔断功能
示例:
@GetMapping("server/port/{id}")
@SentinelResource(value = "blockHandler",
blockHandler = "blockHandler",
blockHandlerClass = SentinelBlockHandler.class,
fallback = "fallbackHandler",
fallbackClass = FallbackHandler.class)
String serverPort(@PathVariable(value = "id") int id) {
String forObject = restTemplate.getForObject(SERVER_URI + "/payment/nacos/{id}", String.class, id);
if (id == 4) {
throw new NullPointerException();
}
return forObject;
}
public class FallbackHandler {
public static String fallbackHandler(@PathVariable(value = "id") int id, Throwable e) {
return "this is fallbackHandler," + e.getMessage() + id;
}
}
public class SentinelBlockHandler {
public static String blockHandler(@PathVariable(value = "id") int id, BlockException e) {
return "这是自定义限流处理方法" + e.getMessage() + id;
}
}
上面的示例表示当 serverPort 方法QPS超过阈值时 调用blockHandler 方法 ,当serverport方法抛出异常时调用fallbackaHandler方法。