熔断器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、服务限流
          服务限流就是对接口访问进行限制,常用服务限流算法令牌桶、漏桶。计数器也可以进行粗暴限流实现
posted @ 2020-09-17 19:18  jock_javaEE  阅读(165)  评论(0编辑  收藏  举报