Hystrix的简单介绍与使用

作者: 李多多 日期: 2020-07-08
Spring Cloud
Hystrix的简单介绍与使用

Hystrix 是 Netflix 针对微服务分布式系统采用的熔断保护中间件,相当于电路中的保险丝。

在分布式环境中,许多服务依赖项中的一些必然会失败。Hystrix 是一个库,通过添加延迟容忍和容错逻辑,帮助你控制这些分布式服务之间的交互。Hystrix 通过隔离服务之间的访问点、停止级联失败和提供回退选项来实现这一点,所有这些都可以提高系统的整体弹性。

在微服务架构下,很多服务都相互依赖,如果不能对依赖的服务进行隔离,那么服务本身也有可能发生故障,Hystrix 通过 HystrixCommand 对调用进行隔离,这样可以阻止故障的连锁效应,能够让接口调用快速失败并迅速恢复正常,或者回退并优雅降级。

Hystrix 的简单使用

首先创建一个Spring Boot 模块,然后添加如下依赖:

创建成功后,添加如下配置,将Hystrix 注册到 Eureka 上:

spring.application.name=hystrix
server.port=3000
eureka.client.service-url.defaultZone=http://localhost:1111/eureka

然后在项目启动类上添加如下注解,开启断路器,同时提供一个RestTemplate :

//@SpringBootApplication
//@EnableCircuitBreaker
@SpringCloudApplication //【组合注解】@SpringCloudApplication = @SpringBootApplication + @EnableCircuitBreaker
public class HystrixApplication {

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

@Bean
@LoadBalanced
RestTemplate restTemplate(){
return new RestTemplate();
}

}

接下来提供Hystrix 接口:

@Service
public class HelloService {

@Autowired
RestTemplate restTemplate;

/**
* 在这个方法中,将发起一个远程调用,去调用provider中提供的 /hello接口
* 但是调用这个方法可能会失败,
*
* 所以在方法上面添加 @HystrixCommand ,配置fallbackMethod 属性,这个属性表示该方法调用失败时的临时替代方法
* 【专业术语:服务降级】 */
@HystrixCommand(fallbackMethod = "error")//如果希望直接抛出异常,不做服务降级 。则再加上ignoreExceptions配置(fallbackMethod = "error",ignoreExceptions = ArithmeticException.class)
public String hello(){
return restTemplate.getForObject("http://provider/hello",String.class);
}

/**
* 这个方法名要和 fallbackMethod一致
* 方法返回值也要一致 【比如这里都是String类型,error也要一致】
* 此处 调用 备案方案 ,比如数据库崩了,就要去查缓存
*
* **下面也可以继续写HystrixCommand调用error2 ,然后error2再去调用其它的方法,方法一样,依次往下,这就是【服务降级】
* **越往下,数据的获取能力越来越容易,准确性可能降低,但不会让系统挂掉。
* **这就是Hystrix 的作用: 1. 降级 2. 容错。 避免雪崩 。
*
* @return
*/
//@HystrixCommand(fallbackMethod = "error2")
public String error(){
return "error";
}

}
@RestController
public class HelloController {
@Autowired
HelloService helloService;

@GetMapping("/hello")
public String hello(){
return helloService.hello();
}

}

启动Eureka 服务,启动两个provider实例(打两个包),启动一个consumer,访问consumer 去调用两个provider接口(负载均衡方式),访问成功之后然后突然关闭一个provider服务,再去刷新请求consumer,会有短时间的报错。(原因是一个provider掉线,它自己要把掉线的消息告诉Eureka,Eureka再把provider掉线的消息告诉consumer,在这个过程中肯定是有延迟的,在consumer没收到provider掉线的消息之前就有可能会去访问已经掉线的provider,这时就会有异常抛出。Hystrix在这里其实就是解决很短时间内的问题,consumer访问掉线的provider时不让弹出错误页面就行)