Hystrix从原理到详细使用

本文详细介绍了Hystrix的起源、原理和使用方法,包括断路器模式、命令模式、观察者模式的解释,以及Hystrix如何实现服务降级、熔断和线程隔离。此外,还探讨了Hystrix的配置与监控优化,提供了如何使用Hystrix的注解方式和配置示例,并推荐了Hystrix Dashboard作为实时监控工具。
摘要由CSDN通过智能技术生成

Hystrix从原理到使用

一、什么是Hystrix

  • 源自Martin Fowler的Circuit Breaker,即断路器。“断路器”本身是一种开关装置,用于线路上的过载保护,当线路发生短路时,会及时切断故障电路,防止一系列问题。
  • 在分布式架构中,断路器模式也是类似,当某个单元发生故障,及时切断联系,防止线程因调用故障服务而长时间等待而不被释放,最终导致故障在分布式系统中的蔓延。
  • Hystrix实现的功能有:服务降级、服务熔断、线程和信号隔离、请求缓存、请求合并、以及服务监控等功能。(对于请求缓存功能,个人建议不要使用,除非该实例是单机运行,否则会出现数据不一致的问题

二、Hystrix的原理

​ 在讲解Hystrix的原理之前,先介绍两种设计模式,分别是:命令模式、观察者模式。

1、命令模式

在这里插入图片描述

以上就是命令模式的图示:Invoker为行为请求者、Receiver为行为实现者。以下列出这种模式的伪代码:

public class InvokerAndReceiver {
   
    /**
     * 命令的抽象
     */
    interface Command {
   
        void execute();
    }

    /**
     * 调用者
     */
    static class Invoker {
   
        private Command command;

        public void setCommand(Command command) {
   
            this.command = command;
        }

        public void execute() {
   
            command.execute();
        }
    }

    /**
     * 业务的具体实现
     */
    static class Receiver {
   
        public void action() {
   
            //do some task.
            System.out.println("doing...");
        }
    }

    /**
     * 命令的封装
     */
    static class CommandImpl implements Command {
   
        private Receiver receiver;
        public CommandImpl(Receiver receiver) {
   
            this.receiver = receiver;
        }
        @Override
        public void execute() {
   
            receiver.action();
        }
    }

    public static void main(String[] args) {
   
        Receiver receiver=new Receiver();
        Command command=new CommandImpl(receiver);
        Invoker invoker=new Invoker();
        invoker.setCommand(command);
        invoker.execute();
    }
}

2、观察者模式

观察者模式的实现模型与订阅模式类似,这里以Hystrix底层使用的RxJava作为介绍。

 public static void main(String[] args) {
   
   //被观察者,也是事件源
        Observable<String> source=Observable.create(subscriber -> {
   
            subscriber.onNext("Hello !");
            subscriber.onNext("welcome to subscribe it.");
          //事件源通知异常。
          	subscriber.onError(new NullPointerException("error"));
          //结束
          	subscriber.onCompleted();
        });
   //观察者
        Subscriber<String> subscriber=new Subscriber<String>() {
   
            @Override
            public void onCompleted() {
   
              //完成后的工作
            }

            @Override
            public void onError(Throwable throwable) {
   
              //观察者在这处理异常的事务
            }

            @Override
            public void onNext(String s) {
   
              //获取事件源的持续信息,如果事件源持续发布事件。
                System.err.println(s);
            }
        };
        source.subscribe(subscriber);
    }

以下是观察者模式的两种分类:

  • 热观察
    • 每个观察者都可以在事件源的中途加入,这会造成看到的是加入后的局部信息。
  • 冷观察
    • 事件源需要等待观察者加入后,才发布事件,这样,看到的是全部过程。

好了,介绍完这两种模式,我们才能够分析Hystrix的底层原理。

3、原理分析

​ 首先,我们从@HystrixCommand注解入手。

@HystrixCommand(fallbackMethod = "fallBack")
    public String hiService() {
   
        return restTemplate.getForObject("http://provider/zone?",String.class);
    }

@HystrixCommand注解会为当前方法创建一个HystrixCommand对象,这个类的主要作用是命令模式中对于Command的封装,执行命令有如下两个方法:

//用于异步请求,返回的是Future对象,包含服务执行结束时会返回的结果对象。 
public Future<R> queue() {
   
        /*
         * The Future returned by Observable.toBlocking().toFuture() does not implement the
         * interruption of the execution thread when the "mayInterrupt" flag of Future.cancel(boolean) is set to true;
         * thus, to comply with the contract of Future, we must wrap around it.
         */
        final Future<R> delegate = toObservable
Hystrix是Netflix开源的一款容错框架,用于处理分布式系统中的故障和延迟。它主要用于防止服务雪崩效应,并提供了故障转移和服务降级的机制。 Hystrix原理是通过隔离和限制对依赖服务的访问来提高系统的弹性。它通过使用线程池来隔离不同的服务调用,并设置超时时间来限制请求的执行时间。当某个依赖服务出现故障或延迟时,Hystrix会自动触发服务降级,返回一个备选的响应结果,避免故障扩散到整个系统。 使用Hystrix需要以下几个步骤: 1. 添加Hystrix依赖:在项目的构建文件中添加Hystrix的依赖,例如在Maven项目中添加以下依赖: ```xml <dependency> <groupId>com.netflix.hystrix</groupId> <artifactId>hystrix-core</artifactId> <version>1.5.18</version> </dependency> ``` 2. 定义Hystrix命令:创建一个继承自HystrixCommand的类,重写run()方法,在其中实现对依赖服务的调用逻辑。 ```java public class MyCommand extends HystrixCommand<String> { protected MyCommand() { super(HystrixCommandGroupKey.Factory.asKey("MyGroup")); } @Override protected String run() throws Exception { // 调用依赖服务的逻辑 return "Hello, World!"; } } ``` 3. 执行Hystrix命令:在需要调用依赖服务的地方,创建并执行Hystrix命令。 ```java String result = new MyCommand().execute(); ``` 4. 设置服务降级:在HystrixCommand中重写getFallback()方法,定义当依赖服务出现故障时的备选响应结果。 ```java @Override protected String getFallback() { return "Fallback response"; } ``` 通过以上步骤,你可以使用Hystrix来保护你的分布式系统免受故障和延迟的影响,并实现服务的降级和故障转移。当然,这只是Hystrix的基本使用教程,你还可以进一步了解Hystrix的更多高级特性和配置选项来满足你的具体需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值