提升微服务稳定性与性能:深入剖析Netflix Hystrix框架-CSDN博客

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

说到 Netflix Hystrix 框架一定离不开 com.netflix.hystrix.HystrixCommand这个类是 Netflix 开源的 Hystrix 框架中的一个关键类用于实现服务的容错和熔断功能。它主要用于将远程服务调用封装成一个独立的命令对象以便于进行容错处理和监控。

一、核心源码

源码中有几个关键方法具体方法以及注释看下面的代码

public abstract class HystrixCommand < R > extends AbstractCommand < R > implements HystrixExecutable< R >, HystrixInvokableInfo< R >, HystrixObservable< R > {
    /**
     * 用于【同步】执行命令
     */
    public R execute() {
        try {
            return queue().get();
        }
        catch(Exception e) {
            throw Exceptions.sneakyThrow(decomposeException(e));
        }
    }
    /**
     * 用于【异步】执行命令。
     */
    public Future< R > queue() {
        return f;
    }
    /**
     * execute() 或 queue()失败的时候返回兜底数据
     */
    protected R getFallback() {
        throw new UnsupportedOperationException("No fallback available.");
    }
  /**
   * execute() 和 queue() 被调用的时候执行的方法
   */
    protected abstract R run() throws Exception;
}
二、HystrixCommand 的主要功能及使用场景
  1. 容错处理HystrixCommand 通过封装远程服务调用可以在服务调用失败或超时时执行降级逻辑避免整个系统的级联故障。它提供了一系列的容错策略如超时设置、线程池隔离、断路器等可以根据具体的业务需求进行配置。

  2. 熔断机制HystrixCommand 通过断路器的机制可以在服务调用失败率超过一定阈值时自动熔断避免对不可用的服务进行无效的调用。熔断后HystrixCommand 会快速失败并执行预设的降级逻辑以减少对不可用服务的依赖。

  3. 监控和统计HystrixCommand 提供了丰富的监控和统计功能可以实时监控服务调用的成功率、失败率、响应时间等指标并提供了可视化的仪表盘。这些统计数据可以帮助开发人员了解服务的健康状况及时发现和解决潜在的问题。

HystrixCommand 的使用场景主要包括

  1. 微服务架构在微服务架构中服务之间的调用是不可避免的。使用 HystrixCommand 可以有效地处理服务调用的容错和熔断问题提高系统的可用性和稳定性。

  2. 高并发场景在高并发的场景下如果某个服务出现故障或响应缓慢会导致整个系统的性能下降。使用 HystrixCommand 可以通过设置超时时间和线程池隔离等策略避免因单个服务的故障而影响整个系统的性能。

  3. 服务降级在一些特殊情况下为了保证核心功能的可用性可能需要对某些非关键的功能进行降级处理。使用 HystrixCommand 可以方便地实现服务的降级逻辑保证核心功能的稳定性。

三、业务场景

多个独立的业务逻辑场景非常适合使用 Netflix Hystrix 框架它能并发执行所有的业务逻辑帮我们提升系统的访问速度。

也能方便的监控每个业务逻辑执行时发生的异常、超时等异常也很方便配置各个业务逻辑的兜底fallback等。

具体的业务场景如多个独立的弹窗、多个独立的展示数据。这种业务场景都是一个页面位置中可能出现多种业务。

四、应用代码示例
4.1 抽象类

定制化自己的 AbstractCustomerCommand 类这个类能够实现所有业务逻辑通用的逻辑。

也能实现对每个业务逻辑发生 reject、异常、超时、熔断的时候的监控和日志。

public abstract class AbstractCustomerCommand<R> extends HystrixCommand<R> {
    private final static Logger logger = LoggerFactory.getLogger(AbstractCustomerCommand.class);

    public String key;

    protected AbstractSecondScreenCommand(CommandThreadEnum commandThreadEnum) {
    }


    @Override
    protected R run() throws Exception {
        long t1 = System.currentTimeMillis();
        R r = null;
        try {
            r = doExecute(t1);
        } finally {
            long cost = System.currentTimeMillis() - t1;
        }

        return r;
    }

    @Override
    protected R getFallback() {
        boolean isRejected = isResponseRejected();
        boolean isException = isFailedExecution();
        boolean isTimeout = isResponseTimedOut();
        boolean isCircuit = isCircuitBreakerOpen();
        // 添加异常情况的日志和监控
        logger.error("{} fallback happened,isRejected:{},isException:{},isTimeout:{},isCircuit:{}",
                key, isRejected, isException, isTimeout, isCircuit);
        Throwable exception = getExecutionException();
        if (exception != null) {
            logger.error("{} fallback", key, exception);
        }
        return null;
    }

    protected abstract R doExecute(long start);

    /*所有业务逻辑统一逻辑*/
    public void commonLogic() {
        
    }
}
4.2 具体的业务场景类
@Slf4j
public class Case1Command extends AbstractCustomerCommand<User> {

    // 构造函数
	public LowPriceAreaCommand() {
	}

	@Override
	protected DisplayCard doExecute(long start) {
		// 具体业务逻辑
	}
}

4.3 执行
Case1Command caseCommand = new Case1Command();
// 异步执行
caseCommand.queue();
四、总结

com.netflix.hystrix.HystrixCommand 是 Netflix Hystrix 框架中的核心类用于实现服务的容错和熔断功能。

它通过封装远程服务调用提供容错处理、熔断机制和监控统计等功能适用于微服务架构和高并发场景。通过使用 HystrixCommand可以提高系统的可用性、稳定性和性能。

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

“提升微服务稳定性与性能:深入剖析Netflix Hystrix框架-CSDN博客” 的相关文章

Pro Android学习笔记(一零零):BroadcastReceiver(4):IntentService

作者@恺风Wei。何为IntentService在进一步学习如何进行长时间运行的broadcast receiver之前,我们需要学习一下IntentService。前面提到需要一个service,而执行代码运行在线程,Android提供的IntentService符合这个要求。详细使用可参考An...

Linux目录操作命令

pwd: 显示当前工作目录名格式:pwd [option]     其中选项可为:   -P一只显示实际目录,不显示符号连接。   -L可以显示符号连接的目录。   %pwd  /*显示出当前用户的工作目录名称*/  cd:改变当...

华为OD机试真题 Java 实现【士兵过河】【2022.11 Q4 新题】

    所有题目均有四种语言实现。C++ 实现目录、Python实现目录、Java实现目录、JavaScript实现目录 题目 一支N个士兵的军队正在趁夜色逃亡,途中遇到一条湍急的大河。 敌军在T的时长后到达河面,没到过对岸的士兵都会被消灭。 现在军...

在服务器上怎么使用PHP彻底删除文件 - 编程语言

本篇内容主要讲解“在服务器上怎么使用PHP彻底删除文件”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“在服务器上怎么使用PHP彻底删除文件”吧! 步骤1:查找要删除的文件首先,我们需要指定要删除的...

UVa 10082 WERTYU (water ver.)

10082 - WERTYUTime limit: 3.000 secondshttp://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem...

2036: [蓝桥杯2022初赛] 统计子矩阵(二维前缀和,一维前缀和)

2036: [蓝桥杯2022初赛] 统计子矩阵 内存限制256 MB 时间限制1 S 标准输入输出 题目类型传统 评测方式文本比较 上传者外部导入 提交310 通过74 题目描述 给定一个 N × M 的矩阵A请你统计有多少个子矩阵(最小 1 × 1最大 N × M) 满足 子矩阵中所有数...