Hystrix(服务熔断、服务降级、服务监控)

服务雪崩

  在大的分布式系统中比如京东、淘宝之类的 他们每个服务之间的依赖关系是不可避免的但是多个微服务之间在调用的时候 如A调用B,B调用C,C又调用别的,这就是所谓的“扇出” (如下图),如果在这条链上其中的某一个服务长时间未响应或者宕机,就比如用户调用A服务,这个时候A服务去调用B服务,但是B服务长时间未响应,这个时候对服务A的占用资源会原来越多,直至造成A服务宕机。这就是“雪崩效应”。

 

 

 

 

遇到这中问题,我们不能因为其中某一个服务而导致整条链路不可用,这时候我们就用到了 Hystrix断路器。

Hystrix

   Hystrix中文名字“豪猪”,代表了一种防御机制,在分布式系统中很多依赖之间调用失败是不可避免的,如超市,异常,故障,bug等。而豪猪是保证依赖出现问题的情况下,不会导致整个服务系统瘫痪的一种容错框架,它避免雪崩的产生以及控制涟漪的传递(涟漪:就跟水波似的扔进水里一个小石子,它会产生一层一层的水波纹,这就是涟漪。)

   Hystrix提供了服务熔断、隔离、监控、缓存等来解决“雪崩效应”。

   「舱壁模式] (将船的底部划分成一 个个的舱室, 这样一个舱室进水,不会导致整个船沉没。将系统所有的依赖隔离起来,其中一个掉线,宕机,不会导致整个系统瘫痪)

    Hystrix通过使用“舱壁模式” 来隔离每个服务,应限制访问这些服务的用户量。

 

Hystrix在用户请求和服务之间加入了线程池。

它会为每个依赖调用分配一个小的线程池,如果线程池已满就直接驳回,它默认是不采用排队,线程数是可以设定的。

实现原理

  用户的请求将不再直接访问服务,而是通过线程池中的空闲线程来访问服务,如果线程池已满,则会进行降级处理,用户的请求不会被阻塞,至少可以看到一个执行结果(返回的提示信息),而不是无休止的等待或者看到系统崩溃.其本质是将服务视为资源,当请求该资源的数量超过了线程池中的数量限制时则不可以再对该资源进行访问,从而保护该资源不会过载而造成阻塞。

Hystrix中的服务熔断机制

  断路器:

  “断路器”本身是一种开关装置,当某个服务单元发生故障监控(类似熔断保险丝),向调用方法返回一个符合预期的、可处理的备选响应(FallBack),而不是长时间的等待或者抛出调用方法无法处理的异常,这样就保证了服务调用方的线程不会被长时间、

   不必要地 占用,从而避免了故障在分布式系统中的蔓延。乃至雪崩。

   服务熔断:

   熔断机制是应对雪崩效应的一种微服务链路保护机制,

   当扇出链路的某个微服务不可用或者响应时间太长时,会进行服务的降级,进而熔断该节点微服务的调用,快速返回”错误”的响应信息。当检测到该节点微服务响应正常后恢复调用链路,在SpringCloud框架机制通过Hystrix实现,

    Hystrix会监控微服务见调用的状况,当失败的调用到一个阈值,缺省是5秒内20次调用失败就会启动熔断机制,熔断机制的注解是@HystrixCommand

  实现:

    1、导入依赖包

      

 

    2、编写配置文件 application.yml文件

    

 

 

     3.在controller中添加服务熔断机制

    

 

 

     4、在主启动类他添加hystrix启动注解

    

 

 

     

     测试:1、先启动3个eureka。2、然后启动Hystrix主启动类,

        3、最后启动consumer 80微服务。4、测试

hystrix中的服务降级

  通常情况下,一次远程调用对应着一个线程/进程,如果响应太慢,这个线程就得不到释放,对服务器压力增大,一直占用系统资源,如果得不到释放只会越积越多,最后导致资源耗尽,服务器不可用。

  服务降级

    当某个服务不可用的时候,一个请求过来访问这个服务器了,在通常情况下这个请求会一直调用这个服务,一直占用系统资源,直至服务崩掉。这个时候就要用到 hystrix中的服务降级(FallBack)进行数据返回,这样对服务器的压力会减轻很多。

   实现#

   一、超时降级

    1、导入依赖

      

 

     2、服务降级小案例(客户端 消费者)

    

 

     @HystrixCommand注解,作用方法体上,其属性fallbackMethod就是用来定义“兜底”方法的。
    @HystrixProperty(name = “execution.isolation.thread.timeoutInMilliseconds”,value = “1500”) 意思是如果方法在1.5秒没有返回,就执行兜底方法,不在等待程序执行

 

posted @ 2020-12-03 14:33  嘟嘟嘟z  阅读(300)  评论(0)    收藏  举报