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

ops/2024/9/22 18:26:04/

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

  • 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")));}@Overrideprotected String run() throws Exception {// 模拟业务逻辑String result = "Hello, World! I'm " + name;return result;}
}

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

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

http://www.ppmy.cn/ops/33586.html

相关文章

redis的安装

一、安装(CentOS) 0. cd /usr/local 1. wget http://download.redis.io/releases/redis-3.2.11.tar.gz 2. tar zxvf redis-3.2.11.tar.gz mv redis-3.2.11 redis 3. cd redis 4. yum install gcc-c 5. make MALLOClibc 二、测试 1. src/redis-server 2. src/redis-cl…

2G 3G LTE 5G的区别

2G、3G、LTE和5G是不同代的移动通信技术&#xff0c;每一代技术都在其前一代的基础上提供了改进的性能、更高的数据速率和新的功能。以下是这些技术的主要区别&#xff1a; ### 2G (第二代移动通信技术): - **数据速率**&#xff1a;较低的数据速率&#xff0c;通常在几百kbps…

MySQL-----多表查询(二)

目录 一.子查询概述&#xff1a; 二&#xff1a;标量子查询&#xff1a; 三&#xff1a;列子查询&#xff1a; 四&#xff1a;行子查询&#xff1a; 五&#xff1a;表子查询&#xff1a; 六&#xff1a;练习部分&#xff1a; 写在之前&#xff1a;本文承接上文MySQL-----多…

python学习笔记----异常、模块与包(九)

一、异常 1.1 什么是异常 在Python中&#xff0c;异常是程序执行时发生的错误。当Python检测到一个错误时&#xff0c;它会引发一个异常&#xff0c;这可能是由于多种原因&#xff0c;如尝试除以零、访问不存在的文件&#xff0c;或者尝试从列表中获取不存在的索引等。异常处…

揭秘大模型应用如何成为当红顶流?

Kimi广告神话背后的关键词战略 如果你生活在中国&#xff0c;你可能不认识ChatGPT&#xff0c;但你一定知道Kimi。无论是学生党还是打工人&#xff0c;都无法避开Kimi的广告。 刘同学在B站上搜教学视频时&#xff0c;弹出了一则软广&#xff0c;上面写着&#xff1a;“作业有…

kan 这是什么(想多了哈哈)

代码 import paddleclass Xus(paddle.nn.Layer):def __init__(self, head, head_dim):super().__init__()self.x_layer paddle.nn.Linear(head_dim, head * head_dim, bias_attrFalse)self.s_layer paddle.nn.Linear(head_dim, head * head_dim, bias_attrFalse)self.u_laye…

可靠的Mac照片恢复解决方案

当您在搜索引擎搜索中输入“Mac照片恢复”时&#xff0c;您将获得数以万计的结果。有很多Mac照片恢复解决方案声称他们可以在Mac OS下恢复丢失的照片。但是&#xff0c;并非互联网上的所有Mac照片恢复解决方案都可以解决您的照片丢失问题。而且您不应该花太多时间寻找可靠的Mac…

C#技巧之同步与异步

区别 首先&#xff0c;同步就是程序从上往下顺序执行&#xff0c;要执行完当前流程&#xff0c;才能往下个流程去。 而异步&#xff0c;则是启动当前流程以后&#xff0c;不需要等待流程完成&#xff0c;立刻就去执行下一个流程。 同步示例 创建一个窗体&#xff0c;往窗体里…