Spring Cloud学习笔记(Hystrix):execute,queue,observe,toObservable样例和特性

这是本人学习的总结,主要学习资料如下
- 马士兵教育

  • 1、Overview
  • 2、execute()
    • 2.1、Overview
    • 2.2、示例
  • 3、queue()
    • 3.1、Overview
    • 3.2、示例
  • 4、observe()
    • 4.1、Overview
    • 4.2、示例
  • 5、toObservable()
    • 5.1、observe()和toObservable()的区别

1、Overview

我们知道Hystrix是通过HystrixCommandHystrixObservableCommand两个对象来处理服务请求,服务端以此来简单快速地实现熔断,限流,服务降级等功能。

这两个对象有四个方法execute(),queue(),observe(),toObservable(),这篇文章就是讲解这四个方法如何使用,以及各自有什么特性。

这个Hytrix的架构流程图。
在这里插入图片描述

2、execute()

2.1、Overview

HystrixCommand都拥有这个方法。

execute()是阻塞式的执行逻辑。从源码中能看出来它获取到Future后直接执行了get()方法,自然线程就会阻塞直到对应的job执行完成返回结果。

public R execute() {try {return this.queue().get();} catch (Exception var2) {throw Exceptions.sneakyThrow(this.decomposeException(var2));}
}

2.2、示例

首先是写一个实现HytrixCommnad的类,复写其中的run()方法。实际开发中run()方法里就应该写我们的逻辑代码。这里只是简单打印一下Hello World

为了验证execute()是阻塞式执行,我特意让线程沉睡了800ms

public class CommandDemo extends HystrixCommand<String> {String name;public CommandDemo(String name) {super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("command")));this.name = name;}@Overrideprotected String run() throws Exception {// 模拟业务逻辑Thread.sleep(800);String result = "Hello, World! I'm " + name;return result;}
}

这是测试代码,可以看到执行时间永远是大于800ms,所以execute()是阻塞式执行。

public class CommandTest {@Testpublic void execute() {HystrixCommand<String> commandDemo = new CommandDemo("demo case");long before = System.currentTimeMillis();String execute = commandDemo.execute();long after = System.currentTimeMillis();System.out.println(after - before);System.out.println(execute);}
}

请添加图片描述


3、queue()

3.1、Overview

只有HystrixComand拥有这个方法。

queue()是阻塞式的。它返回一个Future对象,get()方法会阻塞我们的线程。

3.2、示例

实现HystrixCommand的代码不变,这里只展示调用queue()的代码。

因为是非阻塞的,所以打印的时间基本不可能超过800ms

@Test
public void queue() throws Exception{HystrixCommand<String> commandDemo = new CommandDemo("demo case");long before = System.currentTimeMillis();Future<String> queue = commandDemo.queue();long after = System.currentTimeMillis();System.out.println("queue方法执行的时间:" + (after - before) + "ms");System.out.println(queue.get());
}

请添加图片描述


4、observe()

4.1、Overview

HystrixComandHystrixObserveCommand拥有这个方法。

observe()返回一个Observe对象。它比较灵活,可以以阻塞式运行线程,也可以以非阻塞式运行线程。

4.2、示例

  • 这是阻塞式运行线程。需要用到toBlocking().single()之类的方法,这些方法会阻塞线程直到结果返回。
@Test
public void observe() throws Exception{HystrixCommand<String> commandDemo = new CommandDemo("demo case");long before = System.currentTimeMillis();Observable<String> observe = commandDemo.observe();System.out.println(observe.toBlocking().single());long after = System.currentTimeMillis();System.out.println("observe方法执行的时间:" + (after - before) + "ms");
}

在这里插入图片描述


  • 这是非阻塞式调用,主线程不会受到阻塞。我们需要使用subscribe(Subscriber subscriber)方法,覆写参数Subscriber中的onCompleted()onError()onNext()三个方法。

线程执行错误会调用onError(),顺利执行结束后则会依次执行onNext()onCompleted()

在示例中,最后一行沉睡了主线程3000ms。如果不沉睡的话主线程会早于observe的线程结束,导致我们看不到运行结果。

@Test
public void observe2() throws Exception{HystrixCommand<String> commandDemo = new CommandDemo("demo case");long before = System.currentTimeMillis();Observable<String> observe = commandDemo.observe();observe.subscribe(new Subscriber<String>() {@Overridepublic void onCompleted() {System.out.println("Complete...");}@Overridepublic void onError(Throwable throwable) {System.out.println("Error...");}@Overridepublic void onNext(String s) {System.out.println(s);long after = System.currentTimeMillis();System.out.println("observe方法执行的时间:" + (after - before) + "ms");}});System.out.println("主线程的执行时间:" + (System.currentTimeMillis() - before) + "ms");Thread.sleep(3000);
}

请添加图片描述


5、toObservable()

5.1、observe()和toObservable()的区别

HystrixComandHystrixObserveCommand拥有这个方法。

