在上篇文章中,我们介绍了断路器Hystrix的一个简单使用,主要是通过注解来实现断路器的功能的,不过对于Hystrix的使用,除了注解,我们也可以使用继承类的方式来实现,本文我们就来看看另一种Hystrix的使用方式。


本文是Spring Cloud系列的第十一篇文章,了解前十篇文章内容有助于更好的理解本文:

1.使用Spring Cloud搭建服务注册中心
2.使用Spring Cloud搭建高可用服务注册中心
3.Spring Cloud中服务的发现与消费
4.Eureka中的核心概念
5.什么是客户端负载均衡
6.Spring RestTemplate中几种常见的请求方式
7.RestTemplate的逆袭之路,从发送请求到负载均衡
8.Spring Cloud中负载均衡器概览
9.Spring Cloud中的负载均衡策略
10.Spring Cloud中的断路器Hystrix


本文所使用的服务注册中心、服务提供者和服务消费者都是我们在前文中搭建出来的,这里我就不再赘述,不了解的小伙伴请翻看本系列前面几篇文章(文末提供了源码下载)。

自定义HystrixCommand

我们除了使用@HystrixCommand注解,也可以自定义类继承自HystrixCommand,如下:

public class BookCommand extends HystrixCommand<Book> {private RestTemplate restTemplate;@Overrideprotected Book getFallback() {return new Book("宋诗选注", 88, "钱钟书", "三联书店");}public BookCommand(Setter setter, RestTemplate restTemplate) {super(setter);this.restTemplate = restTemplate;}@Overrideprotected Book run() throws Exception {return restTemplate.getForObject("http://HELLO-SERVICE/getbook1", Book.class);}
}

在BookCommand中注入RestTemplate,然后重写两个方法:一个是getFallback,这个方法将在服务调用失败时回调;另一个是run方法,执行请求时调用。构造方法的第一个参数主要用来保存一些分组信息。

同步调用和异步调用

当BookCommand创建成功之后,我们就可以在我们的Controller中调用它了,如下:

@RequestMapping("/test1")
public Book test1() throws ExecutionException, InterruptedException {BookCommand bookCommand = new BookCommand(HystrixCommand.Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("")), restTemplate);//同步调用//Book book1 = bookCommand.execute();//异步调用Future<Book> queue = bookCommand.queue();Book book = queue.get();return book;
}

关于这一段调用,我说如下几点:

1.获取到BookCommand对象之后,我们有两种方式来执行请求,一种是调用execute方法发起一个同步请求,另一种是调用queue方法发起一个异步请求。
2.同步请求中可以直接返回请求结果。
3.异步请求中我们需要通过get方法来获取请求结果,在调用get方法的时候也可以传入超时时长。

执行结果如下:

如果我们先启动一个服务注册中心,再启动两个服务提供者实例,再启动一个服务消费者,然后再关掉一个服务提供者,此时再访问,就会间隔的看到如下页面:

通过注解实现异步请求

在上篇文章([Spring Cloud中的断路器Hystrix]())中我们使用了注解来配置Hystrix,当时我们的写法如下:

@HystrixCommand
public Book test2() {return restTemplate.getForObject("http://HELLO-SERVICE/getbook1", Book.class);
}

那么这种请求是一种同步请求的方式,如果我们想要使用注解来实现异步请求怎么办呢?很简单,两个步骤:

1.配置HystrixCommandAspect的Bean

在项目的入口类中配置一个HystrixCommandAspect的Bean,如下:

@Bean
public HystrixCommandAspect hystrixCommandAspect() {return new HystrixCommandAspect();
}

2.通过AsyncResult来执行调用

还是使用@HystrixCommand注解,但是方法的实现使用AsyncResult,如下:

@HystrixCommandpublic Future<Book> test3() {return new AsyncResult<Book>() {@Overridepublic Book invoke() {return restTemplate.getForObject("http://HELLO-SERVICE/getbook1", Book.class);}};}

OK,如此之后我们就可以通过注解来实现异步调用了。调用方式如下:

@RequestMapping("/test3")
public Book test3() throws ExecutionException, InterruptedException {Future<Book> bookFuture = bookService.test3();//调用get方法时也可以设置超时时长return bookFuture.get();
}

对响应式函数编程的支持

有的小伙伴可能对响应式函数编程情有独钟,Hystrix对此也提供了相应的支持,在我们获取到BookCommand对象之后,也可以通过如下两种方式来获取到一个Observable<Book>来对数据进行二次处理:

BookCommand bookCommand = new BookCommand(HystrixCommand.Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("")), restTemplate);Observable<Book> observe = bookCommand.observe();Observable<Book> bookObservable = bookCommand.toObservable();

关于Observable<Book>小伙伴们可以自行度娘RxJava的用法,我这里就不再赘述,就说下observe和toObservable的区别:

1.observe命令在调用的时候会立即返回一个Observable。
2.toObservable则不会立即返回一个Observable,订阅者调用数据的时候才会执行。

通过注解支持响应式函数编程

当然,响应式函数编程也可以通过注解来实现,如下:

@HystrixCommand
public Observable<Book> test4() {return Observable.create(new Observable.OnSubscribe<Book>() {@Overridepublic void call(Subscriber<? super Book> subscriber) {if (!subscriber.isUnsubscribed()) {Book book = restTemplate.getForObject("http://HELLO-SERVICE/getbook1", Book.class);subscriber.onNext(book);subscriber.onCompleted();}}});
}

