微服务:Springboot集成Hystrix实现熔断、降级、隔离

文章目录

    • 前言
    • 知识积累
    • Springboot集成Hystrix
      • 1、maven依赖引入
      • 2、application开启feign的hystrix支持(客户端配置限流降级熔断)
      • 3、入口类增加@EnableFeignClients @EnableHystrix 开启feign与hystrix
      • 4、feign调用增加降级方法
      • 服务端配置限流降级熔断(选择使用)
    • Springboot集成Hystrix可视化
      • 1、增加maven依赖
      • 2、application配置监控
      • 3、页面访问hystrix-dashboard
    • 写在最后

前言

在分布式微服务的项目中,常常会有多个服务复用,产生多个服务调用的情况。比如A服务调用B服务,B服务调用C服务。服务调用链路长了必然会增加服务超时的概率,服务的超时阻塞会一直占用线程资源,大量的阻塞会直接消耗完服务线程,严重情况下会导致服务直接宕机从而引发调用链路的服务雪崩。那么,有没有一种方式可以实现服务熔断、降低、隔离呢?今天我们介绍Netflix公司研发的Hystrix框架。

知识积累

Hystrix是一个延迟和容错库,旨在隔离远程系统、服务和第三方库的访问点,停止级联故障,并在故障不可避免的复杂分布式系统中实现弹性。

服务熔断是在服务达到某些特定指标主动进行断开的一种操作,而服务降级则是在服务调用过程中对后续服务进行评估比如达到超时时间未响应就会进行后续冗余逻辑处理。服务熔断了必定会进行服务降级,但服务降级了并不一定是服务熔断触发。

服务雪崩是业务流程中多个服务进行链路调用,如果后续链路服务发生故障阻塞会影响调用方服务阻塞,严重情况下会直接将整个链路服务拖死,从而造成服务雪崩的现象。

Hystrix提供了信号量、线程两种隔离模式。信号量隔离直接可以限制服务的并发线程数目,而线程隔离则直接依靠线程池来限制当前负载直接使用当前线程池线程,从而避免消耗完服务的其他线程造成服务不可用的情况。默认情况下,Hystrix使用线程隔离,线程隔离才是真正意义上的服务隔离。

在实际的项目开发中,Hystrix与openfeign能够友好的集成。我们在Springboot、spring cloud项目中可以直接引入Hystrix、feign依赖,并且完成相应的配置即可达到我们需要的结果。

Springboot集成Hystrix

在微服务的开发中为了服务间的互相复用与调用,我们需要引入注册中心来帮助实现服的发布、订阅与维护。对于注册中心中间件的选择有nacos、consul等等,其中搭建都相对简单这里不再讲述。

当我们引入注册中心后我们直接可以使用feign框架通过RestTemplate直接调用服务,我们不再关心内部怎么调用,只需要按照特定的规则封装接口即可。

以下重点介绍Hystrix的相关集成和配置

1、maven依赖引入

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.12.RELEASE</version><relativePath/>
</parent>
<properties><java.version>1.8</java.version><spring-cloud.version>Hoxton.SR10</spring-cloud.version>
</properties>
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
<dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>

2、application开启feign的hystrix支持(客户端配置限流降级熔断)

#hystrix
feign:hystrix:enabled: truecircuitbreaker:enabled: truehystrix:threadpool:#默认配置default:#动态调整线程数allowMaximumSizeToDivergeFromCoreSize: false#核心线程数coreSize: 10#最大线程数maximumSize: 10#空闲存活时间minkeepAliveTimeMinutes: 1#队列长度 设置置为-1时,队列会使用 SynchronousQueue,此时其 size 为0,Hystrix 不会向队列内存放作业。maxQueueSize: -1#如果需要动态修改队列长度的话可以设置此值,即使队列未满,队列内作业达到此值时同样会拒绝请求。此值默认是 5queueSizeRejectionThreshold: 5command:default:#线程池keythreadPoolKeyOverride: default#熔断器circuitBreaker:enabled: true#错误占比errorThresholdPercentage: 50#窗口时间内最小请求数目requestVolumeThreshold: 20#休眠时间sleepWindowInMilliseconds: 5000execution:#隔离isolation:strategy: THREADthread:#线程超时时间timeoutInMilliseconds: 5000timeout:enabled: true#统计器metrics:rollingStats:#窗口大小timeInMilliseconds: 10000#桶数目需要保证与timeInMilliseconds整除numBuckets: 10

