读书笔记——spring cloud 中 HystrixCommand的四种执行方式简述

读了《Spring Cloud 微服务实战》第151-154页, 总结如下:

Hystrix存在两种Command,一种是HystrixCommand,另一种是HystrixObservableCommand。

对于HystrixCommand,有四种执行方式:

1、同步执行:execute,同步,直接返回结果,该方式有注解方式的实现

    @HystrixCommandpublic String helloService(){
        return restTemplate.getForEntity("http://hello-service/hello",String.class).getBody();
    }

2、异步执行:queue,异步,返回Future,直到调用Future的get方法时,才会阻塞,直获取结果,在那之前都是在异步执行的,该方式有注解方式的实现

    @HystrixCommandpublic Future<String> queueService(){
        return new AsyncResult<String>(){
            public String invoke(){
                return restTemplate.getForEntity("http://hello-service/hello",String.class).getBody();
            }
        };
    }

以上两种,返回值不同,注意观察。

3、异步执行,直到订阅时发射返回结果:observe该方式未找到注解方式的实现

4、同步执行,直到订阅才开始执行,然后发射返回结果:toObservable该方式未找到注解方式的实现

以上3和4,因为只能发射一次,所以不如使用HystrixObservableCommand,可以发射多次,并且有注解方式的实现,可替代上方

1、HystrixObservableCommand的 observe 和  toObservable

    @HystrixCommand(fallbackMethod = "helloFallback",
            observableExecutionMode = ObservableExecutionMode.EAGER//observe方式
            /*,observableExecutionMode = ObservableExecutionMode.LAZY toObservable方式*/
            /*,ignoreExceptions = {Exception.class} 定义忽略异常,则遇到该类异常将不再执行fallback方法,直接包装后抛出*/
            )
    //用的是注解写的是HystrixCommand,其实实现的是HystrixObservableCommand,因此支持自定义多次发射
    public Observable<String> obserableService(){
        return Observable.create(new Observable.OnSubscribe<String>(){
           public void call(Subscriber<? super String> observer){
               try{            //这里不需加判断,可以删掉判断
                   if(!observer.isUnsubscribed()){
                       String result = restTemplate.getForEntity("http://hello-service/hello",String.class).getBody();
                       observer.onNext(result);
                       //可以写多个onNext,发射多次
                       observer.onNext(result);
                       observer.onCompleted();
                   }
               }catch (Exception e){
                   observer.onError(e);
               }
           }
        });
        //在方法外边调用subscribe方法
    }

所谓“发射”,大家可以理解为 使用回调方法,发射多次,意味着可以多次调用回调方法,比如:

1、如果返回了一个List,我们又想把List里的每个对象都处理一下

2、再或者我们的实现里调用了多个服务,可以每个服务的结果都处理一下

等。。。

原文地址:https://www.cnblogs.com/flying607/p/8387175.html

时间: 2024-11-08 20:33:15

读书笔记——spring cloud 中 HystrixCommand的四种执行方式简述的相关文章

【学习笔记】——原生js中常用的四种循环方式

一.引言 本文主要是利用一个例子,讲一下原生js中常用的四种循环方式的使用与区别: 实现效果: 在网页中弹出框输入0   网页输出"欢迎下次光临" 在网页中弹出框输入1   网页输出"查询中--" 在网页中弹出框输入2   网页输出"取款中--" 在网页中弹出框输入3   网页输出"转账进行中--" 在网页中弹出框输入其他字符   网页输出"无效按键" 四种循环: for循环 while循环 for  in

Android中Activity的四种启动方式

谈到Activity的启动方式必须要说的是数据结构中的栈.栈是一种只能从一端进入存储数据的线性表,它以先进后出的原则存储数据,先进入的数据压入栈底,后进入的数据在栈顶.需要读取数据的时候就需要从顶部开始读取数据,栈具有记忆功能,对栈的操作不需要指针的约束.在Android中Activity的显示其实就是一个入栈和出栈的过程.当打开一个Activity的时候Activity入栈,当关闭一个Activity的时候Activity出栈,用户操作的Activity位于栈顶,一般情况下,一个应用程序对应一

