spring cloud中Hystrix断路器如何开启和关闭

77次阅读
没有评论

共计 4463 个字符,预计需要花费 12 分钟才能阅读完成。

丸趣 TV 小编给大家分享一下 spring cloud 中 Hystrix 断路器如何开启和关闭,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!

18 断路器的开启和关闭断路器开启

  断路器一旦开启,就会直接调用回退方法,不再执行命令,而且也不会更新链路的健康状况。断路器的开启要满足两个条件:

 1、整个链路达到一定的阀值,默认情况下,10 秒内产生超过 20 次请求,则符合第一个条件。

 2、满足第一个条件的情况下,如果请求的错误百分比大于阀值,则会打开断路器,默认为 50%。

 Hystrix 的逻辑,先判断是否满足第一个条件,再判断第二个条件,如果两个条件都满足,则会开启断路器。断路器开启的测试代码,请见代码清单 6 -8。

  代码清单 6 -8:

 codes\06\6.2\first-hnystrix-client\src\main\java\org\crazyit\cloud\breaker\OpenTest.java

public class OpenTest { public static void main(String[] args) throws Exception {
 // 10 秒内有 10 个请求,则符合第一个条件
 ConfigurationManager.getConfigInstance().setProperty(  hystrix.command.default.metrics.rollingStats.timeInMilliseconds , 10000);
 ConfigurationManager.getConfigInstance().setProperty(  hystrix.command.default.circuitBreaker.requestVolumeThreshold , 10);
 ConfigurationManager.getConfigInstance().setProperty(  hystrix.command.default.circuitBreaker.errorThresholdPercentage , 50);
 for(int i = 0; i   15; i++) {
 //  执行的命令全部都会超时
 MyCommand c = new MyCommand();
 c.execute();
 //  断路器打开后输出信息
 if(c.isCircuitBreakerOpen()) { System.out.println( 断路器被打开,执行第    + (i + 1) +    个命令 
 }
 }
 }
 /**
 *  模拟超时的命令
 * @author  杨恩雄
 *
 */
 static class MyCommand extends HystrixCommand String  {
 //  设置超时的时间为 500 毫秒
 public MyCommand() { super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey( ExampleGroup))
 .andCommandPropertiesDefaults(HystrixCommandProperties.Setter()
 .withExecutionTimeoutInMilliseconds(500))
 );
 }
 protected String run() throws Exception {
 //  模拟处理超时
 Thread.sleep(800);
 return  
 }
 @Override
 protected String getFallback() {
 return  
 }
 }
}

  注意代码清单 6 - 8 中的三个配置,第一个配置了数据统计的时间,第二个配置了请求的阀值,第三个配置了错误百分比。如果在 10 秒内,有大于 10 个请求发生,并且请求的错误率超过 50%,则开启断路器。

  命令类 MyCommand 中,设置了命令执行的超时时间为 500 毫秒,命令执行需要 800 毫秒,换言之,该命令总会超时,命令模拟了现实环境中所依赖的服务瘫痪(超时响应)的情况。

  在运行类中,循环 15 次执行命令,调用 isCircuitBreakerOpen 方法,如果断路器打开,则输出信息。运行代码清单 6 - 8 的 OpenTest 类,输出如下:

 断路器被打开,执行第  11  个命令
断路器被打开,执行第  12  个命令
断路器被打开,执行第  13  个命令
断路器被打开,执行第  14  个命令
断路器被打开,执行第  15  个命令 

  根据结果可知,前面执行的 10 个命令没有开启断路器,而到了第 11 个命令,断路器被打开,命令不再执行。

断路器关闭

  断路器打开后,在一段时间内,命令不会再执行(一直触发回退),这段时间我们称作“休眠期”。休眠期默认值为 5 秒,休眠期结束后,Hystrix 会尝试性的执行一次命令,此时断路器的状态不是开启,也不是关闭,而是一个半开的状态,如果这一次命令执行成功,则会关闭断路器并清空链路的健康信息,如果执行失败,断路器会继续保持打开的状态。断路器的打开与关闭测试,请见代码清单 6 -9。

  代码清单 6 -9:

 codes\06\6.2\first-hnystrix-client\src\main\java\org\crazyit\cloud\breaker\CloseTest.java

