Spring Cloud学习笔记(Hystrix):基本知识和代码示例

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

  • 1、Hystrix简介
  • 2、Hystrix架构
    • 2.1、Hytrix的入口
    • 2.2、toObservable()流程
  • 3、Hsytrix的简单样例
    • 3.1、dependency
    • 3.2、代码样例

1、Hystrix简介

Hytrix是用于处理处理延迟和容错的开源库,包含服务隔离,服务熔断、服务降级,限流等功能。

  • 服务隔离:当一个服务出问题时,保证问题不会扩散到其他模块。
  • 服务熔断:服务熔断一般和服务降级一起使用,当服务发生错误时,快速告诉服务调用者该服务不可用,免得调用者花额外的时间等待。
  • 限流:流量超出预期时,统一处理额外的流量。

他是给服务提供者使用的组件。利用Hystrix我们可以快速简单地实现上面提到的功能。


2、Hystrix架构

在这里插入图片描述

以上是Hytrix的架构图。

内部它维护着线程池来处理服务请求,在此过程中也维护着一些变量和一些设计模式来实现限流,服务降级等功能。

服务端接到请求后,只需要简单地拿到HystrixCommandHystrixObservableCommand对象(可以作为bean在Spring容器中维护),然后通过这个对象调用服务就能轻松实现Hystrix支持的功能。

2.1、Hytrix的入口

左上是Hytrix的入口,请求服务者的所有请求最终都会被包装成HytrixCommandHytrixObservabeCommand这两个中的一个。

他们暴露了四个方法去请求服务execute()queue()observe()toObservable()。这四个方法大同小异,不过最终真正去执行请求服务的操作都是toObservable()方法,其他三个方法不过是同步异步,阻塞式非阻塞式的不同而已。


2.2、toObservable()流程

上面提到toObservable()才是真正执行请求的方法,我们来看看他具体做了什么。

  1. 查看请求的服务是否有缓存的结果,有则返回,没有继续。
  2. 查看服务熔断器(Circuit Breaker)是否开启,如果开启证明该服务提供者没有能力提供服务,可以直接跳到拒绝服务的getFallback()resumeWithFallback()节省时间。
  3. 查看服务者的线程池是否有余力处理请求。如果没有则开启熔断器以拒绝后续的更多请求,同时跳转到getFallback()resumeWithFallback();如果有则放到线程池的请求列表等待分配线程处理请求。
  4. 正常分配线程提供服务,如果出错就开启熔断器并跳转到getFallback()resumeWithFallback()
  5. 查看处理请求是否超时,如果超时则开启熔断器并跳转到getFallback()resumeWithFallback()
  6. 正常返回服务结果。

3、Hsytrix的简单样例

3.1、dependency

<dependency>
   <groupId>com.netflix.hystrix</groupId>
    <artifactId>hystrix-core</artifactId>
</dependency>

3.2、代码样例

这里用HystrixCommand做示例。

因为Hystrix是通过线程池处理业务逻辑,所以我们要先实现HystrixCommand,业务逻辑写在run()方法里。

构造方法里的逻辑不用深究,示例中传入的魔法值command没有任何功能上的意义,他只是一个名字,标识这个HystrixCommand

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

在Controller那里拿到这个CommandDemo对象,直接执行就行。使用起来就像是在调用普通的Service方法。之后我们可以通过配置等方式简单地完成限流等功能。

@RestController
public class UserController {
	@Autowired
	private CommandDemo commandDemo;
	
