前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Hystrix的熔断

Hystrix的熔断

原创
作者头像
堕落飞鸟
发布2023-04-09 07:46:07
3960
发布2023-04-09 07:46:07
举报
文章被收录于专栏:飞鸟的专栏

熔断

熔断是一种保护机制,用于在系统出现故障时停止向该服务发送请求,避免请求导致故障扩散或者系统崩溃。在Hystrix中,熔断机制是通过跟踪服务调用的成功率和失败率来实现的。当失败率达到一定的阈值时,熔断器将会打开,停止向该服务发送请求一段时间,防止请求继续失败导致系统崩溃。在打开状态下,一部分请求会被拒绝并直接返回,而另一部分请求则会被转发到fallback方法中执行。

以下是一些常用的熔断参数:

  • circuitBreaker.enabled:是否启用熔断器,默认值为true。
  • circuitBreaker.requestVolumeThreshold:在一个统计窗口期内,最小的请求数量。如果这个值没有被满足,熔断器将不会打开。
  • circuitBreaker.sleepWindowInMilliseconds:当熔断器被打开后,它会进入一个休眠状态,这个属性定义了休眠的时间。在休眠期间,不会向服务发送请求。
  • circuitBreaker.errorThresholdPercentage:错误比率阈值。当在一个统计窗口期内错误比率超过这个阈值时,熔断器将会打开。

以下是一个使用Hystrix熔断的示例代码:

代码语言:javascript
复制
public class MyHystrixCommand extends HystrixCommand<String> {

    private final Logger logger = LoggerFactory.getLogger(MyHystrixCommand.class);

    protected MyHystrixCommand() {
        super(HystrixCommandGroupKey.Factory.asKey("MyHystrixCommandGroup"));
    }

    @Override
    protected String run() throws Exception {
        // 执行命令逻辑
        return "success";
    }

    @Override
    protected String getFallback() {
        // 执行fallback逻辑
        return "fallback";
    }

    public static void main(String[] args) {
        HystrixCommand.Setter setter = HystrixCommand.Setter
            .withGroupKey(HystrixCommandGroupKey.Factory.asKey("MyHystrixCommandGroup"))
            .andCommandPropertiesDefaults(HystrixCommandProperties.Setter()
                .withCircuitBreakerEnabled(true)
                .withCircuitBreakerRequestVolumeThreshold(10)
                .withCircuitBreakerSleepWindowInMilliseconds(5000)
                .withCircuitBreakerErrorThresholdPercentage(50)
            );

        String result = new MyHystrixCommand().execute();
        System.out.println(result);
    }
}

在这个示例中,我们使用HystrixCommand.Setter来配置命令和熔断属性。我们将熔断器启用,请求阈值设为10,休眠时间设为5000毫秒,错误比率阈值设为50%。这样,在一个统计窗口期内,如果错误比率超过50%并且请求数量达到10个时,熔断器将会打开,停止向该服务发送请求。打开状态持续5秒钟,5秒钟后熔断器将会关闭并重新进入半开状态,允许一部分请求通过执行run方法,测试服务是否恢复正常。

下面我们来测试一下这个示例代码。我们首先运行服务并向它发送10次请求,让它失败的次数超过50%:

代码语言:javascript
复制
public class TestHystrix {

    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            String result = new MyHystrixCommand().execute();
            System.out.println(result);
        }
    }
}

这时候我们可以看到输出的结果是fallback。这是因为在10次请求中,有超过50%的请求失败,熔断器被打开,请求被转发到fallback方法中执行。

接下来我们等待5秒钟,等熔断器进入半开状态,再次发送10次请求:

代码语言:javascript
复制
public class TestHystrix {

    public static void main(String[] args) throws InterruptedException {
        for (int i = 0; i < 10; i++) {
            String result = new MyHystrixCommand().execute();
            System.out.println(result);
            Thread.sleep(1000);
        }
    }
}

这时候我们可以看到输出的结果是success。这是因为在半开状态下,部分请求被允许通过执行run方法,测试服务是否恢复正常。如果请求成功,熔断器将会关闭,否则将会继续保持打开状态。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 熔断
相关产品与服务
测试服务
测试服务 WeTest 包括标准兼容测试、专家兼容测试、手游安全测试、远程调试等多款产品,服务于海量腾讯精品游戏,涵盖兼容测试、压力测试、性能测试、安全测试、远程调试等多个方向,立体化安全防护体系,保卫您的信息安全。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档