雪崩效应定义:分布式系统中经常会出现某个基础服务不可用造成整个系统不可用的情况, 这种现象被称为服务雪崩效应.
原理:默认情况下tomcat只有一个线程池去处理客户端的所有请求,这样的话在高并发情况下,如果客户端所有的请求堆积到同一个接口服务,
就会产生tomcat的所有线程去处理该接口,可能导致其他服务接口无法访问---tomcat有个线程池,每个一个线程去处理客户端每次发送请求
解决雪崩效应方案:
服务降级:
在高并发情况下,防止用户一直等待。使用服务的降级方式,返回一个友好的提示,不会去处理请求,调用
fallback方法,例如:秒杀中----会提示当前用户过多,请稍后重试。
目的:是为了用户体验
(在tomcat没有线程去处理客户请求的时候,不能让客户一直在转圈等待)
服务熔断:
为了保护服务,在高并发的情况下,如果请求达到了一定的极限,(自己设置的一个预值),如果流量超出了预值,自动开启保护服务功能,使用服务降级方式返回一个友好提示(是和服务降级一起使用的)
服务隔离:
线程池和信号量隔离2种隔离方式(高并发情况下使用线程池隔离)
线程池隔离方式:每个服务接口都有自己的独立的线程池,每个线程池之间互不影响,缺点就是cpu占用非常高。
注意:不是所有的接口都用线程池去线程池隔离
HyStrix有2种方式配置保护服务,一种是通过注解,一种是接口形式
第一种
具体使用,在父类pom引入依赖
在父类配置加入配置
feign:
#开启feign支持hystrix (注意,一定要开启,旧版本默认支持,新版本默认关闭)
hystrix:
enabled: true
在对听得的接口加入@HystrixCommand(fallbackMethod="function()")注解
fallbackMethod作用:服务降级执行,后面跟着方法名,一般是提示类的方法
@HystrixCommand是默认开启了线程池隔离方式的,并且默认开启了熔断,和降级
在启动类加上注解 @EnableHyStrix
hystrix 禁止超时时间:
hystrix:
commond:
delfault:
execution:
timeout:
enable:false
第二种
在feginapi中接口定义中,也就是fegin("value=serviceid",fallback="方法名"),
@Fegin=fegin("value=serviceid",fallback="方法名")
比如:public interface memberserviceFegin {
}
再定义一个接口实现memberserviceFegin 接口
public class fallback implments memberserviceFegin {
}
生产环境不要禁用hystrix的超时