springcloud Hystrix熔断器
一、HyStrix
Hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,比如超时、异常等,Hystrix能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性。
"断路器”本身是一种开关装置,当某个服务单元发生故障之后,通过断路器的故障监控(类似熔断保险丝),向调用方返回一个符合预期的、可处理的备选响应(FallBack),而不是长时间的等待或者抛出调用方无法处理的异常,这样就保证了服务调用方的线程不会被长时间、不必要地占用,从而避免了故障在分布式系统中的蔓延,乃至雪崩。
1、核心概念
服务降级(fallback)服务器忙,请稍后再试,不让客户端等待并立刻返回一个友好提示
程序运行异常
超时
服务熔断触发服务降级
线程池/信号量也会导致服务降级
服务熔断(break)类比保险丝达到最大服务访问后,直接拒绝访问,拉闸限电,然后调用服务降级的方法并返回友好提示;服务的降级->进而熔断->恢复调用链路
服务限流(flowlimit)秒杀高并发等操作,严禁一窝蜂的过来拥挤,大家排队,一秒钟N个,有序进行
2、服务端降级
概念:服务器忙,请稍后再试,不让客户端等待并立即返回友好提示,fallback。
发生原因:程序异常,超时,服务熔断触发服务降级,线程池打满。
2.1 pom
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
2.2 实现
// 一般服务降级放在客户端
@Override
@HystrixCommand(fallbackMethod = "timeOutHandler",commandProperties = {
@HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value = "5000")
})
public String timeOut() {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return StringFormatter.format("当前线程:%s ,值:%s ,等待时间:%s",Thread.currentThread().getName(),"哈嘿ok","3s").getValue();
}
public String timeOutHandler() {
return StringFormatter.format("当前线程:%s ,值:%s ,等待时间:%s",Thread.currentThread().getName(),"呜呜~","2s").getValue();
}
2.3 启动项注解
@EnableCircuitBreaker
@SpringBootApplication
@EnableEurekaClient
@EnableCircuitBreaker
public class PaymentHy8001 {
public static void main(String[] args) {
SpringApplication.run(PaymentHy8001.class, args);
}
}
3、客户端降级
3.1 pom
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!--eureka client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
3.2 实现
@Component
@FeignClient(value = "provider-payment-hystrix",path = "/payment/hy",fallback = PaymentServiceFallBack.class)
public interface PaymentService {
@GetMapping("/ok")
public String ok();
@GetMapping("/timeout")
public String timeout();
}
@Component
public class PaymentServiceFallBack implements PaymentService{
@Override
public String ok() {
return StringFormatter.format("80-当前线程:%s ,值:%s ,等待时间:%s",Thread.currentThread().getName(),"呜呜~","2s").getValue();
}
@Override
public String timeout() {
return StringFormatter.format("80-当前线程:%s ,值:%s ,等待时间:%s",Thread.currentThread().getName(),"呜呜~","2s").getValue();
}
}
3.3 启动项注解
@EnableHystrix
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
@EnableHystrix
public class OrderHystrix80 {
public static void main(String[] args) {
SpringApplication.run(OrderHystrix80.class,args);
}
}
4、服务端熔断
概念:类比保险丝达到最大服务访问后直接拒绝访问,然后电泳服务降级方法并返回友好提示。
/**
* 服务熔断
* @param id
* @return
*/
@Override
@HystrixCommand(fallbackMethod = "circuitHandler",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")
})
public String circuit(Long id) {
if(id<0){
throw new RuntimeException("id 不能为负数");
}
return StringFormatter.format("当前id:%s",id).getValue();
}
public String circuitHandler(Long id) {
return StringFormatter.format("当前id %s 不能为负数 ",id).getValue();
}
5、熔断监控
5.1 pom
<!-- 版本号由父工程pom管理 -->
<dependencies>
<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-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
</dependencies>
5.2 启动项
@SpringBootApplication
@EnableHystrixDashboard
public class HystrixDashboard9001 {
public static void main(String[] args) {
SpringApplication.run(HystrixDashboard9001.class,args);
}
}
5.3 被监控启动项
@SpringBootApplication
@EnableEurekaClient
@EnableCircuitBreaker
public class PaymentHy8001 {
public static void main(String[] args) {
SpringApplication.run(PaymentHy8001.class, args);
}
/**
* 此配置是为了服务监控而配置,与服务容错本身无观,springCloud 升级之后的坑
* ServletRegistrationBean因为springboot的默认路径不是/hystrix.stream
* 只要在自己的项目中配置上下面的servlet即可
* @return
*/
@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;
}
}
``
版权声明:本文为CSDN博主「Mr-Wanter」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/mr_wanter/article/details/118385702