赞
踩
hystrix的降级有两种
1,线程隔离的降级
hystrix会为方法中每个调用的服务生成一个单独的线程池,对于这个线程池可以设置1.1请求超时时间,1.2,线程数量限制,没有设置用默认
2,熔断降级
熔断降级主要是采取计数看一定请求数量内的失败率,和熔断开关的打开时间,没有设置用默认的,20次请求中50%失败打开熔断器,此失败就不是
1,中的超时主要是异常
Hystrix是Netflix公司的一款开源的一个延迟和容错库,用于隔离访问远程服务,第三方库,防止出现级联失败。
微服务,服务间调用关系错中复杂,一个请求,可能调用多个接口服务才能实现,会形成特别复杂的调用链路。
例如:一次请求需要调用A/P/H/I四个服务,这四个服务又要调用其他服务。
如果微服务 I 发生异常,请求阻塞,用户不会得到响应,则tomcat的这个线程不会得到释放。
于是越来越多用户请求,越来越多的线程阻塞。服务器支持的并发数和线程是有限的,请求一直阻塞,会导致服务器资源耗尽,从而导致所有其他服务都不可用。形成雪崩效应。
Hystrix为每个依赖服务调用分配一个线程池,如果线程池已满调用将会被立即拒绝。默认不采用排队,加速失败,判定时间。
用户请求将不在直接访问服务,而是通过线程池中的闲置线程来访问服务,如果线程池已满,或者请求超时,则会进行降级处理。
什么是降级处理?
优先保证核心服务,而非核心服务不可用或者弱可用。
优势:
用户请求故障时,不会被阻塞或看到系统崩溃。至少可以看到一个执行结果。
导致Hystrix服务降级的情况:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
@SpringBootApplication
@EnableCircutBreaker//开启熔断
public class TestApplcation{
public static void main(String[] args){
SpringApplication.run(TestApplication.class,args);
}
}
或者
@SpringCloudApplication
public class TestApplication{
public static void main(String[] args){
SpringApplication.run(TestApplication.class,args);
}
}
@SpringCloudApplication 组合了微服务经常会引入的三个注解,
1.@EnableCircutBreaker 开启熔断
2.@SpringBootApplication
3.@EnableDiscoveryClient 开启负载均衡
@RestController("test")
public class TestController{
@Autowried
private TestTemplate testTemplate;
@HystrixCommand(fallbackMethod="queryTestByIdFallBack")
public String queryTestById(@Param("id")Long id){
}
public String queryTestByIdFallBack(Long id){
return "请求繁忙";
}
}
注意:
熔断降级逻辑方法必须跟正常逻辑方法返回值保持一致。
@HystrixCommand(fallbackMethod=“queryTestByIdFallBack”)用来声明一个降级逻辑方法。
@RestController("test")
@DefaultProperties(defaultFallback="queryTestByIdFallBack") //声明一个全局降级逻辑方法
public class TestController{
@HystrixCommand
public String queryTestById(@Param("id")Long id){
return "";
}
public String queryTestByIdFallBack(Long id){
return "请求繁忙";
}
}
Hystrix默认超时时间为1S,我们可以通过hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds
来设置Hystrix超时时间。
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds:6000 #设置超时时间为6000ms
熔断状态机3个状态:
修改熔断策略参数:
circuitBreaker:
requestVolumeThreshold:10
sleepWindowInMilliseconds:1000
errorThresholdPercentage:50
1.requestVolumeThreshold:触发熔断的最小请求次数:默认20
2.errorThresholdPercentage:触发熔断的失败请求最小占比:默认50%
3.sleepWindowInMilliseconds:休眠时长,默认5000ms
参考:
https://blog.csdn.net/weixin_42789301/article/details/105093898
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。