3、入口类增加@EnableFeignClients @EnableHystrix 开启feign与hystrix

@EnableFeignClients
@EnableHystrix
@Slf4j
public class TestDemoApplication {public static void main(String[] args) {SpringApplication.run(TestDemoApplication.class, args);}
}

4、feign调用增加降级方法

/*** @author senfel* @version 1.0* @date 2023/7/03 15:04*/
@Service
@FeignClient(value = "test-demo",fallback = FallbackService.class)
public interface TestService {/*** 测试hystrix*/@GetMapping("/feign")String feign(@RequestParam String str);}
/*** FallbackService* @author senfel* @version 1.0* @date 2023/7/3 15:26*/
@Service
public class FallbackService implements TestService {@Overridepublic String feign(String str) {return ">>>>>客户端服务降级>>>>>";}
}

服务端配置限流降级熔断(选择使用)

线程隔离、
服务调用超时5s降级、
10s内最低20个请求进入规则验证超过50%错误率直接熔断5s

@GetMapping("/feign")
@HystrixCommand(// 标识线程池 保持唯一threadPoolKey = "threadPoolKeyByFeign",// 线程池细节属性配置threadPoolProperties = {// 线程数@HystrixProperty(name="coreSize",value = "10"),//最大线程数量@HystrixProperty(name="maximumSize",value = "10"),// 等待队列长度@HystrixProperty(name="maxQueueSize",value="-1"),//如果需要动态修改队列长度的话可以设置此值,即使队列未满,队列内作业达到此值时同样会拒绝请求。此值默认是 5@HystrixProperty(name="queueSizeRejectionThreshold",value="5"),//空闲时间1min@HystrixProperty(name="keepAliveTimeMinutes",value="1")},// 熔断的一些细节属性配置commandProperties = {// 调用服务超时时间@HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value="5000"),// 统计时间窗口定义@HystrixProperty(name = "metrics.rollingStats.timeInMilliseconds",value = "10000"),//桶数量 保证与统计时间窗口整除@HystrixProperty(name = "metrics.rollingPercentile.numBuckets",value = "10"),// 统计时间窗口内的最小请求数@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold",value = "20"),// 统计时间窗口内的错误数量百分比阈值@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value = "50"),// 自我修复时的活动窗口长度@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value = "5000")},// 降级方法fallbackMethod = "myFallBack"
)
public String feign(String str){if(str.contains("s")){throw new RuntimeException();}return str+"ssss";
}private String myFallBack(String str){return ">>>>>服务端服务降级>>>>>";
}

Springboot集成Hystrix可视化

1、增加maven依赖

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

2、application配置监控

hystrix:dashboard:proxy-stream-allow-list: "127.0.0.1"management:endpoints:web:exposure:include: health,hystrix.stream    

3、页面访问hystrix-dashboard

http://127.0.0.1:9999/hystrix
在这里插入图片描述

http://127.0.0.1:9999/actuator/hystrix.stream
在这里插入图片描述

写在最后

Springboot集成Hystrix实现熔断、降级、隔离较为简单,并且提供了hystrix-dashboard可视化仪表盘。Hystrix框架已经实现了熔断降级、隔离策略,我们集成后只需要根据自身情况进行配置选用即可。一般在微服务架构优先选择客户端熔断降级,当然也可在服务端进行注解配置。

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

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

相关文章

JavaWeb——基于Spring Boot的图书数字化管理系统的设计与实现

