雪崩:微服务之间相互调用,因为调用链中的一个服务故障,引起整个链路都无法访问的情况。
处理方式:
超时处理:设定超时时间。
舱壁模式:限定每个业务能用的线程数,避免耗尽tomcat的资源。
熔断降级:路由器统计业务执行的异常比例,如果超出阈值则会熔断该业务,拦截访问该业务的请求。
流量控制:限制业务访问的QPS,避免服务因流量的突增而故障。预防高并发产生的雪崩。
服务保护技术:
Sentinel | Hystrix | |
隔离策略: | 信号量隔离 | 线程池/信号量隔离 |
熔断降级策略: | 基于慢调用比例或者异常比例 | 基于失败比率 |
限流 | 基于QPS,支持基于调用关系的限流 | 有限的支持 |
流量整形 | 支持慢启动、匀速排队等待 | 不支持 |
控制台 | 开箱即用,可配置规则,查看秒级监控,机器发现等 | 不支持 |
为什么选用sentinel?
使用sentinel:
导入依赖jar包、
配置sentinel地址端口、
浏览器打开sentinel使用
配置sentinel限流
流控模式:
直接:默认
关联:统计与当前资源相关的另一个资源,触发阈值时,对当前资源限流。
链路:对请求的来源限流
流控效果:
请求达到流控阈值时采取的措施,
快速失败:抛出异常
Warm up:预热模式,初始阈值threshold/coldFactor,逐渐提高到threshold值。coldFactor默认3
排队等待:让所有请求进入队列,然后按照阈值允许的时间间隔依次执行。预期等待最大时间外的请求直接拒绝、抛异常。
热点参数限流:根据热度不同,控制QPS(不重要,一个一个配置效率低)
隔离和降级
限流尽量避免高并发服务故障,服务还会因为其他原因故障。防止雪崩要用隔离和降级。
都是对客户端(调用方)的保护。
Feign整合Sentinel降级(重要):
1、修改配置文件,开启feign对sentinel的支持
2、编写降级工厂类实现FallbackFactory(编写降级业务逻辑)
3、在启动类里注册Bean
4、在feign上写注解,指定降级工厂
线程隔离:
方式:线程池隔离,基于线程池模式
信号量隔离(sentinel默认)基于计数器模式,简单开销小
断路器的三个状态:
关闭、打开、半开
熔断降级:解决雪崩的重要手段,断路器统计服务调用的异常比例、慢请求比例,超出阈值则熔断该服务。拦截一切该服务的请求,服务恢复时,断路器放行该服务的请求。
熔断策略
断路器熔断有3种
慢调用:超过指定时长的调用为慢调用,统计单位时长内的比例,超过阈值则熔断。
异常比例:统计单位时长内异常调用的比例,超过阈值则熔断。
异常数:统计单位时长内异常调用的次数,超过阈值则熔断。
授权规则
对调用来源做控制,分黑白名单。
白名单:来源在白名单内的调用者允许访问。
黑名单:来源在黑名单内的调用者不允许访问。
RequestOriginParser接口的parseOrigin来获取请求的来源的。
网关,通过过滤器加上标签。
控制台配置授权规则。
自定义异常结果:
BlockException包含很多子类,
规则管理的三种模式(了解)
原始模式:默认,保存在内存,重启服务失效。
pull模式:控制台将配置推送到sentinel客户端,保存在本地或者数据库。后面会定时查询,更新本地规则。
push模式:控制台将配置规则推送到远程配置中心,例如nacos。监听变更实时更新。