1.服务雪崩
现象:在某一个时刻微服务系统中所有微服务均不可用的这种现象 称之为服务雪崩
引发:在微服务之间进行服务调用是由于某一个服务故障,导致级联服务故障的现象,称为雪崩效应。雪崩效应描述的是提供方不可用,
导致消费方不可用并将不可用逐渐放大的过程。
根本原因: 在调用链路中链路中某一服务因为执行业务时间过程,或者是大规模出现异常导致自身服务不可用,并把这种不可用放大的情况
2.如何解决微服务系统的服务雪崩问题!
服务熔断 ====》 Hystrix
作用:就是用来在微服务系统中防止服务雪崩现象出现的
熔断机制:所有微服务中必须引入Hystrix组件 一旦引入hystrix这个组件就具有服务熔断功能
服务熔断:“熔断器”本身是一种开关装置,当某个服务单元发生故障之后,通过断路器(hystrix)的故障监控,某个异常条件被触发,
直接熔断整个服务,向调用方法返回一个符合预期的、可处理的备选响应(Fallback),而不是长时间的等待或者抛出调用方法无法处理的异常,
就保证了服务调用方的线程不会被长时间占用,避免故障在分布式系统中蔓延,乃至雪崩。如果目标服务情况好转则恢复调用。
服务熔断是解决雪崩的重要手段
3.服务降级
服务压力剧增的时候根据当前业务情况及流量对一些服务和页面又策略的降级,以此缓解服务器的压力,以保证核心任务的进行,
同时保证部分甚至大部分任务客户能得到正确的响应,也就是当前的请求处理不了了或者出错了,给一个默认的返回。
一些服务和页面又策略的降级 : 通俗定义: 当网站服务流量突然增加时,为了保证系统核心服务正常运行,有策略关闭系统中边缘服务,
以保证核心服务正常运行
4.服务熔断和降级总结
1.共同点
- 目的很一致,都是从可用性可靠性着想,为防止系统的整体缓慢甚至奔溃,采用的技术手段;
- 最终表现类似,对于两者来说,最终让用户体验到的是某些功能暂时不可达或不可用;
- 粒度一般都是服务级别,当然,业界也有不少更细粒度的做法,比如做到数据持久层(允许查询,不允许增删改);
- 自治性 要求很高,熔断模式一般都是服务基于策略的自动触发,降级虽说可人工干预,但在微服务架构下,完全靠人显然不可能,
开关预置,配置中心都是必要手段;
2.异同点
- 触发原因不太一样,服务熔断一般是某个服务(下游服务)故障引起,而服务降级一般是从整体负荷考虑;
- 管理目标的层次不太一样,熔断其实是一个框架级的处理,每个微服务都需要(无层级之分), 而降级一般需要对业务有层级之分。
(比如降级一般是从最外围服务边缘服务开始)
3.总结
- 熔断必会触发降级,所以熔断也是降级一种,区别在于熔断时对调用链路的保护,而降级是对系统过载的一种保护处理。
Hystrix: 作用:用来防止微服务系统中服务雪崩现象,实现服务熔断,熔断防止雪崩手段
1.如何在项目中使用Hystrix组件
a.在所有微服务项目中引入hystrix依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
代码中使用
在启动类上面加上: @EnableHystrix //开启hystirx 服务熔断
// fallbackMethod 自定义方法 需要参数一致 defaultFallback 默认处理方法(不需要参数一致 返回结果需要为string类型)
@HystrixCommand(fallbackMethod = "timeOutHandler",commandProperties ={
// 请求时长 超过3秒则报错 调用timeOutHandler 方法返回
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "3000")
})
public String paymentInfoTimeOut(Integer id){
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "线程池:"+Thread.currentThread().getName()+" is ok"+id+": timeout";
}
public String timeOutHandler(Integer id){
return "出错了 呜呜呜┭┮﹏┭┮";
}
Hystrix 配合 openfeign 一起使用时
1.在启动类上面加上: @EnableHystrix //开启hystirx 服务熔断
2.在配置文件上加上
feign.hystrix.enabled= true 开启openFeign在调用服务过程中 开启hystrix支持 默认:就是没有开启
3.实现openFeign接口
Hystrix dashboard 一段配置记录 (加入要监控的微服务里面)
@Bean
public ServletRegistrationBean getServlet(){
HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet();
ServletRegistrationBean registrationBean = new ServletRegistrationBean();
registrationBean.setLoadOnStartup(1);
registrationBean.addUrlMappings("/hystrix.stream");
registrationBean.setName("HystrixMetricsStreamServlet");
return registrationBean;
}