目录
1.对比hystrix
hystrix:需要手动搭建监控平台,没有一套web界面可以更加细粒度得配置流控、速率控制、服务熔断、服务降级
sentinel:单独一个组件,可以独立出来。直接界面化的细粒度统一配置
2.初始化监控
pom配置:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba.sentinel</artifactId>
</dependency>
yml配置:
spring:
cloud:
sentinel:
transport:
dashboard: localhost:8080
port: 8719 #默认8719端口,假如被占用会自动从8719开始依次+1扫描,直接找到未被占用的端口
3.流控规则
流控模式:
直接:api达到限流条件时,直接限流
关联:当关联的资源达到阀值时,就限流自己
链路:只记录指定链路上的流量
阀值类型:
QPS:当调用该api的qps达到阀值的时候,进行限流
线程数:当调用该api的线程数达到阀值的时候,进行限流
warmup:预热/冷启动方式,当系统长期处于低水位的情况下,当流量突然增加时,直接把系统拉升到高水位可能瞬间把系统压垮,通过"冷启动",让通过的流量缓慢增加,在一定时间内主键增加到阀值上限,给冷系统一个预热的时间,避免冷系统被压垮。
4.降级策略
4.1RT:平均响应时间(秒级)
平均响应时间 超过阀值 且 在时间窗口通过的请求>= 5,两个条件同时满足后触发降级。
窗口期过后关闭断路器
RT最大4900,更大的需要通过-Dcsp.sentinel.statistic.max.rt=xxx
4.2 异常比例(秒级)
QPS>=5 且异常比例(秒级统计)超过阀值时,触发降级;时间窗口结束后,关闭降级
sentinel的熔断是没有半开状态的。
4.3 异常数
异常数:当资源近1分钟的异常数超过阀值之后进行熔断。注意由于统计时间窗口是分钟级别的,若timeWindow小于60s,则结束熔断状态后仍可能再进入熔断状态。时间窗口一定要大于60s
4.4 Sentinel热点key
兜底方法分为系统默认和客户自定义
特殊值配置:参数例外项
5.系统规则
系统保护规则是从应用级别的入口流量进行控制,从单台机器的load,cpu使用率,平均rt,入口qps和并发线程等几个维度监控应用指标,让系统尽可能跑在最大吞吐量的同时保证系统整体的稳定性
系统规则支持以下模式:
load自适应:(仅对linux/unix机器生效)
cpu usage:
平均RT:
并发线程数:
入口qps:
6.客户自定义限流处理
@SentinelResource 注解方式的埋点不支持private 方法
Sentinel主要三个核心api: SphU定义资源、Tracer定义统计、ContextUtil定义了上下文
@Sentinel配置fallback 和 blockHandler都配置
若blockHandler和fallback都进行了配置,则被限流降级而抛出BlockException时只会进入blockHandler处理逻辑
@SentinelResource(exceptionsToIgnore={IllegalArgumentException.class})
7.Sentinel服务熔断OpenFeign
yml:激活Sentinel对Feign的支持
feign:
sentinel:
enable: true
8.规则持久化
一旦重启应用,sentinel规则将消失,生产环境需要将配置规则进行持久化
pom配置:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
yml配置:
spring:
cloud:
sentinel:
port: 8719
datasource:
dsl:
nacos:
server-addr: localhost:8848
dataId: spring-application-name
groupId: DAFAULT_GROUP
data-type: json
rule-type: flow
nacos:配置内容
[
{
"resource":"rate/byUrl",
"limitApp":"default",
"grade":1,//阀值类型0表示线程数,1表示qps
"count":1,//单机阀值
"strategy":0,//流控模式 0直接,1关联,2链路
"controlBehavior":0,//流控效果 0快速失败 1warmup 2排队等待
"clusterMode":false//是否集群
}
]
9.安装sentinel
下载sentinel jar包,javar -jar 启动jar,浏览器访问localhost:9000 默认用户密码sentinel
10.应用对接sentinel
应用启动配置:-Dcsp.sentinel.dashboard.server=xxx.xxx.xxx.xxx:9000
-Dproject.name=Sentinel
10.1 sentinel定义资源的方式
抛出异常方式的定义资源:try(Entry entry = SphU.entry("hello")){}catch(
){
}
返回布尔值方式定义资源:
Spho.entry();
异步调用支持:
Spho.asyncEntry("async");
注解方式定义资源;
主流框架的的默认适配;
10.2 和springcloud整合
配置:spring.cloud.sentinel.transport.dashboard=xx.xx.xx.xx:9000
10.3 和feign 整合
@Feignclient(fallback=xxx.class)xxx.class 实现定义的feign接口;
sentinel配置:Get http:xxxxxx/xxx/
10.4整合spring cloud gateway