**Sentinel是面向分布式服务架构的轻量级流量控制组件,主要以流量为切入点,从限流、流量整形、服务降级、系统负载保护等多个维度来帮助我们保障微服务的稳定性。**
1、Sentinel的特性
- 丰富的应用场景
- 实时监控
- 开源生态支持
- SPI扩展点支持
2、Sentinel的组成
- 核心库:不依赖任何框架/库,能够运行于所有JAVA运行时环境,同时对Dubbo、Spring Cloud 等框架也有较好的支持。
- 控制台:基于Spring Boot开发,打包后可以直接运行,不需要额外的Tomcat等应用容器。
3、Sentinel Dashboard的部署
- 在GitHub中Sentinel的源码仓库中:
- 直接下载源码通过mvn clean package自己构建
- 直接在Release页面下载已经构建好的 Jar,地址:https://github.com/alibaba/Sentinel/releases。
- 命令启动控制台
4、Sentinel的基本应用
4.1、实现限流的简单demo
引入Sentinel核心库
1 | <dependency> |
示例代码
1 | private static void doSomeThing(){ |
4.2、资源的定义方式
// 通过抛出异常的方式来定义一个资源,会抛出一个BlockException异常 try(Entry entry = SphU.entry("resourceName")){ // resourceName可以定义为方法名称、接口名称或其他唯一标识 // 被保护的业务逻辑 }catch(BlockException e){ // 被限流 } <!--2-->
// 注意: blockHandler所配置的值blockHandlerForUser会在触发限流之后调用,这个方法必须和原始方法getUserById的返回值、参数保持一致,而且需要增加BlockException参数 (value = "resourceName",blockHandler = "blockHandlerForUser") public void getUserById(String id){ // 业务逻辑 } public void blockHandlerForUser(String id, BlockException e){ // 被限流后的处理方法 } <!--3-->
4.3.1、基于并发数和QPS的流量控制
- 并发线程数(FLOW_GRADE_THREAD)
- QPS (FLOW_GRADE_QPS)
并发线程数:并发线程数限流用来保护业务线程不被耗尽;Sentinel并发线程数限流就是统计当前请求的上下文线程数量,如果超出阈值,新的请求就会被拒绝。
QPS:QPS表示每秒的查询数,也就是一台服务器每秒能够响应的查询次数,当QPS达到限流的阈值时,就会触发限流策略。
4.3.2、QPS流量控制行为
直接拒绝 (CONTROL_BEHAVIOR_DEFAULT);
默认的流量控制方式,也就是请求流量超出阈值时,直接抛出一个FlowException
Warm Up(CONTROL_BEHAVIOR_WARM_UP);
是一种冷启动方式,请求处理的数量逐步递增,并在一个预期时间之后达到允许处理请求的最大值。
匀速排队 (CONTROL_BEHAVIOR_RATE_LIMITER);
严格控制请求通过的间隔时间,让请求以匀速的速度通过,相当于前面讲的漏桶限流算法。
冷启动 + 匀速排毒 (CONTROL_BEHAVIOR_WARM_UP_RATE_LIMITER);
4.3.3、调用关系流量策略
调用关系包括调用方和被调用方,调用关系流量策略就是根据不同的维度来触发流量控制。
根据调用方限流
根据请求来源进行流量控制,我们需要设置limitApp属性来设置来源信息,他有三个选项
- default:表示不区分调用者,也就是任何访问调用者的请求都会进行限流统计。
- {some_origin_name}:设置特定的调用者,只有来自这个调用者的请求才会进行流量统计和控制。
- other:表示针对除{some_origin_name}外的调用者进行流量控制。
由于同一个资源可以设置多个规则,规则的生效顺序为:{some_origin_name} →other→default
根据调用链路入口限流
只根据某个路口来进行流量统计
具有关系的资源流量控制(关联流量控制)
当两个资源之间存在依赖关系,我们就说这两个资源存在关联,关联流量控制就是限制其中一个资源的执行流量。
4.4、Sentinel实现服务熔断
1 | private static void initDegradeRule(){ |
Sentinel提供三种熔断策略,对于不同策略,参数的含有也不相同。
平均相应时间(RuleConstant.DEGRADE_GRADE_RT):
如果1s内持续进入了5个请求,对应的平均响应时间都超过了阈值(count,单位ms),那么在接下来的时间窗口内(timeWindow,单位为s)内,对这个方法的调用都会自动熔断,抛出DegradeException
异常比列(RuleConstant.DEGRADE_GRADE_EXCEPTION_RATIO):
如果每秒资源数 ≥ minRequestAmount,并且每秒的异常总数占总通过量的比例超过阈值,则资源将进入降级状态。同样,在接下来的时间窗口内(timeWindow,单位为s)内,对这个方法的调用都会自动熔断
异常数(RuleConstant.DEGRADE_GRADE_EXCEPTION_COUNT):
当资源最近一分钟的异常数目超过阈值之后,会触发熔断。需要注意的是,如果timeWindow小于60s,则结束熔断状态后仍然可能再进入熔断状态