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

  • 阿里云国际版折扣https://www.yundadi.com

  • 阿里云国际,腾讯云国际,低至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可以提高系统的可用性、稳定性和性能。

  • 阿里云国际版折扣https://www.yundadi.com

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

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

    算法训练 Day 2 | 数组:977.有序数组的平方,209.长度最小的子数组,59.螺旋矩阵II

    1. 有序数组的平方 977. 有序数组的平方 第一想法:暴力破解 看完题解想法:朝着双指针方向想 遇到困难: 用双指针的话,一开始想到两边指针往中间靠,逐个将最大值赋给结果数组。和...

    【CTF】CTF竞赛介绍以及刷题网址

    CTFCapture The Flag中文一般译作夺旗赛在网络安全领域中指的是网络安全技术人员之间进行技术竞技的一种比赛形式。CTF起源于1996年DEFCON全球黑客大会以代替之前黑客们通过互相发起真实攻击进行技术比拼的方式。发展至今已经成为全球范围网络安全圈流行的竞赛形式2013年全球举办...

    Python网络爬虫之HTTP原理是什么 - 开发技术

    今天小编给大家分享一下Python网络爬虫之HTTP原理是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。HTTP 基本原理在本文中,我们会详细了解...

    迭代器的使用

    #include<iostream> #include<vector> using namespace std; int main() { vector<int> v1(10); for(int i=0;i<v1.size(...

    #if0

    #if 0 #endif 用于屏蔽注释中间的代码,避免注释嵌套,如果你的代码没注释,那么它与/**/的实际用途没啥区别 #define a 1; #if a;//ok #end if int a = 1; #if a;//虽然不会报错,但是没啥用#if中间的...

    基于阿里云物联网平台设计的实时图传系统

    一、项目功能介绍 当前基于MQTT协议设计了一个实时图传系统,通过这个项目来演示,两个MQTT设备如何互相订阅,进行消息流转。 在阿里云服务器上创建2个设备,分为为设备A和设备B;设备A负责采集本地摄像头画面上传,...