课程设计总结 1 概述 1.1 项目开发背景 随着信息技术的快速发展&#xff0c;数字化管理已经成为各行各业提高效率和管理水平的重要手段。在图书管理领域&#xff0c;数字化管理系统可以有效地提高管理效率&#xff0c;提供更好的用户体验。本项目旨在开发一个基于Spring…

Vue使用keep-alive设置哪些组件可以被缓存,哪些不被缓存

需求&#xff1a;当一个项目中&#xff0c;不是所有的组件页面都需要缓存起来&#xff0c;因为有些页面是不需要的 <keep-alive><router-view v-if"$route.meta.keepAlive"></router-view> </keep-alive><router-view v-if"!$rout…

关于Context和ContextImpl还有ContextWrapper的关系

关于Context和ContextImpl还有ContextWrapper的关系 1.Context和ContextImpl还有ContextWrapper的关系 ​ 图一.Context和ContextImpl还有ContextWrapper的关系示意图 1.1.ContextImpl是Context的实现类 从Context和ContextImpl的源代码中,可以看出Context是一个抽象类,具体…

机器学习概括

文章目录 一、机器学习是什么&#xff1f;二、模型训练YouTube流量预测1. 先写一个具有未知参数的函数&#xff08;Function&#xff09;2. 定义损失&#xff08;从训练数据进行计算&#xff09;3.最优化4.结果分析 Back to framework1.带有未知数的函数&#xff1a;2.定义损失…

K8S应用流程安全(镜像安全 配置管理 访问安全)

应用流程安全 1 应用流程安全1.1 镜像安全1.1.1 构建原则1.1.2 Dockerfile实践1.1.3 构建进阶1.1.4 镜像检测1.1.5 仓库升级1.1.6 高可用仓库1.1.7 镜像策略 1.2 配置管理1.2.1 配置基础1.2.2 YAML安全1.2.3 kustomize1.2.4 基础实践1.2.5 功能复用1.2.6 配置定制1.2.7 补丁实践…

当你按下键盘A键

CPU 里面的内存接口&#xff0c;直接和系统总线通信&#xff0c;然后系统总线再接入一个 I/O 桥接器&#xff0c;这个 I/O 桥接器&#xff0c;另一边接入了内存总线&#xff0c;使得 CPU 和内存通信。再另一边&#xff0c;又接入了一个 I/O 总线&#xff0c;用来连接 I/O 设备&…

el-table 动态合并不定项多级表头

我们的需求是根据不同的厂配不同的多级表头,每个表头有需要合并的项,并且不确定 如图所示 对表格进行循环操作,此处不赘述,最下方有全部代码 表头是单独写在js方便后期更改,然后引入js文件,然后根据情况去调取 // 获取表头getHeader(nv) {this.factoryCodes nv;this.heade…

【UE4 C++】根据指定路径生成静态网格体

在上一篇博客中&#xff08;【UE C】蓝图调用C函数&#xff09;&#xff0c;我们用C创建了一个蓝图函数库&#xff0c;本篇文章在这个蓝图函数库基础上增加一个方法&#xff0c;该方法只需输入一个文件目录路径&#xff0c;就可在场景中生成该目录下得所有静态网格体。&#xf…

第6集丨JavaScript 使用原型(prototype)实现继承——最佳实战3

目录 一、原型继承与属性拷贝1.1 功能说明1.2 功能测试 二、多重继承2.1 功能实现2.2 功能测试 三、寄生式继承四、构造器借用4.1 简单实现4.2 进化版4.2.1 功能实现4.2.2 案例测试 五、借用构造器和原型复制六 综合案例6.1 需求说明6.2 代码实现 一、原型继承与属性拷贝 1.1 功…

css之:is()、:where()和:has()伪元素的运用、使用、important

文章目录 简介1、:is()2、:where()3、:has() 简介 :is()、:where()和:has()伪元素是CSS中用于样式化元素的非常强大的工具。它们是在CSS选择器Level4规范中引入的。它们允许我们将样式应用于符合特定条件的任何元素&#xff0c;例如元素的类型、元素的位置和元素的后代。 1、:i…

