Hystrix

Hystrix简介

Hystrix是由Netflix开源的一个延迟和容错库,用于隔离访问远程系统、服务或者第三方库,防止级联失败,从而提升系统的可用性与容错性。

断路器本身是一种开关装置,当某个服务单元发生故障后,通过断路器的故障监控(类似熔断保险丝),向调用方返回一个符合预期·可处理的备选响应(Fallback),而不是长时间的的等待或者抛出调用方无法处理的异常,这样就保证了服务调用方的线程不会被长时间,不必要的占用,从而避免了故障在分布式系统中蔓延,乃至雪崩

Hystrix主要通过以下几点实现延迟和容错。

包裹请求:使用HystrixCommand (或HystrixObservableCommand )包裹对依赖的调用逻辑,每个命令在独立线程中执行。这使用到了设计模式中的“命令模式”。
跳闸机制:当某服务的错误率超过一定阈值时,Hystrix可以自动或者手动跳闸,停 止请求该服务一段时间。
资源隔离:Hystrix为每个依赖都维护了一个小型的线程池(或者信号量)。如果该线 程池已满,发往该依赖的请求就被立即拒绝,而不是排队等候,从而加速失败判定。
监控:Hystrix可以近乎实时地监控运行指标和配置的变化,例如成功、失败、超时、 以及被拒绝的请求等。
回退机制:当请求失败、超时、被拒绝,或当断路器打开时,执行回退逻辑。回退逻辑可由开发人员自行提供,例如返回一个缺省值。
自我修复:断路器打开一段时间后,会自动进入“半开”状态。断路器打开、关闭、 半开的逻辑转换。

Hystrix能干嘛

服务降级,
服务熔断
服务限流
实时监控

出现服务降级的情况:

①程序运行异常;
②超时;
③服务熔断触发服务降级;
④线程池/信号量打满也会导致服务降级。

解决方案:
对方服务超时了或宕机,调用者不能一直卡死等待,必须有服务降级;
对方服务可能OK,调用者自己出故障或有自我要求(自己的等待时间小于服务提供者),自己服务降级。

高并发测试

用jmter压力测试 ,开启20000个并发压死 8001,20000个请求都去访问paymentInfo_TimeOut 服务

Hystrix_第1张图片访问 http://localhost:8001/payment/hystrix/timeout/1

发现访问很慢,一直在转圈, tomcat默认线程数被打满了,没有多余的的线程来处理
Hystrix_第2张图片如果此时外部的消费者80也来访问,最终导致服务端8001直接卡死

Hystrix整合

1.新建cloud-provider-hystrix-payment8001
Hystrix_第3张图片
2.添加依赖:

<dependency>
   <groupId>org.springframework.cloud</groupId>
   <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

3.配置yml:

server:
  port: 8001

spring:
  application:
    name: cloud-provider-hystrix-payment

eureka:
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      #defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
      defaultZone: http://eureka7001.com:7001/eureka

这里为了等下方便演示,所以只配置了eureka单机

4.启动上添加注解

启动上添加注解@EnableCircuitBreaker或@EnableHystrix,启用断路器支持


import com.netflix.hystrix.contrib.metrics.eventstream.HystrixMetricsStreamServlet;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.context.annotation.Bean;

/**
 * 启动上添加注解@EnableCircuitBreaker或@EnableHystrix,启用断路器支持
 */
@SpringBootApplication
@EnableEurekaClient
@EnableCircuitBreaker
public class PaymentHystrixApp8001 {

    public static void main(String[] args) {
        SpringApplication.run(PaymentHystrixApp8001.class, args);
    }
}

你可能感兴趣的:(springcloud,hystrix)