-
sentinal对比(分布式系统的流量防卫)
监控保护微服务
Hystrix 需要自己去手工搭建监控平台,没有一套web界面可以进行细粒度化的配置,流控,速率控制,服务熔断,服务降级…
整合机制:sentinal
单独一个组件可以独立出来,支持界面化的细粒度统一配置。配置+注解
-
sentinal的使用
-
页面使用增加流控模式:
- QPS:每秒请求数(访问多次则会报错)
模式:直接快速失败:报错Blocked by Sentinel (flow limiting)
此时一秒请求一次,不会出问题,一秒请求多次,会被限流
此时直接调用默认错误信息,我们如何改进? - 线程数(允许访问,但是只有一个线程可以处理)
模式:直接快速失败
此时线程数为1,即两个服务请求到,如果第一个请求还未被线程处理完成第二个请求就来,此时会报错 - 前两个流控模式都为直接模式
流控模式更改为关联:即A与B关联,即B达到阈值,则A会被限制(支付接口达到阈值,限流下订单的接口)
此时:快速访问B,而A报错Blocked by Sentinel (flow limiting)
- 前三个流控效果都为快速失败 流控模式为直接模式
流控效果改为预热一开始 单击阈值为10/3(默认)=3,在经过预热时长5秒钟之后,再更改为阈值10(前五秒钟为3,后五秒钟为10)
- 流控效果:排队等待
只允许一个一个的进来,每秒只处理一个,可以等待(请求以均匀的速度通过)
-
页面增加降级规则:(sentinel熔断无半开状态)
- RT:平均响应时间(超出阈值且时间窗口内通过的请求大于等于5),两个条件满足后触发降级
- 异常比例:QPS大于等于5且异常比例超过阈值,触发降级
- 异常数:异常数(分钟统计)超过阈值后,触发降级
- 举例:RT使用
一秒钟五个请求平均响应时间>阈值且处理任务的时间大于阈值,触发降级,时间窗口期内不能用,时间窗口期过了之后,恢复。(以下例子为200ms以内处理完成,搞定就ok,搞不定未来一秒钟内降级,下一秒内不可用,过完一秒即可用)
- 举例使用异常比例
一秒钟五个请求平均响应时间>阈值且处理任务的时间大于一秒内的异常比例超过阈值,则触发降级,时间窗口结束,关闭降级
程序出错。单独访问直接报错500,如果一秒钟请求五次以上,达到降级,则直接报错Blocked by Sentinel (flow limiting) - 举例使用异常数:
近一分钟的异常数超过阈值后进行熔断(时间窗口大于60s)
-
热点key限流
- 是什么?会统计传入参数中的热点参数,根据传递的参数来进行 限流@SentinelResource声明兜底方法
配置完成后,如果第0个角标的参数访问时违背规则,然后降级,利用我们配置的兜底方法,即只要带参数第0个角标违背就降级,但是如果只带第二个参数随便访问 - 参数例外项:希望设置的角标参数为特定值时有定制情况
如果第一个参数等于5时,限流阈值变为200
注意:sentinelResource是控制台配置的错误,而runtimeexception没有兜底正常异常
-
系统规则
系统自适应限流:对应用的整体维度进行限流
- load:系统超过装载率
- CPU使用率
- 平均处理时间
- 并发线程数
- 全局QPS
-
@SentinelResource
- 按资源名称限流(返回兜底方法)
此时关闭服务,流控规则消失(临时流控规则)
按URL限流(返回自带默认,不会走自己的handler)
总结:因为注解中的value对应资源名,故资源名可以走默认方法而URL不会走自定义方法
可以用资源名来配置流控,也可以用URL配置流控(不会走自定义兜底方法),配置了流控规则后,如果违背了有定义的blockHandler则用,如果没有,则用默认的处理。 - 上述出现问题:耦合+默认自定义+代码膨胀
客户自定义限流处理:
自定义类CustomerBlockHandler
-
sentinal服务熔断
注册到Nacos
sentinel整合了ribbon+openfeign+fallback
riibbon:负载均衡
-
例子:
84订单利用ribbon负载均衡,然后调用服务9003,9004
84订单本身服务熔断(ribbon+Restemplate)
-
以上目的是:进一步加深sentinelresource的属性,fallback管理运行异常,blokHandler管配置违规
-
falback 能够管理运行时异常(java异常)相当于服务降级
-
blockHandler只负责sentinel的配置异常,不负责运行时异常
-
整合sentinel+Feign = ribbon + RestTemplate
-
sentinel框架的持久化
- 将配置规则配到nacos中
nacos和sentinel整合(sentinel的配置保存到nacos中)
即可直接将sentinel的配置写入nacos中保存,然后sentinel中的规则就会有