1、Sentinel 是什么?
随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
Sentinel 具有以下特征:
- 丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。
- 完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。
- 广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Dubbo、gRPC 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。
- 完善的 SPI 扩展点:Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。
2、Sentinel 作用?
- 容错
- 流量监控 可以监控到每一个接口的实时的流量qps(每秒接口请求数量)
- 熔断降级
熔断: 现实中:当电流过大 ,保险丝熔断 保护电器 微服务中:当流量过大,异常数量超过一定阈值,就会触发熔断,调用降级的策略 响应用户的数据 降级 : 兜底数据
容错
1(接上篇nacos)在feign-consumer 中引入 哨兵依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
2.在配置文件开启哨兵容错
#开启哨兵容错
feign.sentinel.enabled=true
3.使用哨兵配置容错策略
3.1 在controller中加入传递兜底数据的方法
/**
* 容错的方法 返回值 一定要和 处理器返回的方法 一样,否则前端 会报错
*
* 兜底数据
* @return
*/
public Student fallBackTest4() {
Student student = new Student();
student.setName("哨兵容错,兜底数据");
return student;
}
3.2 在controller中配置Sentinel的容错策略
@SentinelResource(value = "test4",fallback = "fallBackTest4")
@RequestMapping("test4")
public Student test4(){
return feginService.updateStudent(new Student(1,"李四",12));
}
4.只启动 feign -consumer,不启动provider 进行测试
关闭feign容错
sentinel容错生效
使用哨兵Sentinel 控制台
Sentinel 控制台提供一个轻量级的控制台,它提供机器发现、单机资源实时监控、集群资源汇总,以及规则管理的功能。您只需要对应用进行简单的配置,就可以使用这些功能。
- 流量监控
- 熔断降价
安装配置控制
1.下载
sentinel-dashboard-1.8.0 (1).jar
2.在对应的路径下 使用cmd启动
java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.0.jar
3.访问
http://localhost:8080/#/login 用户名:sentinel 密码:sentinel
流量监控
4.将应用接入到 控制台
#配置哨兵地址 将每一次请的信息 提交到 哨兵控制台
spring.cloud.sentinel.transport.dashboard=localhost:8080
5.重启动 feign-consuer ,多访问几次接口,在哨兵控制台就可以看到监控的流量
熔断降级
基于流量的熔断降级
1.配置熔断降级规则
在controller中 注解中加入blockHandle
@SentinelResource(value = "test4",fallback = "fallBackTest4",blockHandler = "blockHandleTest4")
@RequestMapping("test4")
public Student test4(){
return feginService.updateStudent(new Student(1,"李四",12));
}
/**
* 容错的方法 返回值 一定要和 处理器返回的方法 一样,否则前端 会报错
*
* 兜底数据
* @return
*/
public Student fallBackTest4() {
Student student = new Student();
student.setName("哨兵容错,兜底数据");
return student;
}
/**
* 熔断降级 规则
*
* 该规则 中必须有 BlockException e 形式参数,否则该降级策略无法生效
* 兜底数据
* @return
*/
public Student blockHandleTest4(BlockException e){
e.printStackTrace();
Student student = new Student();
student.setName("触发熔断降级");
return student;
}@SentinelResource(value = "test4",fallback = "fallBackTest4",blockHandler = "blockHandleTest4")
@RequestMapping("test4")
public Student test4(){
return feginService.updateStudent(new Student(1,"李四",12));
}
2.在控制台增加流控规则 (一定要注意,应用重启,流控规则失效)
3.快速的刷新请求 测试
降级规则
1 平均响应时间 (DEGRADE_GRADE_RT):当资源的平均响应时间超过阈值(DegradeRule 中的 count,以 ms 为单位)之后,资源进入准降级状态。接下来如果持续进入 5 个请求,它们的 RT 都持续超过这个阈值,那么在接下的时间窗口(DegradeRule 中的 timeWindow,以 s 为单位)之内,对这个方法的调用都会自动地返回(抛出 DegradeException)。在下一个时间窗口到来时, 会接着再放入5个请求, 再重复上面的判断.
2 异常比例 (DEGRADE_GRADE_EXCEPTION_RATIO):当资源的每秒异常总数占通过量的比值超过阈值(DegradeRule 中的 count)之后,资源进入降级状态,即在接下的时间窗口(DegradeRule中的 timeWindow,以 s 为单位)之内,对这个方法的调用都会自动地返回。异常比率的阈值范围是 [0.0, 1.0],代表 0% - 100%。
3 异常数 (DEGRADE_GRADE_EXCEPTION_COUNT):当资源近 1 分钟的异常数目超过阈值之后会进行熔断。