    @GetMapping("/getUserInfo")
    public String getUser() {
    	String execute = commandDemo.execute();
        System.out.println(execute);
        return execute;
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

指令和界面【Linux】

指令和界面 前言一、指令 vs 界面交互的需求满足需求的第一阶段——指令满足需求的第二阶段-界面时间 二、指令和界面交互区别为什么要学命令行总结 前言 Linux操作系统提供了丰富的命令行界面和图形用户界面工具&#xff0c;用户可以根据自己的需求选择适合的界面进行操作。命…

【Linux系统】冯•诺依曼体系结构与操作系统

本篇博客整理了操作系统相关的基础知识&#xff0c;先从硬件之冯•诺依曼体系结构&#xff0c;再结合软件之操作系统&#xff0c;旨在帮助读者理解计算机的软硬件资源&#xff0c;和操作系统的管理软硬件资源的手段。 目录 一、冯•诺依曼体系结构 1.计算机硬件设备 2.体系…

基于Springboot的校园生活服务平台(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的校园生活服务平台&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构…

【Java】基本程序设计结构(一)

前言&#xff1a;现在&#xff0c;假定已经成功安装了JDK&#xff0c;并且能够运行上篇示例程序。本篇将开始介绍Java程序中的基本设计结构&#xff0c;其中包括&#xff1a;一个简单的Java应用&#xff0c;注释&#xff0c;数据类型&#xff0c;变量与常量&#xff0c;运算符&…

spring框架学习记录(3)

Spring事务 Spring事务简介 事务作用&#xff1a;在数据层保障一系列的数据库操作同成功同失败Spring事务作用&#xff1a;在数据层或业务层保障一系列的数据库操作同成功或同失败 Spring事务角色 事务管理员&#xff1a;发起事务方&#xff0c;在Spring中通常指代业务层开…

企业级数据治理学习总结

1. 水在前面 “数据治理”绝对是吹过的牛里面最高大上的题目了&#xff0c;本来想直接以《企业级数据治理》为题来水的&#xff0c;码字前又跑去图书馆借了几本书&#xff0c;翻了几页才发现自己连半桶水都提不起&#xff0c;撑死只能在小屁孩跟前吹吹牛。 好吧&#xff0c;实在…

Mysql如何通过ibd文件恢复数据

Mysql ibd文件恢复注意问题 创建数据库&#xff08;随意创建&#xff09;创建数据表&#xff08;备注&#xff1a;表结构要和要恢复的表结构一致&#xff0c;row_format要和ibd文件的row_format一致&#xff0c;否则&#xff0c;会提示两者不一致。 当前row_formatdynamic&…

刘强东创业成功的四大要素:团队、用户体验、成本与效率

摘要&#xff1a; 本文深入探讨了刘强东创业成功的四大关键要素&#xff1a;团队、用户体验、成本和效率。通过对这些要素的细致分析&#xff0c;我们旨在揭示刘强东如何运用这些策略将京东打造成一个全球知名的电商平台。 一、引言 刘强东作为京东集团的创始人和CEO&#xff…

【DPU系列之】DPU中的ECPF概念是什么?全称是什么?(E CPF对标H CPF;embedded CPU function ownership)

ECPF&#xff1a;embedded CPU function ownership。 嵌入式CPU运转ownership。也叫DPU模式&#xff0c;是DPU工作运转3种模式之一&#xff0c;也是默认的模式。这里的嵌入式CPU指的是DPU上ARM CPU&#xff0c;表示网卡所有资源和功能被embedded CPU全权管理&#xff0c;行使所…

虚拟机jvm下

jvm原理与实践 java程序的跨平台特性 jvm基本结构 JVM类加载流程和内存结构总览 类加载 加载阶段 类加载 验证阶段 类加载 准备阶段 类加载 解析阶段 类加载 初始化阶段 程序计数器 虚拟机栈&本地方法栈 栈帧操作 堆 方法区 永久代 元空间 垃圾回收 可触及性

SpringBoot+Vue实现美食交流网站的设计与实现

一、前言介绍 美食交流网站采用Java技术&#xff0c;Mysql数据库存储数据&#xff0c;基于Springboot框架开发。系统采用了模块化设计方法&#xff0c;根据用户的需求开发功能模块&#xff0c;方便了程序扩展维护&#xff0c;以便后期的更新。整个开发过程首先对系统进行需求分…

Gradle 进阶学习 之 build.gradle 文件

build.gradle 是什么&#xff1f; 想象一下&#xff0c;你有一个大型的乐高项目&#xff0c;你需要一个清单来列出所有的乐高积木和它们如何组合在一起。在软件开发中&#xff0c;build.gradle 就是这个清单&#xff0c;它告诉计算机如何构建&#xff08;组合&#xff09;你的软…

Python-VBA函数之旅-open函数

目录 一、open函数的常见应用场景 二、open函数使用注意事项 三、如何用好open函数&#xff1f; 1、open函数&#xff1a; 1-1、Python&#xff1a; 1-2、VBA&#xff1a; 2、推荐阅读&#xff1a; 个人主页&#xff1a;神奇夜光杯-CSDN博客 一、open函数的常见应用场…

LLaMA详细解读

LLaMA 是目前为止&#xff0c;效果最好的开源 LLM 之一。精读 LLaMA 的论文及代码&#xff0c;可以很好的了解 LLM 的内部原理。本文对 LLaMA 论文进行了介绍&#xff0c;同时附上了关键部分的代码&#xff0c;并对代码做了注释。 摘要 LLaMA是一个系列模型&#xff0c;模型参…

带权并查集

续前章节&#xff1a;并查集及应用 目录 1 带权问题1.1 点带权1.2 边带权 2 例题2.1 家族合并2.2 信息传递2.3 [NOI2002] 银河英雄传说 1 带权问题 1.1 点带权 用num[i]记录节点 i i i 所在的集合的数量。 初始化&#xff1a;所有的num[i]都是 1 1 1&#xff0c;因为每个点…

公考学习|基于SprinBoot+vue的公考学习平台(源码+数据库+文档)

公考学习平台目录 目录 基于SprinBootvue的公考学习平台 一、前言 二、系统设计 三、系统功能设计 5.1用户信息管理 5.2 视频信息管理 5.3公告信息管理 5.4论坛信息管理 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&…

Spring 原理

&#x1f3a5; 个人主页&#xff1a;Dikz12&#x1f525;个人专栏&#xff1a;Spring学习之路&#x1f4d5;格言&#xff1a;吾愚多不敏&#xff0c;而愿加学欢迎大家&#x1f44d;点赞✍评论⭐收藏 目录 Bean的作用域 代码实现 观察Bean的作用域 Bean的生命周期 Spring …

[单片机课设]十字路口交通灯的设计

题目要求&#xff1a; 模拟交通灯运行情况。南北绿灯亮30秒&#xff0c;南北黄灯亮3秒&#xff0c;东西红灯亮33秒&#xff1b;南北红灯亮33秒&#xff0c;东西绿灯亮30秒&#xff0c;东西黄灯亮3秒&#xff1b;要求数码管同步显示时间的倒计时&#xff0c;用定时器实现延时。…

Java_从入门到JavaEE_07

一、数组的排序&#xff08;冒泡排序&#xff09; 原理&#xff1a; 从下标“0”开始&#xff0c;相邻两个元素依次进行比较&#xff0c;每次找出最大的往后移动。 规律&#xff1a;N个数字来排队&#xff0c;两两相比小靠前&#xff0c;外层循环N-1&#xff0c;内层循环N-1-i…

error LNK2001: 无法解析的外部符号 “__declspec(dllimport) public: __cdecl ......

运行程序时&#xff0c;报如上图所示错误&#xff0c;其中一条是&#xff1a; ReflectionProbe.obj : error LNK2001: 无法解析的外部符号 "__declspec(dllimport) public: __cdecl osg::Object::Object(bool)" (__imp_??0ObjectosgQEAA_NZ) 报这个错误一般是因为…