雪崩效应
服务A调用B,B调用C,C岔劈,B等C,A全来B等C,线程不够,死机,一个服务引起一串服务崩溃,就是雪崩
解决雪崩问题的常见方式:
- 超时处理:设定超时时间,请求超过一定时间没有响应就返回错误信息,不会无休止等待
- 舱壁模式:限定每个业务能使用的线程数,避免耗尽整个tomcat的资源,因此也叫线程隔离。
- 熔断降级:由断路器统计业务执行的异常比例,如果超出阈值则会熔断该业务,拦截访问该业务的一切请求。
- 流量控制:限制业务访问的QPS,避免服务因流量的突增而故障。
Hystrix实现熔断降级
Feign默认也有对Hystix的集成 容错(服务降级):当hystrix进行保护的时候,提供的一种异常处理(提供兜底数据)
线程隔离,服务降级
配置开启Hystrix
- 不是在Feign模块里,而是在消费者模块里
#服务降级
feign:
hystrix:
enabled: true #开启熔断功能
降级的处理类
- 也就是重写一下方法,正常走自动生成的实现类,出事儿走咱们写的实现类
public class UserClientFallback implements UserClient {
@Override
public User queryById(Long id) {
User user = new User();
user.setUsername("降级辣");
return user;
}
}
Feign客户端中,提供访问出错指定降级类
//fallback
@FeignClient(value = "user-service",configuration = FeignConfig.class,
fallback = UserClientFallback.class)
@Import引入降级实现类
@MapperScan("cn.itcast.order.mapper")
@SpringBootApplication
@EnableFeignClients(clients = UserClient.class)
@Import(UserClientFallback.class) //引入降级实现类
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
服务熔断
熔断器有三个状态 CLOSED、OPEN、HALF_OPEN 熔断器默认关闭状态,当触发熔断后状态变更为 OPEN,在等待到指定的时间,Hystrix会放请求检测服务是否开启,这期间熔断器会变为HALF_OPEN 半开启状态,熔断探测服务可用则继续变更为 CLOSED关闭熔断器。
- Closed:关闭状态(断路器关闭),所有请求都正常访问。
- Open:打开状态(断路器打开),所有请求都会被降级。Hystix会对请求情况计数,当一定时间内失败请求百分比达到阈值,则触发熔断,断路器会完全关闭。默认失败比例的阈值是50%,请求次数最少不低于20次。
- Half Open:半开状态,open状态不是永久的,打开后会进入休眠时间(默认是5S)。随后断路器会自动进入半开状态。此时会释放1次请求通过,若这个请求是健康的,则会关闭断路器,否则继续保持打开,再次进行5秒休眠计时。
测试
通过配置修改熔断策略(注意,是在消费者端)
hystrix:
command:
default:
circuitBreaker:
requestVolumeThreshold: 5 # 触发熔断的最小请求次数,默认20
errorThresholdPercentage: 50 #触发熔断的失败请求最小占比,默认50%
sleepWindowInMilliseconds: 10000 #休眠时长,默认是5000毫秒