public class CloseTest { public static void main(String[] args) throws Exception {
 // 10 秒内有 3 个请求就满足第一个开启断路器的条件
 ConfigurationManager.getConfigInstance().setProperty(  hystrix.command.default.metrics.rollingStats.timeInMilliseconds , 10000);
 ConfigurationManager.getConfigInstance().setProperty(  hystrix.command.default.circuitBreaker.requestVolumeThreshold , 3);
 //  请求的失败率,默认值为 50%
 ConfigurationManager.getConfigInstance().setProperty(  hystrix.command.default.circuitBreaker.errorThresholdPercentage , 50);
 //  设置休眠期,断路器打开后,这段时间不会再执行命令,默认值为 5 秒,此处设置为 3 秒
 ConfigurationManager.getConfigInstance().setProperty(  hystrix.command.default.circuitBreaker.sleepWindowInMilliseconds , 3000);
 //  该值决定是否执行超时
 boolean isTimeout = true; 
 for(int i = 0; i   10; i++) {
 //  执行的命令全部都会超时
 MyCommand c = new MyCommand(isTimeout);
 c.execute(); 
 //  输出健康状态等信息
 HealthCounts hc = c.getMetrics().getHealthCounts();
 System.out.println(断路器状态: + c.isCircuitBreakerOpen() + 
  ,  请求总数: + hc.getTotalRequests());
 if(c.isCircuitBreakerOpen()) {
 //  断路器打开,让下一次循环成功执行命令
 isTimeout = false;
 System.out.println( =====  断路器打开了,等待休眠期结束  ===== 
 //  休眠期会在 3 秒后结束,此处等待 4 秒,确保休眠期结束
 Thread.sleep(4000);
 } 
 }
 }
 /**
 *  模拟超时的命令
 * @author  杨恩雄
 *
 */
 static class MyCommand extends HystrixCommand String  {
 
 private boolean isTimeout;
 
 //  设置超时的时间为 500 毫秒
 public MyCommand(boolean isTimeout) {
 super( Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey( ExampleGroup))
 .andCommandPropertiesDefaults(HystrixCommandProperties.Setter()
 .withExecutionTimeoutInMilliseconds(500))
 );
 this.isTimeout = isTimeout;
 }
 protected String run() throws Exception {
 //  让外部决定是否超时
 if(isTimeout) {
 //  模拟处理超时
 Thread.sleep(800);
 } else { Thread.sleep(200);
 }
 return  
 }
 @Override
 protected String getFallback() {
 return  
 }
 }
}

  代码清单中,配置了休眠期为 3 秒,循环 10 次,创建 10 个命令并予执行。在执行完第 4 个命令后,断路器会被打开,此时我们等待休眠期结束,让下次循环的命令执行成功。

  代码清单中使用了一个布而值来决定是否执行成功,第 5 次命令会执行成功,此时断路器将会被关闭,剩下的命令全部都可以正常执行。在循环体中,使用了 HealthCounts 对象,该对象用于记录链路的健康信息,如果断路器关闭(链路恢复健康),HealthCounts 里面的健康信息将会被重置。运行代码清单 6 -9,效果如下:

 断路器状态:false,  请求总数:0
断路器状态:false,  请求总数:1
断路器状态:false,  请求总数:2
断路器状态:true,  请求总数:3
=====  断路器打开了,等待休眠期结束  =====
断路器状态:false,  请求总数:0
断路器状态:false,  请求总数:1
断路器状态:false,  请求总数:1
断路器状态:false,  请求总数:3
断路器状态:false,  请求总数:3
断路器状态:false,  请求总数:5

看完了这篇文章,相信你对“spring cloud 中 Hystrix 断路器如何开启和关闭”有了一定的了解,如果想了解更多相关知识,欢迎关注丸趣 TV 行业资讯频道,感谢各位的阅读!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-16发表,共计4463字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)