A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

© 624694683 中级黑马   /  2019-1-16 17:07  /  816 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

### 断路器简介
Hystrix是一个用于处理分布式系统延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,如果超时,异常等,Hystrix可以保证在一个依赖出现问题的时候,不会造成整体服务的失败,避免级联故障,以提高分布式系统的弹性。
“断路器”本身是一个开关,当某个服务单元发生故障之后,通过断路器的故障监控,想调用方返回一个符合预期的,可处理的备选响应(FallBack),而不是长时间的等待或抛出调用方法的异常,这样就保证了服务调用方的线程不会被长时间,不必要地占用,从而避免了故障在分布式系统中的蔓延,乃至雪崩
### 断路器解决的问题--服务雪崩
多个微服务之间调用的时候,假设A调用B和C,B和C调用了其他的,这就是所谓的<font color='red'>扇出</font>。如果扇出的链路上出现了某个服务无响应,微服务A就会占用更多的资源,引起系统崩溃,也就是<font color='red'>服务雪崩</font>

### 服务熔断
熔断机制是对用的雪崩效应的一种微服务链路保护机制
当扇出链路的某个微服务不可用或者是相应时间太长时,会进行服务的降级,进而熔断该节点的服务调用,快速返回错误的相应信息,当检测到该节点微服务调用相应正常后恢复调用链路。SpringCloud中的熔断机制是通过Hystrix实现,他会监控微服务间的调用的状态,当失败或者达到阈值,缺省值是5s 20次调用失败就会启动熔断机制,熔断机制的注解<font color='red'>@HystrixCommand</font>

### 断路器的服务端
* 添加依赖

```xml
<!--Hystrix熔断器-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
```

* 编写Controller代码


```java
@RestController
public class DeptController {
    @Autowired
    private DeptService service = null;

    @RequestMapping(value = "/dept/get/{id}", method = RequestMethod.GET)
    //一旦调用服务方法失败并抛出了错误信息后,会自动调用@HystrixCommand标注好的fallbackMethod调用类中的指定方法
    @HystrixCommand(fallbackMethod = "processHystrix_Get")
    public Dept get(@PathVariable("id") Long id) {

        Dept dept = this.service.get(id);

        if (null == dept) {
            throw new RuntimeException("该ID:" + id + "没有没有对应的信息");
        }

        return dept;
    }

    public Dept processHystrix_Get(@PathVariable("id") Long id) {
        return new Dept().setDeptno(id).setDname("该ID:" + id + "没有没有对应的信息,null--@HystrixCommand")
                .setDb_source("no this database in MySQL");
    }
}
```

* 在启动类上添加注解


```java
@SpringBootApplication
@EnableEurekaClient //本服务启动后自动注册进eureka服务中
@EnableDiscoveryClient  //服务发现
@EnableCircuitBreaker   //对Hystrix熔断机制的支持
public class Provider_Dept_Hystrix_8004 {
    public static void main(String[] args) {
        SpringApplication.run(Provider_Dept_Hystrix_8004.class);
    }
}

```

###服务降级
> 整体资源不够了,忍痛将某些服务先关掉,待度过难关,在开启回来

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马