Spring Cloud — Hystrix 服务隔离、请求缓存及合并

Hystrix 的核心是提供服务容错保护,防止任何单一依赖耗尽整个容器的全部用户线程。使用舱壁隔离模式,对资源或失败单元进行隔离,避免一个服务的失效导致整个系统垮掉(雪崩效应)。

1 Hystrix监控

Hystrix 提供了对服务请求的仪表盘监控。在客户端加入以下依赖:

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

并在客户端的Application类加上@EnableHystrixDashboard注解。

访问地址:http://localhost:8080/hystrix

在输入框中输入监控地址:http://localhost:8080/hystrix.stream,然后点击“Monitor Stream”按钮。

图 Hystrix 监控初始界面

图 Hystrix 仪表盘主要参数及含义

2 服务隔离

图 Hystrix 实现服务隔离的思路

2.1 隔离策略

Hystrix 提供了线程池隔离和信号量隔离两种隔离策略。

execution.isolation.strategy 属性配置隔离策略,默认为THREAD(线程池隔离),SEMAPHORE为信号量隔离。execution.isolation.thread.timeoutInMilliseconds属性配置请求超时时间,默认为1000ms。

2.1.1 线程池隔离

不同服务的执行使用不同的线程池,同时将用户请求的线程(如Tomcat)与具体业务执行的线程分开,业务执行的线程池可以控制在指定的大小范围内,从而使业务之间不受影响,达到隔离的效果。

优点

  1. 隔离优势,如果一个服务发生问题,只会影响该服务,而不会影响其他服务。
  2. 方便性能变化调整,可以更改对应command的参数(超时时间、重试次数、线程池大小等)。

缺点

线程及线程池的创建及管理增加了计算开销。

表 线程池隔离的优缺点

关于线程池隔离的相关配置有如下参数:

coreSize:线程池核心线程数。即线程池中保持存活的最小线程数。默认为10。

maximumSize:线程池允许的最大线程数。当核心线程数已满且任务队列已满时,线程池会尝试创建新的线程,直到达到最大线程数。默认为10。

maxQueueSize:线程池任务队列的大小。默认为-1,表示任务将被直接交给工作线程处理,而不是放入队列中等待。

queueSizeRejectionThreshold:即便没达到maxQueueSize阈值,但达到该阈值时,请求也会被拒绝,默认值为5。

图 新的请求在线程池的处理过程

是否创建新线程,是指当前活跃线程已达到coreSize,但线程数小于maximumSize,Hystrix 会创建新的线程来处理该任务。(这一步还受到queueSizeRejectionThreshold及maxQueueSize参数的影响)。

2.1.2 信号量隔离

用户请求线程和业务执行线程是同一线程,通过设置信号量的大小限制用户请求对业务的并发访问量,从而达到限流的保护效果。

优点

1 开销小,避免了线程创建、销毁及上下文切换等开销。

2 配置简单,只需要设置信号量大小即可。

3 适合轻量级操作,如内存或缓存服务访问,这些操作不太可能导致长时间延迟,因此信号隔离可以保持系统的高效性。

缺点

限流能力有限,存在阻塞风险,如果依赖服务阻塞,因为其没有使用线程池来隔离请求,那么可能会影响整个请求链路,导致系统性能下降。

表 Hystrix 信号隔离的优缺点

execution.isolation.semaphore.maxConcurrentRequests 最大并发请求数(信号量大小)。默认为10。

2.2 服务隔离的颗粒度

@HystrixCommand 注解还有三个属性:commandKey(标识该命令全局唯一的名称,默认情况下,同一个服务名称共享一个线程池)、groupKey(组名,Hystrix 会让相同组名的命令使用同一个线程池)、threadPoolKey(线程池名称,多个服务可以设置同一个threadPoolKey,来共享同一个线程池,在信号量隔离策略中不起作用)。

3 请求缓存

用户的同一个请求中,消费者可能会多次重复调用一个服务。Hystrix 提供的请求缓存可以在CommandKey/CommandGroup相同的情况下,直接共享第一次命令执行的结果,降低依赖调用次数。

@Service
public class UserService {private final RestTemplate restTemplate;public UserService(RestTemplate restTemplate) {this.restTemplate = restTemplate;}@CacheResult(cacheKeyMethod = "generateCacheKey")@HystrixCommand(commandKey = "info3",groupKey = "info3Group",commandProperties = {@HystrixProperty(name = "requestCache.enabled", value = "true")})public RequestResult<String> info3(String name) {System.out.println("发送请求:" + name);return RequestResult.success(restTemplate.getForObject("http://provider/user/info?name=" + name, String.class));}public String generateCacheKey(String name) {return name;}
}
@RequestMapping("/home")
@RestController
public class HomeController {private final RestTemplate restTemplate;private final UserService userService;public HomeController(RestTemplate restTemplate, UserService userService) {this.restTemplate = restTemplate;this.userService = userService;}@GetMapping("/info3")public RequestResult<String> info3(String name) {HystrixRequestContext context = HystrixRequestContext.initializeContext();RequestResult<String> result = userService.info3(name);userService.info3(name);context.close();return result;}
}

 

