sentinel简介
Sentinel的官方标题是:分布式系统的流量防卫兵。从名字上来看,很容易就能猜到它是用来作服务稳定性保障的。对于服务稳定性保障组件,如果熟悉Spring Cloud的用户,第一反应应该就是Hystrix。但是比较可惜的是Netflix已经宣布对Hystrix停止更新。那么,在未来我们还有什么更好的选择呢?除了Spring Cloud官方推荐的resilience4j之外,目前Spring Cloud Alibaba下整合的Sentinel也是用户可以重点考察和选型的目标。
Sentiner与hystrix的区别:
解决雪崩问题的常见方式:
- 1、超时处理:设定超时时间,请求超过一定的时间没有响应就返回错误信息,不会无休止等待。
- 2、舱壁模式:限定每个业务能使用的线程数,避免耗尽整个tomcat资源,因此也叫线程隔离。
- 3、熔断降级:有断路器统计业务执行的异常比例,如果超出阈值则会熔断业务,拦截访问该业务的一切请求。
- 4、流量控制:限制业务访问的QPS,避免服务因流量的突增而故障。
安装并整合sentinel
Sentinel的使用分为两部分:
- sentinel-dashboard:与hystrix-dashboard类似,但是它更为强大一些。除了与hystrix-dashboard一样提供实时监控之外,还提供了流控规则、熔断规则的在线维护等功能。
- 客户端整合:每个微服务客户端都需要整合sentinel的客户端封装与配置,才能将监控信息上报给dashboard展示以及实时的更改限流或熔断规则等。
(1)启动sentinel-dashboard
下载地址:sentinel-dashboard-1.6.0.jar
其他版本:Sentinel/releases
通过命令启动:
java -jar sentinel-dashboard-1.6.0.jar
默认情况下,sentinel-dashboard以8080端口启动。由于sentinel-dashboard是一个标准的spring boot应用,所以如果要自定义端口号等内容的话,可以通过在启动命令中增加参数来调整,比如:
java -jar sentinel-dashboard-1.6.0.jar --server.port=8888
所以可以通过访问:localhost:8888 来验证是否已经启动成功,如果一切顺利的话,可以看到登录页面(默认用户名和密码都是sentinel)。
(2)整合Sentinel
依赖:
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId></dependency>
配置:
spring.application.name=alibaba-sentinel-rate-limiting
server.port=8002# sentinel dashboard
spring.cloud.sentinel.transport.dashboard=localhost:8888
主类:
package com.example.demospringboot;import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@SpringBootApplication
@Slf4j
public class DemospringbootApplication {public static void main(String[] args) {SpringApplication.run(DemospringbootApplication.class, args);}@Slf4j@RestControllerstatic class TestController {@GetMapping("/hello")public String hello() {return "Hello World";}}
}
启动应用,并执行curl命令:
此时,在上面启动的Sentinel Dashboard中就可以当前我们启动的alibaba-sentinel-rate-limiting这个服务以及接口调用的实时监控了。具体如下图所示:
配置限流规则
在完成了上面的两节之后,我们在alibaba-sentinel-rate-limiting服务下,点击簇点链路菜单,可以看到如下界面:
通过点击流控按钮,来为该接口设置限流规则,比如:
流控模式:
- 直接:统计当前资源的请求,触发阈值时对当前资源直接限流,也是默认模式。
- 关联:统计与当前相关的另一个资源,触发阈值时,对当前资源限流。
- 链路:统计从指定链路访问到本资源的请求,触发阈值时,对指定链路限流,即只限流从指定接口进来的
流控效果:
-
快速失效:达到阈值后,新的请求会被立即拒绝并抛出FlowException异常。是默认的处理方式。
-
warm up:预热模式,对超出阈值的请求同样是拒绝,并抛出异常。但这种模式阈值会动态变化,从一个较小的值逐渐增加到最大值。请求阈值初始值是 threshold/coldFactor(默认值是3),持续指定时长后,逐渐提高到threshould值。例如,我设置QPS的threshold的为10,预热时间为5秒,那么初始阈值就是10/3,也就是3,然后在5秒后逐渐增长到10.
-
排队等待:让所有请求按照先后次序进入一个队列中排队执行,两个请求的间隔不能小于指定时长。例如:QPS = 5,意味着每200ms处理一个队列中的请求;timeout =2000,意味着预期等待超过2000ms的请求会被拒绝并抛出异常。
参考案例
点击新增按钮之后,可以看到如下界面:
其实就是左侧菜单中流控规则的界面,这里可以看到当前设置的所有限流策略。在完成了上面所有内容之后,我们可以尝试一下快速的调用这个接口,看看是否会触发限流控制,比如:
可以看到,快速的调用/hello接口之后,调用被限流了。
在 sentinel-dashboard界面,也可以看到对应统计: