熔断器Hystrix
一、Hystrix是Netflix开源的一个延迟和容错库,用于隔离访问远程服务、第三方库,防止出现级联失败
二、Hystrix主要是解决服务雪崩问题,其处理手段主要是服务降级,包括:
a、线程隔离:用户请求不直接访问服务,而是使用线程池中空闲的线程访问服务,加速失败判断时间。
b、服务熔断:及时返回服务调用失败的结果,让线程不因为等待服务而阻塞。
三、服务雪崩
多个微服务之间调用的时候,假如微服务A调用微服务B和微服务C,微服务B和微服务C又调用其他的微服务,这就是所谓“扇出”,如果调链路上某个微服务的调用响应时间过长或者不可用,对微服务A的调用就会占用越来越多的系统资源,进而引起系统崩溃,所谓的“雪崩效应”
Hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,比如超时、异常等,Hystrix能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障
hystrix中的重要概念:
1、服务降级【fallback】
比如当某个服务繁忙,不能让客户端的请求一直等待,应该立刻返回给客户端一个备选方案
a: int age=10/0 出现异常
b: 我们能接受3秒,但它却运行了5秒,出现超时异常
例子、
@HystrixCommand(fallbackMethod = "paymentInfo_TimeOutHandler",commandProperties = {
@HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value="3000") //请求峰值时间为3miao
})
public String paymentInfo_TimeOut(Integer id) {
//int age = 10/0;
try { TimeUnit.MILLISECONDS.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); }
return "线程池: "+Thread.currentThread().getName()+" id: "+id+"\t"+"O(∩_∩)O哈哈~"+" 耗时(秒): ";
}
public String paymentInfo_TimeOutHandler(Integer id) {
return "线程池: "+Thread.currentThread().getName()+" 8001系统繁忙或者运行报错,请稍后再试,id: "+id+"\t"+"o(╥﹏╥)o";
}
2、服务熔断
熔断机制是应对雪崩效应的一种微服务链路保护机制,当"扇出"链路的某个微服务出错不可能或响应时间太长时,会进行服务的降级,进而熔断该节点微服务的调用,快速返回错误的响应信息
当检查到该节点微服务调用响应正常后,恢复调用链路
3、服务限流
限流,比如秒杀场景,不能访问用户瞬间都访问服务器,限制一次只可以有多少请求**
4、服务降级
在高并发情况下,防止用户一直等待,对服务进行降级处理,当用户访问这个服务时,服务不做任何处理,直接返回一个友好提示
(直接返回一个友好的提示给客户端,调用fallBack方法)
5、服务熔断
熔断机制目的为了保护服务,在高并发的情况下,如果请求达到一定极限(可以自己设置阔值)如果流量超出了设置阈值,
让后直接拒绝访问,保护当前服务。使用服务降级方式返回一个友好提示,服务熔断和服务降级一起使用
如果设置阈值 1s允许1000请求,现在有10000个请求,哪有9000请求被拒绝,当前服务收保护状态,使用服务以降级方式返回一个友好提示
6、服务线程隔离
因为默认情况下,只有一个线程池去维护所有的服务接口,如果大量的请求访问同一个接口,达到tomcat 线程池默认极限,可能会导致其他服务无法访问。
解决服务雪崩效应:使用服务隔离机制(线程池方式和信号量),
使用线程池方式实現隔离的原理:
相当于每个接口(服务)都有自己独立的线程池,因为每个线程池互不影响,这样的话就可以解决服务雪崩效应
线程池隔离:
每个服务接口,都有自己独立的线程池,每个线程池互不影响。
信号量隔离:
使用一个原子计数器(或信号量)来记录当前有多少个线程在运行,当请求进来时先判断计数器的数值,若超过设置的最大线程个数则拒绝该请求,
若不超过则通行,这时候计数器+1,请求返 回成功后计数器-1
7、服务限流
服务限流就是对接口访问进行限制,常用服务限流算法令牌桶、漏桶。计数器也可以进行粗暴限流实现