Hystrix 介绍
中文名: "豪猪",豪猪周身长满了刺,能保护自己不受天敌的伤害, 代表了一种防御机制, 因此Netflix团队将该框架命名为Hystrix.
Hystrix.png
为什么要用Hystrix:
在一个分布式系统里,许多依赖不可避免的会调用失败,比如超时、异常等,如何能够保证在一个依赖出问题的情况下,不会导致整体服务失败,这个就是Hystrix需要做的事情。Hystrix提供了熔断、隔离、Fallback、cache、监控等功能,能够在一个、或多个依赖同时出现问题时保证系统依然可用。
如何使用:
使用非常简单, 只需要2步:
1: 引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
2: 在启动类上增加@EnableCircuitBreaker
下面我们对Hystrix的具体功能加以讲解:
1: 服务降级
服务降级是指server端不能正常服务的时候, 可以使用服务降级, 内部服务问题(RuntimeException)的也可以降级, 降级到自己的处理方法中.
HystrixController.java
import com.netflix.hystrix.contrib.javanica.annotation.DefaultProperties;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
@DefaultProperties(defaultFallback = "defaultFallback") //如果没有在降级的方法中指定fallbackMethod, 就使用default的
public class HystrixController {
//当http://localhost:8083/getProduct不可访问的时候, 发生降级
//@HystrixCommand(fallbackMethod = "fallback")
@HystrixCommand
@GetMapping("/getProductList")
public String getProductList(){
RestTemplate restTemplate = new RestTemplate();
String result = restTemplate.getForObject("http://localhost:8083/getProduct", String.class);
return result;
}
private String fallback(){
return "请稍后再试~~~";
}
private String defaultFallback(){
return "默认fallback,请稍后再试~~~";
}
}
2: 超时
当访问的服务需要很久的时候, 就可以设置, 当超时的时候如何处理), 下面可以设置超时的时间, 可以通过注解实现和yml实现
a:在方法上增加注解
@HystrixCommand(commandProperties = {
@HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds", value="3000")
})
b: 在application.yml中配置
hystrix:
commond:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 2000
3: 熔断
在一定时间内,用户请求超过一定的比例失败时(timeout, failure, reject),断路器就会打开;短路器打开后所有请求直接走fallback
enter code here
@HystrixCommand(commandProperties = {
@HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds", value="1000"),
@HystrixProperty(name="circuitBreaker.enabled", value="true"), //设置熔断, 某个服务单元发生问题, 则断路
@HystrixProperty(name="circuitBreaker.requestVolumeThreshold", value="10"),
@HystrixProperty(name="circuitBreaker.sleepWindowInMilliseconds", value="10000"),
@HystrixProperty(name="circuitBreaker.errorThresholdPercentage", value="60")
})
@GetMapping("/getProductList2")
4: 和Feign结合
feign.hystrix.enabled = true
Hystrix的可视化
1: 在启动类上增加
@EnableHystrixDashboard
2: 引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
3: yml中增加
management:
endpoints:
web:
exposure:
include: "*"
4: 浏览器中输入
http://localhost:8085/hystrix
5: 输入
http://localhost:8085/actuator/hystrix.stream
2000, title(随便写)
6: 就可以进入到监控画面
HystrixDashboard.jpg
网友评论