toObservable()返回一个Observe对象,用法和observe()一模一样,这里不重复展示。

observe()toObserve()的区别主要是加载run()方法的时机不同。

  • observe()的执行顺序:
    1. 执行run()方法。
    2. 加载注册Subscribe对象。
    3. run()方法的结果注入到Subscribe对象的onNext()方法中。

  • toObservable()的执行顺序的一二步则是相反:
    1. 加载注册Subscribe对象。
    2. 执行run()方法。
    3. run()方法的结果注入到Subscribe对象的onNext()方法中。

执行顺序的不同可以通过SubscribeonStart()方法来验证,这个方法在onNext()之前进行。

对于observe()来说,onStart()先执行;而toObservable()则是run()先执行。

这是验证代码,需要注意的是,在执行subscribe()方法之前,主线程沉睡一秒,确保observe()toObservable()有足够的时间完成注册。

@Testpublic void toObservable() throws Exception{HystrixCommand<String> commandDemo = new CommandDemo("demo case");long before = System.currentTimeMillis();Observable<String> toObservable = commandDemo.toObservable();// Observable<String> toObservable = commandDemo.observe();Thread.sleep(1000);toObservable.subscribe(new Subscriber<String>() {@Overridepublic void onStart() {System.out.println("Start...");}@Overridepublic void onCompleted() {System.out.println("Complete...");}@Overridepublic void onError(Throwable throwable) {System.out.println("Error...");}@Overridepublic void onNext(String s) {System.out.println(s);long after = System.currentTimeMillis();System.out.println("observe方法执行的时间:" + (after - before) + "ms");}});System.out.println("主线程的执行时间:" + (System.currentTimeMillis() - before) + "ms");Thread.sleep(3000);}

这是observe()的执行结果,run()方法执行在前。
请添加图片描述

这是toObservable()的执行结果,onStart()执行在前

请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/5104.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HDFS架构

HDFS 是一个主从 Master/Slave 架构一个 HDFS 集群包含一个 NameNode,这是一个 Master Server,用来管理文件系统的命名空间,以及协调客户端对文件的访问一个 HDFS 集群包含多个 DataNode,用来存储数据HDFS 会对外暴露一个文件系统命名空间,并允许用户数据以文件的形式进行存储在…

iOS实现一个高性能的跑马灯

效果图 该跑马灯完全通过CATextLayer 实现&#xff0c;轻量级&#xff0c;并且通过 系统的位移动画实现滚动效果&#xff0c;避免了使用displaylink造成的性能瓶颈&#xff0c;使用系统动画&#xff0c;系统自动做了很多性能优化&#xff0c;实现更好的性能&#xff0c;并使用…

java设计模式 -- 工厂模式

1、基本概念 工厂模式&#xff08;Factory Pattern&#xff09;是 Java 中最常用的设计模式之一&#xff0c;这种类型的设计模式属于创建型模式&#xff0c;它提供了一种创建对象的最佳方式。 工厂模式提供了一种创建对象的方式&#xff0c;而无需指定要创建的具体类。 工厂…

python与上位机开发day04

模块和包、异常、PyQt5 一、模块和包 1.1 模块 Python中模块就是一个.py文件&#xff0c;模块中可以定义函数&#xff0c;变量&#xff0c;类。模块可以被其他模块引用 1.1.1 导入模块 """ 导入格式1&#xff1a; import 模块名 使用格式&#xff1a; …

【yolov8目标检测部署】TensorRT int8量化

原作者github&#xff1a;https://github.com/xuanandsix/Tensorrt-int8-quantization-pipline/tree/main 改进&#xff1a; 源代码支持的TensorRT版本为7.许多属性已经弃用&#xff1b; 在原有的代码上将支持的TensorRT版本从7改到8. &#xff01;&#xff01;不知道如何安装T…

【设计模式】简单工厂模式(Simple Factory Pattern)

工厂模式&#xff08;Factory Pattern&#xff09; 用于创建不同类型的奖品对象。您可以创建一个奖品工厂&#xff0c;根据配置的类型来实例化相应的奖品对象。 public interface Prize {void award(); }public class MoneyPrize implements Prize {Overridepublic void awar…

在 Windows 系统上安装 TeamViewer 13

在 Windows 系统上安装 TeamViewer 13 References 默认安装到所有用户 同意协议 安装目录 勾选内容 打开文件位置 打开 rClientID.exe Extras -> Options -> Advanced Show advanced options -> Display language 重新启动TeamViewer 语言可修改为中文简体 …

稳扎稳打 部署丝滑 开源即时通讯(IM)项目OpenIM源码部署流程(linux windows mac)

背景 OpenIM包含多个关键组件&#xff0c;每个都是系统功能必不可少的一部分。具体来说&#xff0c;MongoDB 用于持久化存储&#xff1b;Redis 用作缓存&#xff1b;Kafka 用于消息队列&#xff1b;Zookeeper 用于服务发现&#xff1b;Minio 用于对象存储。这些组件的众多可能会…

C++14之std::exchange的使用和原理分析

目录 1.概述 2.使用 2.1.交换操作 2.2.移动语义 3.原理 4.综合示例 5.总结 1.概述 std::exchange 是 C 标准库中的一个实用函数&#xff0c;它的主要作用是替换一个对象的值&#xff0c;并返回该对象的旧值。这个函数在 C14 中引入&#xff0c;主要用于简化和优化代码。…

OpenCV如何在图像中寻找轮廓

返回:OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;OpenCV如何模板匹配 下一篇 :OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 目标 在本教程中&#xff0c;您将学习如何&#xff1a; 使用 OpenCV 函数 cv::findContour…

55.基于SpringBoot + Vue实现的前后端分离-旅游管理系统(项目 + 论文)

项目介绍 本站是一个B/S模式系统&#xff0c;采用SpringBoot Vue框架&#xff0c;MYSQL数据库设计开发&#xff0c;充分保证系统的稳定性。系统具有界面清晰、操作简单&#xff0c;功能齐全的特点&#xff0c;使得基于SpringBoot Vue技术的旅游管理系统设计与实现管理工作系统…

使用STM32CubeMX对STM32F4进行串口配置

目录 1. 配置1.1 Pin脚1.2 RCC开启外部晶振1.3 时钟1.4 串口配置 2. 代码2.1 默认生成代码2.1 开启串口中断函数2.3 接收中断2.4 接收回调函数2.5 增加Printf 的使用 1. 配置 1.1 Pin脚 1.2 RCC开启外部晶振 1.3 时钟 外部使用8MHz晶振 开启内部16MHz晶振 使用锁相环 开启最高…

ROS2 学习笔记(二)常用小工具

1. rqt_console #启动 ros2 run rqt_console rqt_console日志级别&#xff1a;Fatal --> Error --> Warn --> Info --> Debug #修改允许发布的日志级别 ros2 run <package_name> <executable_name> --ros-args --log-level WARN2. launch文件 ROS2中…

Outlook大附件插件 有效解决附件大小限制问题

很多企业都是使用Outlook来进行邮件的收发&#xff0c;可是由于附件大小有限&#xff0c;导致很多大文件发不出去&#xff0c;就会产生Outlook大附件插件这种业务需求。 邮件系统在发送大文件时面临的限制问题主要如下&#xff1a; 1、附件大小限制&#xff1a;大多数邮件服务…

深度学习基础之《TensorFlow框架(16)—神经网络案例》

一、mnist手写数字识别 1、数据集介绍 mnist数据集是一个经典的数据集&#xff0c;其中包括70000个样本&#xff0c;包括60000个训练样本和10000个测试样本 2、下载地址&#xff1a;http://yann.lecun.com/exdb/mnist/ 3、文件说明 train-images-idx3-ubyte.gz: training s…

Hbase学习笔记

Hbase是什么 HBase是一个高可靠、高性能、面向列、可伸缩的分布式存储系统。它利用Hadoop HDFS作为其文件存储系统,并提供实时的读写的数据库系统。HBase的设计思想来源于Google的BigTable论文,是Apache的Hadoop项目的子项目。它适合于存储大表数据,并可以达到实时级别。HB…

【Redis 开发】Lua语言

Lua Lua语法 Lua语法 Lua是一种小巧的脚本语言&#xff0c;底层用C语言实现&#xff0c;为了嵌入式应用程序中 官网&#xff1a;https://www.lua.org/ 创建lua文件 touch hello.lua 运行lua文件 lua hello.lua 输出语句 print("Hello World!")数据类型 可以通过t…

一篇易懂的SPI通讯指南

SPI概念 SPI&#xff08;Serial Peripheral interface, 串行外设接口&#xff09;是微处理控制单元(MCU)和外围IC&#xff08;如传感器、ADC、DAC、驱动芯片和外部存储设备等&#xff09;之间进行通信的同步串行端口&#xff0c;其通信速率一般可以从几千bps到几百Mbps甚至更高…

QT httpServer多线程后台服务器的例子实现

1.需求 1.1 用户需要其他平台&#xff08;web端&#xff09;调用Qt平台的接口&#xff0c;获取想要的数据并实时显示在网页里&#xff0c;比如实时的温湿度&#xff0c;用户数据等 1.2 用户需要在其他平台&#xff08;web端&#xff09;调用Qt平台的接口&#xff0c;下发数据…

kettle从入门到精通 第五十五课 ETL之kettle Excel输入

想真正学习或者提升自己的ETL领域知识的朋友欢迎进群&#xff0c;一起学习&#xff0c;共同进步。 1、 Excel输入&#xff0c;Microsoft Excel输入步骤的作用是从Microsoft Excel中读取数据&#xff0c;如下图所示&#xff1a; 1&#xff09;Excel输入步骤从文件D:\data\测试数…