1、Hystrix
1、简介
Hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,
比如超时、异常等,Hystrix能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,以提
高分布式系统的弹性。
“断路器”本身是一种开关装置,当某个服务单元发生故障之后,通过断路器的故障监控,向调用方法返回一个符合
预期的、可处理的备选相应(FallBack),而不是长时间的等待或者抛出调用方无法处理的异常,这样就保证了
服务调用方的线程不会被长时间、不必要的占用,从而避免了故障在分布式系统的蔓延,乃至雪崩。
2、作用
1、服务降级
服务处理不过来的时间,提示服务器忙,请稍后再试,不让客户端等待。FallBack。
什么情况会触发降级:
1、程序运行异常
2、服务调用超时
3、服务熔断触发服务降级
4、线程池满也会导致降级
2、服务熔断
达到最大的访问服务后,直接拒绝访问,然后调用服务降级返回友好提示
3、服务限流
秒杀高并发操作,限流。
3、服务降级
1、新建服务提供,添加pom依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
2、在主启动类开启断路器@EnableCircuitBreaker
3、在需要对服务降级的方法上添加@HystrixCommand注解
举例:
@HystrixCommand(fallbackMethod = "payment_timeoutHandler",commandProperties = {
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",
value = "3000")
})
public String payment_timeout(Integer id) throws InterruptedException {
if(id > 0){
TimeUnit.SECONDS.sleep(5);
return "线程池:" + Thread.currentThread().getName() + ", payment_timeout ,
id : " + id + ", success~~~";
}else{
int a = 10/0;
return "线程池:" + Thread.currentThread().getName() + ", payment_timeout ,
id : " + id + ", success~~~";
}
}
public String payment_timeoutHandler(Integer id){
return "服务降级,端口:8001,线程池:" + Thread.currentThread().getName() + ",
payment_timeoutHandler , id : " + id + ", fail~~~";
}
4、新建服务消费者,同样添加pom依赖
5、在主启动类添加@EnableHystrix,配置application.properties,开启feign和hystrix开关
feign.hystrix.enabled = true
6、同样可以客户端对服务进行降级,和3的配置类似
7、在类上添加@DefaultProperties(defaultFallback = "payment_Global_FallBack")
配置服务降级的方法
8、在需要配置的方法上加@HystrixCommand即可
9、默认方法上配置了详细的服务降级策略则不使用全局的,否则使用全局的
10、默认降级方法在业务逻辑放在一起过于混乱,在服务消费端因为使用了Feign,所以有一个调用服务的远程
接口,写一个实现类添加@Component,在实现类里实现降级,在接口上添加@FeignClient(name =
"PROVIDER-PAYMENT-HYSTRIX-SERVICE",fallback = OrderServiceFallBack.class),指明服务降级使
用的哪个类即可。
4、服务熔断
1、和服务降级类似配置
2、在需要熔断的方法上加上注解
@HystrixCommand(fallbackMethod = "circuitBreakerHandler",commandProperties = {
//是否开启断路器
@HystrixProperty(name = "circuitBreaker.enabled",value = "true"),
//请求次数
@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold",value = "10"),
// 时间窗口期
@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value = "10000"),
//失败率达到多少后跳闸
@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value = "60"),
})
简述:该方法在10s内调用次数大于等于10次,如果失败率高达60%则开启熔断。
默认10秒,20次,50%错误率。、
详细@HystrixProperty参数参考Github
https://github.com/Netflix/Hystrix/wiki/Configuration
5、服务监控
1、新建项目,添加pom依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>
2、在主启动类加上注解@EnableHystrixDashboard
3、访问http://localhost:xxx/hystrix进入图形界面
4、在需要监控的服务启动类配置一个Bean
@Bean
public ServletRegistrationBean getServlet() {
HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet();
ServletRegistrationBean registrationBean = new
ServletRegistrationBean(streamServlet);
registrationBean.setLoadOnStartup(1);
registrationBean.addUrlMappings("/hystrix.stream");
registrationBean.setName("HystrixMetricsStreamServlet");
return registrationBean;
}
5、在图形化监控输入http://localhost:xxx/hystrix.stream,需要访问的服务端口
6、即可看到服务的信息