1.pom.xml
org.springframework.cloud
spring-cloud-starter-netflix-hystrix
2.启动类添加@EnableCircuitBreaker注解
3.需要服务降级的方法上添加@HystrixCommand
@HystrixCommand(fallbackMethod = "paymentInfo_timeout_handler", commandProperties = {
@HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds", value = "2000")
})
4.提供触发服务降级条件或发生异常时的执行方法
public String paymentInfo_timeout_handler(Long id){
return "线程:" + Thread.currentThread().getName() + " 系统繁忙请稍后再试,id:" + id + ",hystrix兜底处理";
}
1.pom.xml
org.springframework.cloud
spring-cloud-starter-netflix-hystrix
2.yaml文件
feign:
hystrix:
enabled: true
client:
config:
default:
ReadTimeout: 15000
ConnectTimeout: 15000 #设置ribbon超时时间
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 15000 # 设置hystrix的超时时间
3.启动类添加@EnableHystrix注解
4.在需要进行服务降级的调用接口上添加@HystrixCommand
@HystrixCommand(fallbackMethod = "paymentInfo_timeout_fallback", commandProperties = {
@HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds", value = "9000")
})
5.提供触发服务降级条件或调用发生异常时的执行方法
public String paymentInfo_timeout_fallback(@PathVariable("id") Long id){
return "我是订单模块80,支付模块业务繁忙请稍后再试" + id;
}
6.注意:hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds和ribbon超时时间默认都是1s,网上有人说只需要配置其中一个,但是本人测试,这两块配置少了任何一个,调用时间超过1s后都会触发服务降级
1.在接口类上添加注解@DefaultProperties
@DefaultProperties(defaultFallback = "global_fallback")
2.提供触发服务降级时执行的方法
public String global_fallback(){
return "全局异常服务降级处理";
}
3.在需要服务降级的接口上添加@HystrixCommand注解,默认触发服务降级时,即会执行全局服务降级处理方法。
1.提供FeignClient接口的实现类(服务降级处理类)
@Component
public class OrderServiceImpl implements OrderService {
@Override
public String paymentInfo(Long id) {
return "paymentIfo fall back 在服务上配置服务降级";
}
@Override
public String paymentInfo_timeout(Long id) {
return "paymentIfo time out fall back 在服务上配置服务降级";
}
}
2.定义@FeignClient的fallback属性指向服务降级处理类
@FeignClient(value = "CLOUD-PROVIDER-HYSTRIX-PAYMENT", fallback = OrderServiceImpl.class)
熔断打开:断路器配置以后默认处于closed状态,达到熔断条件后,进入open状态,请求不再调用当前服务,内部设置一般为MTTR(平均故障处理时间,默认5s),当打开长达到所设时钟则进入half open
熔断关闭:熔断关闭不会对服务进行熔断
熔断半开:部分请求根据规则调用当前服务,如果请求成功且符合规则则认为当前服务恢复正常,关闭熔断
模拟代码如下:
@HystrixCommand(fallbackMethod = "paymentCircutHandler", 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"), //失败率达到多少后跳闸
})
@GetMapping("/payment/hystrix/circut/{id}")
public String paymentCircutBreaker(@PathVariable Long id){
if (id < 0){
throw new RuntimeException("id不合法");
}
String result = "线程:" + Thread.currentThread().getName() + " 调用成功,流水号:" + IdUtil.simpleUUID();
log.info("******result:{}", result);
return result;
}
public String paymentCircutHandler(Long id){
return "id不合法,请稍后再试";
}
断路器的快照时间窗,也叫做窗口期。可以理解为一个触发断路器的周期时间值,默认为10秒(10000)。
断路器的窗口期内触发断路的请求阈值,默认为20。换句话说,假如某个窗口期内的请求总数都不到该配置值,那么断路器连发生的资格都没有。断路器在该窗口期内将不会被打开。
断路器的窗口期内能够容忍的错误百分比阈值,默认为50(也就是说默认容忍50%的错误率)。打个比方,假如一个窗口期内,发生了100次服务请求,其中50次出现了错误。在这样的情况下,断路器将会被打开。在该窗口期结束之前,即使第51次请求没有发生异常,也将被执行fallback逻辑。
hystrix dashboard项目模块搭建
org.springframework.cloud
spring-cloud-starter-netflix-hystrix-dashboard
添加@EnableHystrixDashboard注解
dashboard项目启动后浏览器打开监控页面
http://localhost:9001/hystrix
http://localhost:8008/hystrix.stream
根据尚硅谷课程讲解,由于springcloud的坑,在被监控项目启动类中需要添加如下代码
@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;
}