Javascript中函数的四种调用方式

一.Javascript中函数的几个基本知识点: 1.函数的名字只是一个指向函数的指针,所以即使在不同的执行环境,即不同对象调用这个函数,这个函数指向的仍然是同一个函数. 2.函数中有两个特殊的内部属性:arguments和this. arguments主要是用来保存函数参数,arguments中的callee属性主要是用来指向拥有当前arguments的函数(理解Javascript参数中的arguments对象). 3.在ECMAScript5中规范了另一个函数属性:caller(Opera

XML解析——Java中XML的四种解析方式

 XML是一种通用的数据交换格式,它的平台无关性.语言无关性.系统无关性.给数据集成与交互带来了极大的方便.XML在不同的语言环境中解析方式都是一样的,只不过实现的语法不同而已. XML的解析方式分为四种:1.DOM解析:2.SAX解析:3.JDOM解析:4.DOM4J解析.其中前两种属于基础方法,是官方提供的平台无关的解析方式:后两种属于扩展方法,它们是在基础的方法上扩展出来的,只适用于java平台. 针对以下XML文件,会对四种方式进行详细描述: 1 <?xml version="1.

黑马程序员——XML解析---java中XML的四种解析方式

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- XML是一种通用的数据交换格式,它的平台无关性.语言无关性.系统无关性.给数据集成与交互带来了极大的方便.XML在不同的语言环境中解析方式都是一样的,只不过实现的语法不同而已. XML的解析方式分为四种:1.DOM解析:2.SAX解析:3.JDOM解析:4.DOM4J解析.其中前两种属于基础方法,是官方提供的平台无关的解析方式:后两种属于扩展方法,它们是在基础的方法上扩展出来的,只适用于jav

Java中XML的四种解析方式(二)

三.JDOM解析 特征: 1.仅使用具体类,而不使用接口. 2.API大量使用了Collections类. 1 import org.jdom2.Attribute; 2 import org.jdom2.Document; 3 import org.jdom2.Element; 4 import org.jdom2.JDOMException; 5 import org.jdom2.input.*; 6 import java.io.*; 7 import java.util.ArrayLis

lua中for循环的四种遍历方式

lua中for的四种遍历方式区别 table.maxn 取最大的整数key #table 从1开始的顺序整数最大值,如1,2,3,6 #table == 3 key,value pairs 取每一个键值对 ipairs 取从key==1开始的顺序整数最大值,每个键值对 参考http://rangercyh.blog.51cto.com/1444712/1032925 不过有一个问题, tbtest = { [1] = 1, [2] = 2, [4] = 4, } print(#(tbtest))

(转) Spring读书笔记-----Spring的Bean之配置依赖

前一篇博客介绍了Spring中的Bean的基本概念和作用域(Spring读书笔记-----Spring的Bean之Bean的基本概念),现在介绍Spring Bean的基本配置. 从开始我们知道Java应用中各组件的相互调用的实质可以归纳为依赖关系.根据注入方式的不同,Bean的依赖注入可以分为两种形式: 1.  属性:通过<property …/>元素配置,对应设置注入. 2.  构造器参数:通过<constructor-arg…/>元素配置,对应构造注入. 不管是属性,还是构造

Spring Cloud中五大神兽总结(Eureka/Ribbon/Feign/Hystrix/zuul)

Spring Cloud中五大神兽总结(Eureka/Ribbon/Feign/Hystrix/zuul) 1.Eureka Eureka是Netflix的一个子模块,也是核心模块之一.Eureka是一个基于REST的服务,用于定位服务,以实现云端中间层服务发现和故障转移.服务注册与发现对于微服务架构来说是非常重要的,有了服务发现与注册,只需要使用服务的标识符,就可以访问到服务,而不需要修改服务调用的配置文件了.功能类似于dubbo的注册中心,比如Zookeeper. Eureka包含两个组件: