# 断路器（Hystrix）

在微服务架构中，根据业务来拆分成一个个的服务，服务与服务之间可以相互调用（RPC），在Spring Cloud可以用RestTemplate+Ribbon和Feign来调用。为了保证其高可用，单个服务通常会集群部署。由于网络原因或者自身的原因，服务并不能保证100%可用，如果单个服务出现问题，调用这个服务就会出现线程阻塞，此时若有大量的请求涌入，Servlet容器的线程资源会被消耗完毕，导致服务瘫痪。服务与服务之间的依赖性，故障会传播，会对整个微服务系统造成灾难性的严重后果，这就是服务故障的“雪崩”效应。

为了解决这个问题，业界提出了断路器模型。

## 微服务高可用技术

型复杂的分布式系统中，高可用相关的技术架构非常重要。 高可用架构非常重要的一个环节，就是如何将分布式系统中的各个服务打造成高可用的服务，从而足以应对分布式系统环境中的各种各样的问题，避免整个分布式系统被某个服务的故障给拖垮。 比如： 服务间的调用超时 服务间的调用失败 要解决这些棘手的分布式系统可用性问题，就涉及到了高可用分布式系统中的很多重要的技术，包括：

* 资源隔离&#x20;
* 限流与过载保护&#x20;
* 熔断
* 优雅降级
* 容错
* 超时控制
* 监控运维

## 服务降级、熔断、限流概念&#x20;

### 服务学崩效应&#x20;

服务雪崩效应产生与服务堆积在同一个线程池中，因为所有的请求都是同一个线程池进行处理，这时候如果在高并发情况下，所有的请求全部访问同一个接口， 这时候可能会导致其他服务没有线程进行接受请求，导致服务无法访问，这就是服务雪崩效应效应。

### 服务降级&#x20;

在高并发情况下，防止用户一直等待，使用服务降级方式(直接返回一个友好的提示给客户端，调用fallBack方法)&#x20;

> 秒杀---服务降级-，服务熔断--当前访问人数较多，请稍后再试

### 服务熔断

&#x20;熔断机制目的为了保护服务，在高并发的情况下，如果请求达到一定极限(可以自己设置阔值)如果流量超出了设置阈值，让后直接拒绝访问，保护当前服务。使用服务降级方式返回一个友好提示，服务熔断和服务降级一起使用

### 服务隔离&#x20;

因为默认情况下，只有一个线程池会维护所有的服务接口，如果大量的请求访问同一个接口，达到tomcat 线程池默认极限，可能会导致其他服务无法访问。

&#x20;解决服务雪崩效应:使用服务隔离机制(线程池方式和信号量)，

使用线程池方式实現隔离的原理: 相当于每个接口(服务)都有自己独立的线程池，因为每个线程池互不影响，这样的话就可以解决服务雪崩效应。&#x20;

线程池隔离: 每个服务接口，都有自己独立的线程池，每个线程池互不影响。 （缺点:cpu占用率非常高）

信号量隔离: 使用一个原子计数器（或信号量）来记录当前有多少个线程在运行，当请求进来时先判断计数器的数值，若超过设置的最大线程个数则拒绝该请求，若不超过则通行，这时候计数器+1，请求返 回成功后计数器-1。

### 服务限流

&#x20;服务限流就是对接口访问进行限制，常用服务限流算法令牌桶、漏桶。计数器也可以进行粗暴限流实现。

## Hystrix简单介绍

Hystrix是国外知名的视频网站Netflix所开源的非常流行的高可用架构框架。Hystrix能够完美的解决分布式系统架构中打造高可用服务面临的一系列技术难题。 Hystrix “豪猪”，具有自我保护的能力。hystrix 通过如下机制来解决雪崩效应问题。 在微服务架构中，我们把每个业务都拆成了单个服务模块，然后当有业务需求时，服务间可互相调用，但是，由于网络原因或者其他一些因素，有可能出现服务不可用的情况，当某个服务出现问题时，其他服务如果继续调用这个服务，就有可能出现线程阻塞，但如果同时有大量的请求，就会造成线程资源被用完，这样就可能会导致服务瘫痪，由于服务间会相互调用，很容易造成蝴蝶效应导致整个系统宕掉。因此，就有人提出来断路器来解决这一问题。

资源隔离：包括线程池隔离和信号量隔离，限制调用分布式服务的资源使用，某一个调用的服务出现问题不会影响其他服务调用。 降级机制：超时降级、资源不足时(线程或信号量)降级，降级后可以配合降级接口返回托底数据。 融断：当失败率达到阀值自动触发降级(如因网络故障/超时造成的失败率高)，熔断器触发的快速失败会进行快速恢复。 缓存：提供了请求缓存、请求合并实现。

## 什么是Hystrix

Netflix开源了Hystrix组件，实现了断路器模式，SpringCloud对这一组件进行了整合。 在微服务架构中，一个请求需要调用多个服务是非常常见的，如下图：

![](https://1025660399-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LfnT317zNvbaZczKOwj%2F-Lys2O4GjygJ5AQ1NoO1%2F-Lys3A-vBWd_cr50zI77%2Fimage.png?alt=media\&token=32f67d68-f660-4561-856c-fdacd870ea32)

较底层的服务如果出现故障，会导致连锁故障。当对特定的服务的调用的不可用达到一个阀值（Hystric 是5秒20次） 断路器将会被打开。

断路打开后，可用避免连锁故障，fallback方法可以直接返回一个固定值。

## Hystrix环境搭建

### Maven依赖信息

```markup
	<!-- hystrix断路器 -->
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
		</dependency>
```

### 开启Hystrix断路器

```java
feign:
  hystrix:
enabled: true
    
#### hystrix禁止服务超时时间
hystrix:  
 command: 
   default: 
      execution: 
       timeout: 
        enabled: false
```

[6.Hystrix-超时设置](https://www.cnblogs.com/wangfajun/p/9295096.html)

项目启动加上

```java
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
@EnableHystrix
public class AppOrder {
	public static void main(String[] args) {
		SpringApplication.run(AppOrder.class, args);
	}

}
```

### 服务降级处理

默认线程池大小为10个

```java
	@HystrixCommand(fallbackMethod = "orderToUserInfoFallback")
	@GetMapping("/orderToUserInfo")
	public ResponseBase orderToUserInfoHystrix() {
		System.out.println("orderToUserInfo:" + "当前线程池名称:" + Thread.currentThread().getName());
		return memberServiceFeigin.getUserInfo();
	}

	@RequestMapping("/orderToUserInfoFallback")
	public ResponseBase orderToUserInfoFallback() {
		return setResultError("系统错误!!!!");
	}
```

### Fallback回调

```java
	@RequestMapping("/orderToUserInfo")
	public ResponseBase orderToUserInfo() {
		return memberServiceFeigin.getUserInfo();
	}

  @Component
public class MemberServiceFallback extends BaseApiService implements   MemberServiceFeigin {
	public ResponseBase getUserInfo() {
		// 服务降级处理
		return setResultError("系统错误,请稍后重试!");
	}

}

```

## Hystrix仪表盘

## &#x20;Turbine集群监控