4 请求合并

Hystrix针对高并发场景,支持将多个请求自动合并为一个请求,通过合并可以减少对依赖的请求,极大节省开销,提高系统效率。

请求合并主要是通过两部分实现:1)@HystrixCollapser 指定高并发请求的对应请求,其返回值为Futuer。2)@HystrixCommand 指定合并后的单个请求。其参数为第1部分请求参数的集合。

@Service
public class UserService {private final RestTemplate restTemplate;public UserService(RestTemplate restTemplate) {this.restTemplate = restTemplate;}@HystrixCollapser(collapserKey = "info",scope = com.netflix.hystrix.HystrixCollapser.Scope.GLOBAL,batchMethod = "batchInfo",collapserProperties = {@HystrixProperty(name = "timerDelayInMilliseconds", value = "1000"),@HystrixProperty(name = "maxRequestsInBatch", value = "3")})public Future<RequestResult<String>> batchInfo(String name) {// 不会被执行System.out.println("HystrixCollapser info");return null;}@HystrixCommandpublic List<RequestResult<String>> batchInfo(List<String> names) {System.out.println("批量发送:" + names);// 依赖也需要有一个支持批量的接口String res = restTemplate.getForObject("http://provider/user/info?name=" + names, String.class);List<RequestResult<String>> list = new ArrayList<>();int count = 0;for (String str : names) {list.add(RequestResult.success(res + "kk" + str + count++));}return list;}
}
@RequestMapping("/home")
@RestController
public class HomeController {private final RestTemplate restTemplate;private final UserService userService;public HomeController(RestTemplate restTemplate, UserService userService) {this.restTemplate = restTemplate;this.userService = userService;}@GetMapping("/info2")public RequestResult<String> info2(String name) throws ExecutionException, InterruptedException {HystrixRequestContext context = HystrixRequestContext.initializeContext();Future<RequestResult<String>> future = userService.batchInfo(name);RequestResult<String> result = future.get();context.close();return result;}
}

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

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

相关文章

DeepSeek 助力 Vue 开发:打造丝滑的 键盘快捷键(Keyboard Shortcuts)

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…

WPS接入deepseek-OfficeAI助手插件下载

功能简介 OfficeAI 助手 是一款免费的智能AI办公工具软件&#xff0c;专为 Microsoft Office 和 WPS 用户打造。 无论你是在寻找如何输入“打勾&#xff08;√&#xff09;符号”的方法&#xff0c;还是想知道“怎么在插入表格前添加文字”&#xff0c;或者“该用哪个公式”&a…

关系数据理论

一、函数依赖 若t1(X)t2(X),必有t1(Y)t2(Y),那么我们称属性组X函数确定属性组Y&#xff0c;或者说Y函数依赖于X。记为X->Y&#xff0c;其中X叫决定因素&#xff0c;Y叫依赖因素。 平凡函数依赖与非平凡函数依赖&#xff1a; 二、1-BCNF 评价关系模式“好坏”的理论标准就…

【C】队列与栈的相互转换

栈与队列是两种特点相反的数据结构&#xff0c;一个特点是后进先出&#xff0c;一个特点是先进先出&#xff0c;但是他们之间是可以相互转换的。 目录 1 用队列实现栈 1&#xff09; 题目解析 2&#xff09; 算法解析 &#xff08;1&#xff09; 结构(MyStack) &#xff…

有向图的强连通分量: Kosaraju算法和Tarjan算法详解

在上一篇文章中, 我们了解了图的最小生成树算法. 本节我们来学习 图的强连通分量(Strongly Connected Component, SCC) 算法. 什么是强连通分量? 在 有向图 中, 若一组节点内的任意两个节点都能通过路径互相到达(例如 A → B A \rightarrow B A→B 且 B → A B \rightarro…

如何为自己的 PDF 文件添加密码?在线加密 PDF 文件其实更简单

随着信息泄露和数据安全问题的日益突出&#xff0c;保护敏感信息变得尤为重要。加密 PDF 文件是一种有效的手段&#xff0c;可以确保只有授权用户才能访问或修改文档内容。本文将详细介绍如何使用 CleverPDF 在线工具为你的 PDF 文件添加密码保护&#xff0c;确保其安全性。 为…

面向机器学习的Java库与平台简介、适用场景、官方网站、社区网址

Java机器学习的库与平台 最近听到有的人说要做机器学习就一定要学Python&#xff0c;我想他们掌握的知识还不够系统、不够全面。本文作者给大家介绍几种常用Java实现的机器学习库&#xff0c;快快收藏加关注吧&#xff5e; Java机器学习库表格 Java机器学习库整理库/平台概念…

Kubernetes 使用 Kube-Prometheus 构建指标监控 +飞书告警

1 介绍 Prometheus Operator 为 Kubernetes 提供了对 Prometheus 机器相关监控组件的本地部署和管理方案&#xff0c;该项目的目的是为了简化和自动化基于 Prometheus 的监控栈配置&#xff0c;主要包括以下几个功能&#xff1a; Kubernetes 自定义资源&#xff1a;使用 Kube…

Hadoop初体验

一、HDFS初体验 1. shell命令操作 hadoop fs -mkdir /itcast hadoop fs -put zookeeper.out /itcast hadoop fs -ls / 2. Web UI页面操作 结论&#xff1a; HDFS本质就是一个文件系统有目录树结构 和Linux类似&#xff0c;分文件、文件夹为什么上传一个小文件也这…

python: SQLAlchemy (ORM) Simple example using mysql in Ubuntu 24.04

mysql sql script: create table School 表 (SchoolId char(5) NOT NULL comment主鍵primary key&#xff0c;學校編號,SchoolName nvarchar(500) NOT NULL DEFAULT comment 學校名稱,SchoolTelNo varchar(8) NULL DEFAULT comment電話號碼,PRIMARY KEY (SchoolId) #主…

解放大脑!用DeepSeek自动生成PPT!

DeepSeek应用&#xff08;PPT篇&#xff09; DeepSeek作为当前最好的AI大模型之一&#xff0c;其强大的文本生成能力被广泛的应用于各个领域&#xff0c;本文我们来聊聊用DeepSeek来自动生成PPT。 一、DeepSeek & PPT DeepSeek本身没有直接生成PPT的能力&#xff0c;换个…

从0到1:固件分析

固件分析 0x01 固件提取 1、从厂商官网下载 例如D-link的固件&#xff1a; https://support.dlink.com/resource/products/ 2、代理或镜像设备更新时的流量 发起中间人攻击MITM #启用IP转发功能 echo 1 > /proc/sys/net/ipv4/ip_forward#配置iptables&#xff0c;将目…

docker独立部署milvus向量数据库

milvus镜像&#xff1a;国外封锁&#xff0c;国内源也不好用。基本上所有源都不能用 首先想到阿里云服务&#xff0c;但是阿里云国外服务器便宜的300~400呢。 基于成本考虑终于装上心心念念的milvus(*^▽^*) 安装 Milvus 安装 Milvus 独立版 wget https://raw.githubuserco…

宇树科技13家核心零部件供应商梳理!

2025年2月6日&#xff0c;摩根士丹利&#xff08;Morgan Stanley&#xff09;发布最新人形机器人研报&#xff1a;Humanoid 100: Mapping the Humanoid Robot Value Chain&#xff08;人形机器人100&#xff1a;全球人形机器人产业链梳理&#xff09;。 Humanoid 100清单清单中…

win10系统上的虚拟机安装麒麟V10系统提示找不到操作系统

目录预览 一、问题描述二、原因分析三、解决方案四、参考链接 一、问题描述 win10系统上的虚拟机安装麒麟V10系统提示找不到操作系统&#xff0c;报错&#xff1a;Operating System not found 二、原因分析 国产系统&#xff0c;需要注意的点&#xff1a; 需要看你的系统类…

C#初级教程(1)——C# 与.NET 框架:探索微软平台编程的强大组合

图片来源&#xff1a; https://www.lvhang.site/docs/dotnettimeline 即梦AI - 一站式AI创作平台 一、历史发展脉络 在早期的微软平台编程中&#xff0c;常用的编程语言有 Visual Basic、C、C。到了 20 世纪 90 年代末&#xff0c;Win32 API、MFC&#xff08;Microsoft Found…

SpringBoot项目集成MinIO

最近在学习MinIO&#xff0c;所以想让自己的SpringBoot项目集成MinIO,在网上查阅资料&#xff0c;并进行操作的过程中遇到一些问题&#xff0c;所以想把自己遇到的坑和完成步骤记录下来供自己和各位查阅。 一. MinIO的下载安装以及基本使用 1. 下载地址&#xff1a;https://d…

ROS2下编写package利用orbbec相机进行yolov8实时目标检测

视频讲解 ROS2下编写package利用orbbec相机进行yolov8实时目标检测 在《ROS2下编写orbbec相机C package并Rviz显示》的基础上&#xff0c;继续添加对获取的图像使用YOLO进行目标检测 首先安装YOLO以及相关库 pip3 install ultralytics 使用如下指令测试下yolo安装情况 yol…

uniapp引入uview组件库(可以引用多个组件)

第一步安装 npm install uview-ui2.0.31 第二步更新uview npm update uview-ui 第三步在main.js中引入uview组件库 第四步在uni.scss中引入import "uview-ui/theme.scss"样式 第五步在文件中使用组件

UE5.3 C++ TArray系列(一)

一.TArray概述 它们就相当于C动态数组Vector&#xff0c;但是被UE封装了&#xff0c;懂得都懂反射嘛&#xff0c;要不一不小心就被回收了。 它真的非常常见&#xff0c;我所用的容器中&#xff0c;它绝对排名第一&#xff0c;第二是TMap。 同类好理解&#xff0c;我平时也常用…