Hystrix断路器的打开与关闭

4.断路器是否打开
在命令结果没有缓存命中的时候,Hystrix在执行命令前需要检查断路器是否为打开状态:
如果断路器是打开的,那么Hystrix不会执行命令,而是转接到fallback处理逻辑
如果断路器是关闭的,那么Hystrix调到第5步(线程池/请求队列/信号量是否占满),检查是否有可用资源来执行命令

断路器开启:
1.整个链路达到一定的阈值,默认情况下,10秒内产生超过20次请求,则符合第一个条件
2.满足第一个条件的情况下,如果请求的错误百分比大于阈值,则会打开断路器,默认50%

public class OpenMain {

	public static void main(String[] args) {
		//10秒内有10次请求满足第一个条件
		ConfigurationManager.getConfigInstance().setProperty(
				"hystrix.command.default.circuitBreaker.requestVolumeThreshold",10);
		for(int i=0;i<15;i++){
			ErrorCommand c=new ErrorCommand();
			String result=c.execute();
			System.out.println(result);
			System.out.println(c.isCircuitBreakerOpen());
		}
	}
	static class ErrorCommand extends HystrixCommand<String>{
		public ErrorCommand(){
			super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("ExampleGroup"))
					.andCommandPropertiesDefaults(HystrixCommandProperties.Setter().withExecutionTimeoutInMilliseconds(500)));
		}
		protected String run() throws InterruptedException{
			Thread.sleep(800);
			return "success";
		}
		protected String getFallback(){
			return "fallback";
		}
	}
}
public class CloseMain {
	
	public static void main(String[] args) throws InterruptedException {
		ConfigurationManager.getConfigInstance().setProperty(
				"hystrix.command.default.circuitBreaker.requestVolumeThreshold",3);
		boolean isTimeout=true;
		for(int i=0;i<10;i++){
			TestCommand c=new TestCommand(isTimeout);
			c.execute();
			System.out.println(c.isCircuitBreakerOpen());
			HealthCounts hc=c.getMetrics().getHealthCounts();
			System.out.println("健康信息:"+hc.getTotalRequests());
			if(c.isCircuitBreakerOpen()){
				isTimeout=false;
				System.out.println("------------断路器打开了,等待休眠期结束");
				Thread.sleep(6000);
			}
		}
	}
	static class TestCommand extends HystrixCommand<String>{
		private boolean isTimeout;
		public TestCommand(boolean isTimeout){
			super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("ExampleGroup"))
					.andCommandPropertiesDefaults(HystrixCommandProperties.Setter().withExecutionTimeoutInMilliseconds(500)));
			this.isTimeout=isTimeout;
		}
		protected String run() throws InterruptedException{
			if(isTimeout){
				Thread.sleep(800);
			}else{
				Thread.sleep(200);
			}
			return "";
		}
		protected String getFallback(){
			return "fallback";
		}
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值