1.是什么
面向云原生微服务的流量控制、熔断降级组件,随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。
2.之前学习的Hystrix
缺点:(1).需要我们程序员自己手工搭建监控平台
(2).没有一套web界面可以给我们进行更加细粒度化得配置流控、速率控制、服务熔断、服务降级。
3.Sentinel优点
(1).单独一个组件,可以独立出来
(2).直接界面化的细粒度统一配置。
4.Sentinel 具有以下特征:
5.主要特性
6.Sentinel分为两个部分:
核心库不依赖任何框架/库,能够运行于所有java运行时环境,同时对Dubbo/Spring Cloud等框架也有较好的支持。
控制台基于Spring Boot开发,打包后可以直接运行,不需要额外的Tomcat等应用容器。
1.官网下载:https://github.com/alibaba/Sentinel/releases
sentinel-dashboard-1.7.0.jar
2.运行dos命令,显示如下,启动成功。
java -jar sentinel-dashboard-1.7.0.jar
3.输入地址:http://localhost:8080/#/dashboard
账号密码都是sentinel,如下页面启动成功。
1.引入pom文件
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
com.alibaba.csp
sentinel-datasource-nacos
com.alibaba.cloud
spring-cloud-starter-alibaba-sentinel
2.yml文件
server:
port: 8401
spring:
application:
name: cloudalibaba-sentinel-service
cloud:
nacos:
discovery:
server-addr: localhost:8848 #Nacos服务注册中心地址
sentinel:
transport:
dashboard: localhost:8080 #配置Sentinel dashboard地址
port: 8719
3.业务代码
@RestController
@Slf4j
publicclassFlowLimitController
{
@GetMapping("/testA")
publicStringtestA()
{
return"------testA";
}
@GetMapping("/testB")
publicStringtestB()
{
log.info(Thread.currentThread().getName()+"\t"+"...testB");
return"------testB";
}
@GetMapping("/testD")
publicStringtestD()
{
//try{TimeUnit.SECONDS.sleep(1);}catch(InterruptedExceptione) //{e.printStackTrace();}
//log.info("testD测试RT");
log.info("testD异常比例");
intage=10/0;
return"------testD";
}
@GetMapping("/testE")
publicStringtestE()
{
log.info("testE测试异常数");
intage=10/0;
return"------testE测试异常数";
}
@GetMapping("/testHotKey")
@SentinelResource(value="testHotKey",blockHandler="deal_testHotKey")
publicStringtestHotKey(@RequestParam(value="p1",required=false)Stringp1,
@RequestParam(value="p2",required=false)Stringp2)
{
//intage=10/0;
return"------testHotKey";
}
publicStringdeal_testHotKey(Stringp1,Stringp2,BlockExceptionexception)
{
return"------deal_testHotKey,o(╥﹏╥)o";//sentinel系统默认的提示:BlockedbySentinel(flowlimiting)
}
4.启动访问
http://localhost:8401/testHotKey
Sentinel控制台会实时监控
(1)阈值类型
QPS代表每秒请求数量:当调用该api的QPS达到阈值的时候,进行限流。
线程数:当调用该api的线程数达到阈值的时候,进行限流。
效果:
超过阈值,访问受限
(2)流控模式
直接:api到限流条件时,直接限流
关联:当关联的资源到达阈值时,就限流自己
链路:只记录指定链路上的流量
利用postman模拟并发密集访问testB
新增两次testB
然后点run设置线程数,和延迟时间
点击un Collection
此时访问testA,被限制。
流控效果:直接、预热、排队等待
直接就是刚才演示的效果
预热是:秒杀系统在开启的瞬间,会有很多流量上来,很有可能把系统打死,预热方式就是把为了保护系统,可慢慢的把流量放进来,慢慢的把阈值增长到设置的阈值。
排队等待就是一个一个过。
(3)降级
RT是平均响应时间:超出阈值且在时间窗口内通过的请求>=5,两个条件同时满足后触发降级,窗口期过后关闭断路器,RT最大4900
异常比例(秒级):QPS>=5且异常比例超过阈值时,触发降级;时间窗口结束后,关闭降级。
异常数(分钟级):异常数超过阈值时,触发降级;时间窗口结束后,关闭降级。超过阈值,系统知道已经造成损失,所以不能再报错。
用Jemter做压力测试。
热点key
何为热点?热点即经常访问的数据。很多时候我们希望统计某个热点数据中访问频次最高的Top K数据,并对其访问进行限制。
从HystrixCommand到@SentinelResource
@SentinelResource(value="testHotKey",blockHandler="deal_testHotKey")
//blockHandler是兜底方法
@SentinelResource//处理的是Sentinel控制配置的违规情况,有blockHandler方法配置的兜底处理;
@SentinelResource//主管配置出错,运行出错该走异常走异常。
blockHandlerClass// 指定类名
(4)系统规则
系统保护规则是从应用级别的入口流量控制,从单台机器的load、CPU使用率、平均RT、入口QPS和并发线程数等几个维度监控应用指标,让系统尽可能跑再最大吞吐量的同时保证系统整体的稳定性。
系统保护规则是应用整体维度的,而不是资源维度的,并且仅对入口流量生效。入口流量指的是进入系统规则支持以下的模式:
Load自适应(仅对Linex/Unix-like机器生效):系统的load1作为启发指标,进行自适应系统保护。当系统load1超过设定的启发值,且系统当前的并发线程数超过估算的系统容量时才会触发系统保护。系统容量由系统的maxQps *minRt估算得出。设定参考值一般是CPU cores*2.5
CPU usage:当系统CPU使用率超过阈值即触发系统保护(取值范围0.0-1.0),比较灵敏。
平均 usage:当系统CPU使用率超过阈值即触发系统保护,单位是毫秒。
并发线程数:当单台机器上所有入口流量的并发线程数达到阈值即触发系统保护。
入口QPS:当单台机器上所有入口流量的QPS达到阈值即触发系统保护。
Sentinel规则持久化
一旦我们重启应用,sentinel规则将消失,生产环境需要将配置规则持久化。
怎么做?
将限流规则持久化进Nacos保存,只要刷新8401某个rest地址,sentinel控制台的流控规则就能看到,只要Nacos里面的配置不删除,针对8401上的流控规则持续有效。
步骤:
pom文件:
com.alibaba.csp
sentinel-datasource-nacos
YML:
sentinel:
transport:
dashboard:localhost:8080#配置Sentineldashboard地址
port:8719
datasource:
ds1:
nacos:
server-addr:localhost:8848
dataId:cloudalibaba-sentinel-service
groupId:DEFAULT_GROUP
data-type:json
rule-type:flow
登录nacos,新建配置,内容为:
[
{
"resource": "/rateLimit/byUrl",
"limitApp": "default",
"grade": 1,
"count": 1,
"strategy": 0,
"controlBehavior": 0,
"clusterMode": false
}
]