git地址:https://github.com/Netflix/Hystrix
目前hystrix已经进入维护模式了,官方建议用resilience4j
重要概念(理论):
服务降级(fallback):
例如:服务器忙,请稍后再试,不让客户端等待,并立刻返回一个友好提示,fallback
哪些情况会发出降级: (返回一个好看的界面,友好的提示,并不是乱码之类的)
1、程序运行异常
2、超时
3、服务熔断触发服务降级
4、线程池/信号量打满也会导致服务降级
服务熔断(break):
类比保险丝达到最高访问之后,直接拒绝访问,拉闸,等待叫用服务降级方法并返回友好提示
服务限流(flowlimit):
秒杀高并发等操作,严禁一窝蜂的过来拥挤,大家排队,一秒钟N个,有序进行
案例代码
服务降级代码,首先开启Hystrix,然后去配置兜底方法,出现异常也会进入兜底方法,fallbackMethod
熔断案例
相当于在10秒内*(请求窗口期设置)访问次数10次,有百分之60的请求失败了,就开启熔断,拉闸。也就是10秒内10次请求6次失败就打开熔断器。
熔断器有三种状态
OPEN打开,HREF OPEN半开,CLOSE关闭
@HystrixProperty(name = "circuitBreaker.enabled", value = "true"),/* 是否开启断路器*/ @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "10"),// 请求次数 @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "10000"), // 时间窗口期 @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "60"),// 失败率达到多少后跳闸
注解参数可以去这个地方找到去相关配置
限流案例
图形化界面:
pom.xml 依赖 (注意:一定要有spring-boot-starter-actuator依赖做图形化界面)
<dependencies>
<!--新增hystrix dashboard 仪表盘监控-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>
<!--图形化设置 要是要有Dashboard界面就一要-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
application.yml
server:
port: 9001
主启动类加上注解
@EnableHystrixDashboard
/**
* 注意:新版本Hystrix需要在主启动类中指定监控路径
* 此配置是为了服务监控而配置,与服务容错本身无关,spring cloud升级后的坑
* ServletRegistrationBean因为springboot的默认路径不是"/hystrix.stream",
* 只要在自己的项目里配置上下面的servlet就可以了
*
* @return ServletRegistrationBean
*/
@Bean
public ServletRegistrationBean getServlet() {
HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet();
ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet);
// 一启动就加载
registrationBean.setLoadOnStartup(1);
// 添加url
registrationBean.addUrlMappings("/hystrix.stream");
// 设置名称
registrationBean.setName("HystrixMetricsStreamServlet");
return registrationBean;
}