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…

速盾:海外服务器如何加速

海外服务器加速是一种优化网络连接的方法&#xff0c;目的是提高用户对海外服务器的访问速度。由于地理位置、网络带宽等因素的限制&#xff0c;用户在访问海外服务器时常常会遇到访问缓慢的问题。为了解决这个问题&#xff0c;以下是一些常见的海外服务器加速方法。 使用CDN技…

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

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

(Askchat.ai、ChatAI、智友AI、AI写作生成器助手、在线AI助手)分享好用的ChatGPT

目录 1、Askchat.ai - 梦想为蓝图,ChatGPT为笔。 2、ChatAI 3、智友AI - MyChatGPT 4、AI写作生成器助手

opencv-基本操作

本篇文章&#xff0c;我们将聊一聊利用opencv进行的一些基本操作&#xff0c;以便后续我们利用opencv进行更加复杂的处理。 1、图像的读取、显示与保存 opencv中利用cv2.imread读取RGB图像&#xff0c;利用cv2.imshow() 进行图像的显示。 # 注意: cv2.imread读取RGB图像时, 返回…

在 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…

第二弹:走进CSS世界,学习记录

目录 1.1. 了解CSS 1.2. 放置CSS的几种方式 1.3. CSS选择器 1.3.1. 基本选择器 1.3.2. 层级选择器 1.3.3. 属性选择器 1.3.4. 结构性伪类选择器 1.3.5. 状态伪类选择器 1.3.6. 选择器优先级 1.3.7. 文本属性 1.3.8. 背景属性 1.3.9. 尺寸属性 1.3.10. 列表属性 1…

K8s(二十三):Pod的生命周期详解

🔴 K8s(二十三):Pod的生命周期详解 1、Pod的生命周期1.1、Pod的创建1.2、Pod的调度1.3、Pod的初始化1.4、Pod的运行及钩子函数1.4.1 k8s中的3种钩子函数1.4.2 k8s中的3种探测类型1.5、Pod的终止1.6、Pod的重启2、Pod的生命周期的五种状态(相位)💖The Begin💖点点关注…

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

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

ChatGPT: 人工智能对话的革命

介绍: 在人工智能领域&#xff0c;ChatGPT被视为创新的典范&#xff0c;重新定义了我们与技术交互的方式。从回答查询到生成创意内容&#xff0c;ChatGPT利用语言的力量促进了无缝沟通。在这篇全面指南中&#xff0c;我们深入探讨ChatGPT的复杂性&#xff0c;探索其功能、应用…

Java调用GDAL实现postgresql数据生成shp和dxf

需求 由于shp数据存储到postgresql数据库中&#xff0c;前端调用数据库实现数据的渲染&#xff0c;最近有一个新的需求&#xff0c;前端圈选数据&#xff0c;实现数据的下载&#xff0c;数据可以是shp、dxf、excel格式&#xff0c;这里主要记录在后端通过调用gdal来实现这个需…

使用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中…