【高并发】高并发架构实战:从需求分析到系统设计

Yan-英杰的主页 悟已往之不谏 知来者之可追 C程序员&#xff0c;2024届电子信息研究生 很多软件工程师的职业规划是成为架构师&#xff0c;但是要成为架构师很多时候要求先有架构设计经验&#xff0c;而不做架构师又怎么会有架构设计经验呢&#xff1f;那么要如何获得架构设…

前端渲染模式CSR,SSR,SSG,ISR,DPR

目录 一、客户端渲染——CSR&#xff08;Client Side Rendering&#xff09; 二、服务器端渲染——SSR&#xff08;Server Side Rendering&#xff09; 三、静态站点生成——SSG&#xff08;Static Site Generation&#xff09; 四、增量静态生成——ISR&#xff08;Increm…

【软件测试】在Windows环境安装Docker(详细步骤)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 下载和安装 1、地…

智慧园区4G+蓝牙+GPS/北斗RTK人员定位系统解决方案

智慧园区是指利用现代科技手段进行精细化管理的园区&#xff0c;人员定位技术被广泛应用在智慧园区。智慧园区人员定位技术通过使用传感器设备&#xff0c;能够实时监测园区内人员的位置和活动情况&#xff0c;从而提高园区的人员管理效率和安全性。 通过人员定位&#xff0c;…

云HIS是什么?HIS系统为什么要上云?云HIS有哪些优点?

一、当前医疗行业HIS的现状与发展趋势 1.医院信息系统&#xff08;HIS&#xff09;经历了从手工到单机再到局域网的两个阶段&#xff0c;随着云计算、大数据新技术迅猛发展&#xff0c;基于云计算的医院信息系统将逐步取代传统局域网HIS , 以适应人们对医疗卫生服务越来越高的要…

常用分类损失CE Loss、Focal Loss及GHMC Loss理解与总结

一、CE Loss 定义 交叉熵损失&#xff08;Cross-Entropy Loss&#xff0c;CE Loss&#xff09;能够衡量同一个随机变量中的两个不同概率分布的差异程度&#xff0c;当两个概率分布越接近时&#xff0c;交叉熵损失越小&#xff0c;表示模型预测结果越准确。 公式 二分类 二…

深入理解预训练(pre-learning)、微调(fine-tuning)、迁移学习(transfer learning)三者的联系与区别

1. 什么是预训练和微调 你需要搭建一个网络模型来完成一个特定的图像分类的任务。首先&#xff0c;你需要随机初始化参数&#xff0c;然后开始训练网络&#xff0c;不断调整参数&#xff0c;直到网络的损失越来越小。在训练的过程中&#xff0c;一开始初始化的参数会不断变化。…

小程序:页面跳转闪屏

自己的笔记&#xff0c;随手记录。扛精走开。 1、问题描述 进入页面&#xff0c;是一个组件&#xff0c;通过路由传参判断是由哪个页面进入&#xff0c;不同的页面拿的已选值不一样&#xff0c;需要回显值&#xff0c;在编辑数据。此时会出现一个问题&#xff0c;A页面中进来…

Serverless和EDA是绝配,亚马逊云科技CTO Werner表示需要用开放心态来重新审视架构

前一段有个很火的博客&#xff0c;讲的是一家全球流媒体企业的监测系统从Serverless微服务改成了单体&#xff0c;成本居然降低了90%&#xff01;这一下子可在网上炸锅了&#xff0c;特别是一些看不惯微服务的、单体应用的拥趸&#xff0c;更是坐不住了。但这并不像吃瓜群众看到…

【ECharts系列】ECharts 图表渲染问题解决方案

1 问题描述 echats 渲染&#xff0c;第一次的时候只出现Y轴数值&#xff0c;不出现X轴数值&#xff0c;切换下页面&#xff0c;X轴数值就能出现。 2 原因分析 如果在使用ECharts渲染时&#xff0c;X轴数值只在切换页面后才出现&#xff0c;可能是因为ECharts在初始化时没有正确…