这个时候我们可以通过在注解中添加参数来描述是通过observe还是toObservable来实现,如下:

@HystrixCommand(observableExecutionMode = ObservableExecutionMode.EAGER)表示使用observe模式来执行
@HystrixCommand(observableExecutionMode = ObservableExecutionMode.LAZY)表示使用toObservable模式来执行

OK,Hystrix自定义请求命令我们就先说这么多,整体上来看,还是注解要方便一些。下篇文章我们来看看服务降级的问题。

案例地址:https://github.com/lenve/SimpleSpringCloud

更多JavaEE资料请关注公众号:

Spring Cloud自定义Hystrix请求命令相关推荐

  1. Spring Cloud自定义Hystrix请求命令 1

    在上篇文章中,我们介绍了断路器Hystrix的一个简单使用,主要是通过注解来实现断路器的功能的,不过对于Hystrix的使用,除了注解,我们也可以使用继承类的方式来实现,本文我们就来看看另一种Hyst ...

  2. Spring Cloud中Hystrix的请求合并

    在微服务架构中,我们将一个项目拆分成很多个独立的模块,这些独立的模块通过远程调用来互相配合工作,但是,在高并发情况下,通信次数的增加会导致总的通信时间增加,同时,线程池的资源也是有限的,高并发环境会导 ...

  3. Spring Cloud中Hystrix仪表盘与Turbine集群监控

    Hystrix仪表盘,就像汽车的仪表盘实时显示汽车的各项数据一样,Hystrix仪表盘主要用来监控Hystrix的实时运行状态,通过它我们可以看到Hystrix的各项指标信息,从而快速发现系统中存在的 ...

  4. Spring Cloud中Hystrix仪表盘与Turbine集群监控 1

    Hystrix仪表盘,就像汽车的仪表盘实时显示汽车的各项数据一样,Hystrix仪表盘主要用来监控Hystrix的实时运行状态,通过它我们可以看到Hystrix的各项指标信息,从而快速发现系统中存在的 ...

  5. Spring Cloud中Hystrix 线程隔离导致ThreadLocal数据丢失(续)

    前言 上篇文章<Spring Cloud中Hystrix 线程隔离导致ThreadLocal数据丢失>我们对ThreadLocal数据丢失进行了详细的分析,并通过代码的方式复现了这个问题. ...

  6. Spring Cloud Netfix Hystrix(断路器)

    一.灾难性雪崩 造成灾难性雪崩效应的原因,可以简单归结为下述三种: 服务提供者(Application Service)不可用.如:硬件故障.程序BUG.缓存击穿.并发请求量过大等. 重试加大流量.如 ...

  7. Spring Cloud中Hystrix、Ribbon及Feign的熔断关系是什么?

    导读 今天和大家聊一聊在Spring Cloud微服务框架实践中,比较核心但是又很容易把人搞得稀里糊涂的一个问题,那就是在Spring Cloud中Hystrix.Ribbon以及Feign它们三者之 ...

  8. Spring Cloud之Hystrix服务容错

    Spring Cloud之Hystrix服务容错 Hystrix的概述 Hystrix的使用 相关依赖 Eureka注册中心 服务提供者 服务消费者 执行测试 @HystrixCommand详解 服务 ...

  9. Spring Cloud 之 Hystrix

    Spring Cloud 之 Hystrix 1. Feign+Hystrix实现RPC调用保护 2. Spring Cloud Hystrix失败回退 3. Spring Cloud Hystrix ...

最新文章

  1. PIL:python图像处理库的介绍
  2. 【转】OGRE资源相关分析
  3. 神经网络的反向传导到底是在干什么?
  4. 【数理知识】《矩阵论》方保镕老师-第2章-\lambda 矩阵与 Jordan 标准形
  5. php实现上传文件功能,简单实现php上传文件功能
  6. Download a image 图片另存为
  7. 贴片铝电容识别及型号_铝电容和钽电容的区别,你们知道吗?
  8. Exception in thread “main“ java.lang.NoClassDefFoundError: org/jaxen/NamespaceContext
  9. leetcode237
  10. Mac查看本地ip地址
  11. 联想笔记本电脑重装系统按F几
  12. 助力自己在金融领域中更加游刃有余的人大与加拿大女王大学金融硕士项目你读到了吗?
  13. Java随机产生昵称
  14. java中excel文件的导入,限制上传的文件类型,文件的大小,显示上传文件的进度条...
  15. Python-密码爆破
  16. android获取系统蓝牙版本,[Android O] 蓝牙设备默认名称获取
  17. 医护管理平台系统服务器,康软智能移动医护管理系统
  18. 青龙脚本--快手极速版解密6w版(废-已不能使用)
  19. 文件存取信息(c++)
  20. JTAG和ULINK、JLINK、ST-LINK

热门文章

  1. git远程强制更新到本地
  2. Celery-------项目目录
  3. 100层楼2个鸡蛋,如何得知鸡蛋能承受几层的撞击
  4. 通过简单的 ResourceManager 管理 XNA 中的资源,WPXNA(二)
  5. TCP/IP 5.3.5 认证
  6. 电脑主板主要外部接口
  7. 脸部螨虫和肥皂洗脸的问题
  8. ubuntu20.04运行《大航海家2》
  9. Unable to instantiate org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient
  10. RSA key format is not supported