点击关注公众号,干货第一时间送达

在股市交易中,当波幅达到定点时,
就会触发熔断机制,暂停交易。
同样,在微服务中,当服务端无法正常处理客户端请求,又需要在规定时间返回处理结果,避免请求负载过高,也配备的有熔断机制。
即 Hystrix 服务熔断。
前面的几篇文章:
小编带着大家,构建了Eureka + Ribbon + Feign
今天,我们继续带来 Hystrix。
(友情提示:该篇文章是在上篇:Springcloud 之 Feign 的 IDEA 工程基础上做改进,下面不再赘述IDEA工程建设细节)
一、Hstrix 概念
先明白一个概念:服务雪崩
多个微服务之间调用的时候,假设微服务A调用微服务B和微服务C,微服务B和微服务C又调用其他的微服务,这就是所谓的“扇出”。如果扇出的链路上某个微服务的调用响应时间过长或者不可用,对微服务A的调用就会占用越来越多的系统资源,进而引起系统崩溃,即服务雪崩。
为了应对服务雪崩,Hstrix诞生!
Hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免地会调用失败,比如超时、异常等,Hystrix能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性。
二、Hstrix 服务熔断 演示
1,按照前面两篇文章讲解的方式,新建 Module
(如果对IDEA新建Module有疑惑的小伙伴,可以翻看小编之前的文章:Springcloud 之 Eureka 服务搭建。有详细介绍到如何搭建 IDEA 工程)

2,添加 pom.xml 依赖
<!-- 将微服务provider注册进入eureka-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
3,添加 application.yml 配置文件
server:
port: 8001
spring:
application:
name: microservicecloud-dept
eureka:
client: #客户端注册进入eureka服务列表
service-url:
# defaultZone: http://localhost:7001/eureka 单机版eureka
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka,http://eureka7003.com:7003/eureka #集群版eureak
instance:
instance-id: microservicecloud-provider-hystrix-8001 #修改当前eureka客户端instance名
prefer-ip-address: true #访问路径可以显示IP地址
4,启动类添加 @EnableHystrix 注解
@SpringBootApplication
@EnableEurekaClient
@EnableHystrix
public class ProviderHystrixApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderHystrixApplication.class,args);
}
}
5,新建 Controller 方法,并配置 @HystrixCommand 熔断方法
@RestController
public class DeptController {
@RequestMapping("/getById")
@HystrixCommand(fallbackMethod = "processHystrix_GetById")
public String getById(@RequestBody(required = false) String id){
if ("pipickeke".equals(id)){
throw new RuntimeException();
}
return "provider 8001";
}
public String processHystrix_GetById(@RequestBody(required = false) String id){
return "当前服务异常,触发Hystrix熔断机制";
}
}
6,调试
启动各项服务:
(关于当前小编所搭建的 Eureka 集群及服务代码细节,可以翻看之前的文章,都有详细演示,在此不再赘述)

调用消费端接口:http://localhost/consumer/get
服务正常:

服务熔断:

因为我们在服务提供端的接口里面,配置了如下熔断机制:






