一、简介
Sentinel诞生于阿里巴巴,其主要目标是流量控制和服务熔断,2018年,Sentinel演变为一个开源项目现如今成为了Spring Cloud Alibaba的一个子项目。Sentinel是通过限制并发线程的数量(即信号隔离)来减少不稳定资源的影响,而不是使用线程池,省去了线程切换的性能开销。
当资源的响应时间变长时,线程将开始被占用。当线程数累积到一定数量时,新的传入请求将被拒绝。反之亦然,当资源恢复并变得稳定时,占用的线程也将被释放,新请求将被接受。
除了限制并发性外,Sentinel可以根据响应时间降级不稳定资源也是保证可靠性的有效方法。当资源的响应时间太大时,将在指定的时间窗口中拒绝所有对该资源的访问。-- 熔断机制
此外,Sentinel支持的熔断降级维度更多,可对多种指标进行流控、熔断,且提供了实时监控和控制面板,功能更为强大。
Sentinel比Hystrix性能更强大(Hystrix默认使用线程池,Sentinel使用信号量,信号量开销更小),Sentinel比Hystrix更加细粒度,支持多种,多角度的服务控制,功能特别强大。
二、Docker部署sentinel
一.下载
docker pull docker.io/bladex/sentinel-dashboard
二.启动
docker run --name sentinel --restart=always -d -p 8858:8858 -d bladex/sentinel-dashboard
三.登录
账号密码默认都是sentinel
四.目录说明
1、实时监控
实时监控不同接口的QPS(每秒查询速率)
这里有几个概念了解一下即可
1.响应时间RT
响应时间是指系统对请求作出响应的时间。
2.吞吐量Throughput
吞吐量是指系统在单位时间内处理请求的数量。对于无并发的应用系统而言,吞吐量与响应时间成严格的反比关系,实际上此时吞吐量就是响应时间的倒数。前面已经说过,对于单用户的系统,响应时间(或者系统响应时间和应用延迟时间)可以很好地度量系统的性能,但对于并发系统,通常需要用吞吐量作为性能指标。
3.QPS每秒查询速率
每秒查询率QPS是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准,在因特网上,作为域名系统服务器的机器的性能经常用每秒查询率来衡量。对应fetches/sec,即每秒的响应请求数,也即是最大吞吐能力。
2、簇点链路
查看Http请求
3、流控规则
流量控制规则设置
4、熔断规则
设置熔断的规则
5、热点规则
热点即经常访问的数据,很多时候我们希望统计某个热点数据中访问频次最高的Top K数据,并对其访问进行限制,热点参数限流可以看做是一种特殊的流量控制,仅对包含热点参数的资源调用生效.
6、系统规则
系统规则自然对应所有入口的rest请求做处理,整体管控,设置有风险,需谨慎
7、授权规则
授权规则,根据匹配参数里面的参数的类型是否匹配参数条件来进行限制访问
8、集群流控
9、机器列表
连接到该sentinel服务的机器列表
三、Sentinel 客户端接入
一.依赖
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
二.配置文件
server:port: 8401 #该微服务端口spring:application:name: cloudalibaba-sentinel-servicecloud:nacos:discovery:server-addr: 119.91.99.85:8849 #nacos集群nginx代理端口sentinel:transport:dashboard: 139.155.49.250:8858 #配置Sentinel dashboard地址port: 8719 # 客户端与Sentinel控制台交互的端口
遇到问题
服务器端Sentinel无法监控本机服务的问题
四、Sentinel服务限流
一.资源名
唯一名称,默认请求路径,也可以填@SentinelResource中的value
@GetMapping("/byResource")@SentinelResource(value = "byResource", blockHandler = "handleException")public CommonResult byResource() {
return new CommonResult(200, "按资源名称限流测试OK", new Payment(2020L, "serial001"));}
如果填请求路径,限流会跳转到sentinel自带的限流
如果填写资源名称,限流会跳转到对应的blockHandler,如果没有对应的blockHandler,则会跳转到SpringBoot的默认错误界面
所以建议规范书写,写好资源名称以及对应的blockHandler。
二.针对来源
Sentinel可以针对调用者进行限流 ,填写微服务名,默认 default
三.Sentinel阈值类型
1、QPS
当调用api的QPS达到阈值后进行限流
2、并发线程数
调用该api的线程数达到阈值后进行限流
四.Sentinel流控模式
1、直接(当API达到限流条件就进行限流)
Sentinel默认的流控处理就是【直接->快速失败】,QPS达到阈值,当前资源直接失败。
2、关联(与某一方法相关联,当该方法达到阈值就限流)
当关联的资源达到阈值时就限流自己
3、链路(从某一入口处进行记录,超过就限流)
只记录指定链路上的流量(指定资源从入口资源进来的流量,如果达到阈值就进行限流)
三.Sentinel流控效果
1、快速失败
直接失败,抛异常
2、Warm Up预热
初始的QPS阈值为 100 / 10 =10,10秒后 QPS阈值达到 100.
当系统长期并发不高,流量突然增加可能会直接把系统压垮。通过"冷启动",让通过的流量缓慢增加,在一定时间内逐渐增加到阈值的上限,给系统一个预热的时间,避免冷系统被压垮。
3、排队等待
排队等待(RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER),忽然增加的请求并发量达到了限流阈值后续请求会被决绝,有时候我们可能更希望后续的请求可以加入队列进行排队,慢慢执行,而不是直接拒绝请求,这种方式后严格控制请求通过的时间间隔,也即是让请求以均匀的速度通过,对应的是漏桶算法,这种方式主要用于处理间隔性突发的流量,例如消息队列。 简单理解:突发流量处理不过来,让请求排队。
QPS阈值为100,超过的请求会排队,排队超时时间为 0.5S
4、热点限流(针对资源参数的限流)
1.参数限流
访问参数的次数超过阈值就进行限流
//限流降级@SentinelResource(value="/parameterLimit",blockHandler="parameterLimitHandler")@GetMapping(value="/parameterLimit")public String parameterLimit(@RequestParam("p1") String p1 ,@RequestParam("p2") String p2){
return "parameterLimit方法调用成功";}// 限流与阻塞处理public String parameterLimitHandler(@RequestParam("p1") String p1 ,@RequestParam("p2") String p2,BlockException ex) {
return "参数限流";}
索引为参数索引
2.参数值限流
访问参数的值超过阈值就进行限流
代码同上,这个的意思是,参数0的阈值为100,当参数0的值=qwe的时候,阈值为2
http://localhost:8401/parameterLimit?p1=qwe&p2=2