您现在的位置是:主页 > 数据库技术 > 数据库技术

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

IDCBT2021-12-25服务器技术人已围观

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

小编给大家分享一下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 "";
        }
    }
}

标签:

很赞哦! ()

本栏推荐