zoukankan      html  css  js  c++  java
  • Hystrix框架1--入门

    介绍

    在开发应用中或多或少会依赖各种外界的服务,利用各个服务来完成自己的业务需求,现在流行的微服务架构更是离不开各个服务之间的调用,这就导致整体应用的可用性依赖于各个依赖服务的可用性。
    比如一个依赖30个可靠性为99.99%的服务的应用99.99^30 = 99.7%一下子就只能达到两个9了。就算各个服务达到了可靠性,那总体来说每个月也有2个小时的不可用时间。更不用说会导致的连锁反应。
    这时我们就需要一个框架来隔离各个服务之间的调用,尽可能不影响业务的流程。
    netflix开发了Hystrix这个框架就是为了这个隔离各个服务间调用而创建的框架。

    hello world

    首先来看一个简单的Hello World例子
    使用gradle导入hystrix的jar包

    compile 'com.netflix.hystrix:hystrix-core:1.5.5'
    

    之后就可以使用

    //需要继承HystrixCommand,还可以继承HystrixObservableCommand只是对应接口、调用方法不同
    public class CommandHelloWorld extends HystrixCommand<String> {
    
        private final String name;
    
        public CommandHelloWorld(String name) {
    		//父类构造方法,只需要传入一个GroupKey
            super(HystrixCommandGroupKey.Factory.asKey("ExampleGroup"));
            this.name = name;
        }
    	//真实的方法,在这调用服务等,并返回结果
        @Override
        protected String run()  {
    		return "Hello " + name + "!";
        }
    }
    

    这样就完成了一个Command。接下来调用这个Command

    @Test
    public void testSynchronous() {
        assertEquals("Hello World!", new CommandHelloWorld("World").execute());
        assertEquals("Hello Bob!", new CommandHelloWorld("Bob").execute());
    }
    

    这里直接新建一个实例并调用execute方法。就得到了想要的结果

    调用方法

    以上介绍了execute方法进行调用,这里execute是同步调用,会阻塞当前线程,Hystrix提供了许多异步的方法进行调用

    //同步方法
    @Test
    public void testSynchronousSysOut() {
        System.out.println( new CommandHelloWorld("World").execute());
        System.out.println(  new CommandHelloWorld("Bob").execute());
    }
    //放入队列获得future异步调用
    @Test
    public void testAsynchronous2() throws Exception {
    
        Future<String> fWorld = new CommandHelloWorld("World").queue();
        Future<String> fBob = new CommandHelloWorld("Bob").queue();
    
        assertEquals("Hello World!", fWorld.get());
        assertEquals("Hello Bob!", fBob.get());
    }
    

    其实以上的方法原理都一样,都是调用queue().get()方法,其中queue返回Future对象,之后对future阻塞进行取值。内部其实是调用toObservable().toBlocking().toFuture()来获得future对象的
    还有一种是使用RxJava的observable接口来进行调用的,Hystrix内部底层也是使用RxJava来实现的

    //使用RxJava的Observable
    @Test
    public void testObservable() throws Exception {
    
        Observable<String> fWorld = new CommandHelloWorld("World").observe();
        Observable<String> fBob = new CommandHelloWorld("Bob").observe();
    
        // 阻塞
        assertEquals("Hello World!", fWorld.toBlocking().single());
        assertEquals("Hello Bob!", fBob.toBlocking().single());
    
        // 非阻塞 
        // - this is a verbose anonymous inner-class approach and doesn't do assertions
        fWorld.subscribe(new Observer<String>() {
    
            @Override
            public void onCompleted() {
                // nothing needed here
            }
    
            @Override
            public void onError(Throwable e) {
                e.printStackTrace();
            }
    
            @Override
            public void onNext(String v) {
                System.out.println("onNext: " + v);
            }
    
        });
    

    fallback

    以上只是简单封装了调用的接口,下面来看下Hystrix是如何应对调用的错误的
    当在run方法中主动抛出异常,就会导致下面的错误信息

    com.netflix.hystrix.exception.HystrixRuntimeException: CommandHelloWorld failed and no fallback available.
    

    我们在Command中添加fallback方法

    @Override
    protected String run()  {
    	throw RuntimeException("error");
    	//return "Hello " + name + "!";
    }
    @Override
    protected String getFallback() {
        return "Failure " + name + "!";
    }
    

    修改test方法

    @Test
    public void testSynchronous() {
        assertEquals("Failure World!", new CommandHelloWorld("World").execute());
        assertEquals("Failure Bob!", new CommandHelloWorld("Bob").execute());
    }
    

    这样运行就没有问题了,可以看到当run运行出错时,将会调用fallback,返回值也由fallback提供,当然fallback也出错那就没有办法了,所以需要尽量保证fallback不会出现异常。
    其中值得注意的一点是当手动抛出HystrixBadRequestException时,Hystrix是不会调用fallback的。

    总结

    上面简单介绍了Hystrix的使用,其中还有很多高级功能会在之后介绍

  • 相关阅读:
    1755:菲波那契数列
    1788:Pell数列
    3089:爬楼梯
    7832:最接近的分数
    7649:我家的门牌号
    7216:Minecraft
    7213:垃圾炸弹
    2983:谁是你的潜在朋友
    2723:因子问题
    2722:和数
  • 原文地址:https://www.cnblogs.com/resentment/p/5888145.html
Copyright © 2011-2022 走看看