一:什么是Sentinel?
Sentinel是一个面向分布式架构的轻量级服务保护框架,实现服务降级、服务熔断、服务限流等功能
二:什么是服务降级?
比如当某个服务繁忙,不能让客户端的请求一直等待,应该立刻返回给客户端一个备选方案
三:什么是服务熔断?
当某个服务出现问题,卡死了,不能让用户一直等待,需要关闭所有对此服务的访问,然后调用服务降级
四:什么是服务限流?
限流,比如秒杀场景,不能访问用户瞬间都访问服务器,限制一次只可以有多少请求
五:流控规则
- 阈值类型:QPS和线程数
- 流控模式:直接 ,关联,链路
关联:当关联的资源达到阈值时,就限流自己
链路:多个请求调用同一个微服务 - 流控效果:快速失败,预热,排队等待
预热:根据冷加载因子(默认3)的值,从阈值/冷加载因子,经过预热时长,才逐渐达到设置的QPS阈值
例子:这里默认设置的阈值是10,但是由于开启了warm UP,那么实际上默认的阈值不是10,默认阈值为 10/3 = 3,也就是最开始启动时,阈值只有3,当经过5秒后(预热时长),才慢慢的将阈值提升到10
排队等待:让请求以均匀的速度通过,阀值类型必须设成QPS,否则无效。
设置含义:/testA每秒1次请求,超过的话就排队等待,等待的超时时间为20000毫秒。
六:QPS和线程数的区别
QPS:每秒钟的请求数量,当调用该api的QPS达到阈值的时候,进行限流
线程数:服务端的处理请求的线程超过阈值的时候,就报错
例子:a请求过来,处理很慢,在一直处理,此时b请求又过来了此时因为a占用一个线程,此时要处理b请求就只有额外开启一个线程那么就会报错
七:服务降级有哪三种策略?
- RT(平均响应时间):平均响应时间超出阈值且在时间窗口内通过的请求>=5,两个条件同时满足后触发降级,窗口期过后关闭断路器
永远一秒钟打进来10个线程(大于5个了)调用testD,我们希望200毫秒处理完本次任务,如果超过200毫秒还没处理完,在未来1秒钟的时间窗口内,断路器打开,微服务不可用,保险丝跳闸断电了
2、异常比例:QPS >= 5 且异常比例(秒级统计)超过阈值时,触发降级,时间窗口结束后,关闭降级
3、异常次数:(分钟统计)超过阈值时,触发降级,时间窗口结束后,关闭降级
一分钟之内,有5个请求发生异常,进入熔断
八:热点规则
- 热点参数限流:会统计传入参数中的热点参数,并根据配置的限流阈值与模式,对包含热点参数的资源调用进行限流。
例子:
localhost:8080/aa?name=aa
localhost:8080/aa?name=bb
假如两个请求中,带有参数aa的请求访问频次非常高,我们就现在name==aa的请求,但是bb的不限制 - 如何自定义降级方法,而不是默认的抛出异常?
使用@SentinelResource直接实现降级方法
- 定义热点规则
- 设置热点规则中的其他选项
测试结果:
九:@SentinelResource注解
- 按照资源名称限流:指的是@SentinelResource注解value的值,
2. 按照Url地址限流:资源名,是以url指定
3. 自定义限流处理逻辑
第一步:单独创建一个类,用于处理限流
第二步:在controller中,指定使用自定义类中的方法作为降级方法