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

news/2024/4/28 8:53:14/文章来源:https://blog.csdn.net/weixin_39970883/article/details/131527703

文章目录

    • 前言
    • 知识积累
    • 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.luyixian.cn/news_show_325672.aspx

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

相关文章

中移物联车联网项目,在 TDengine 3.0 的应用

小T导读&#xff1a;在中移物联网的智慧出行场景中&#xff0c;需要存储车联网设备的轨迹点&#xff0c;还要支持对车辆轨迹进行查询。为了更好地进行数据处理&#xff0c;他们在 2021 年上线了 TDengine 2.0 版本的 5 节点 3 副本集群。 3.0 发布后&#xff0c;它的众多特性吸…

关于visual studio 2010 及以上版本 引入boost库的最新解决方法

之前没有怎么用到boost库&#xff0c;出来实习需要去编译一些代码&#xff0c;需要引入boost第三方库&#xff0c;在这过程中&#xff0c;一直出现 LINK : fatal error LNK1104: 无法打开文件“libboost_filesystem-vc100-mt-gd-x3 错误&#xff0c; 但是也确实是跟其他教程学过…

myCobot机器人ChatGPT应用:设计原则和模型能力

我们将 ChatGPT 的功能扩展到机器人&#xff0c;并通过语言直观地控制机器人手臂、无人机和家庭助理机器人等多个平台。 你有没有想过用你自己的话告诉机器人该怎么做&#xff0c;就像你对人类一样&#xff1f;只是告诉你的家庭助理机器人&#xff1a;“请加热我的午餐”&…

MYSQL根据标签查询数据

场景条件&#xff1a; 1.根据用户id查询到该id绑定的标签&#xff08;可能是多个标签也可能是单个标签&#xff09; 2.根据标签的id查询到绑定标签id的信息表 SELECT labelID FROM LRrelation WHERE relationID 1 SELECT * FROM notification SELECT * FROM notification…

6.30学习-函数柯里化,回调解决异步多线程

6.30学习-函数柯里化&#xff0c;回调解决异步多线程 1.函数柯里化1.1 确定参数的函数柯里化1.2参数不确定的函数柯里化1.3 用法1.3.1 给setTimeout传递进来的函数添加参数 2.回调解决异步多线程 1.函数柯里化 函数柯里化&#xff0c;经常可能就面试的时候听说过&#xff0c;反…

如何在半导体行业运用IPD?

半导体产业链具体包括上游半导体原材料与设备供应、中游半导体产品制造和下游应用。其中&#xff0c;半导体材料处于上游供应环节&#xff0c;材料品类繁多&#xff0c;按制造流程可细分为前端制造材料和后端封装材料。半导体设备&#xff0c;即在芯片制造和封测流程中应用到的…

智谱AI-算法实习生(知识图谱方向)实习面试记录

岗位描述 没错和我的经历可以说是match得不能再match了&#xff0c;但是还是挂了hh。 面试内容 给我面试的是唐杰老师的博士生&#xff0c;方向是社交网络数据挖掘&#xff0c;知识图谱。不cue名了&#xff0c;态度很友好的 &#xff0c;很赞。 date&#xff1a;6.28 Q1 自…

服务器解析漏洞与cms靶场搭建教程

文章目录 一、解析漏洞定义1.CVE-2017-157152.AddHandler3.IIS64.IIS75.nginx 二、Kali安装docker并搭建DVWA靶场1.安装docker2.启动docker3.安装docker的DVWA容器4.启动dvwa 三、kali搭建vulhub与CVE-2017-15715复现1.安装vulhub2.安装CVE-2017-15715漏洞利用靶场3.启动靶场4.…

液晶铝薄膜的干蚀特性

引言 对于先进的薄膜晶体管液晶显示器(TFT-LCD)制造工艺来说&#xff0c;薄膜层已逐渐取代传统的湿法蚀刻工艺。对于栅电极&#xff0c;一般使用铝(Al)&#xff0c;在Al中加入一些金属&#xff0c;除了可以保持低电阻率和增强Al薄膜的耐腐蚀性外&#xff0c;还可以防止在后退火…

spfa求负环

1.虫洞 Wormholes&#xff08;裸spfa判断负环问题&#xff09; 信息学奥赛一本通&#xff08;C版&#xff09;在线评测系统 (ssoier.cn)http://ybt.ssoier.cn:8088/problem_show.php?pid1507 #include<bits/stdc.h> using namespace std; const int N510,M5210; int d…

判断数组中所有元素是否均为实数对象 numpy.isrealobj()

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 判断数组中所有元素 是否均为实数对象 numpy.isrealobj() [太阳]选择题 请问关于以下代码的说法错误的是&#xff1f; import numpy as np a np.array([1, 2, 3]) b np.array([1, 1 2j, …

docker学习(七)docker daemon

1.Docker 的CS模式 1.1.Docker 的C/S模式介绍 在 Docker Client 中来运行 Docker 的各种命令&#xff0c;这些命令会传送给在 Docker 的宿主机上运行的 Docker 守护进程。而 Docker 守护进程是负责实现 Docker 各种功能的。 如图所示&#xff0c;Docker 守护进程运行在宿主机…

第四章 数组

前言 学习方法 可以多看几遍视频把上课的代码&#xff0c;自己加加注释&#xff0c;在自己写之前&#xff0c;可以画一个流程图照着流程图把代码自己实现一遍 不要怀疑自己&#xff0c;不要遇到困难就觉得自己不行&#xff0c;遇到困难就解决困难&#xff0c;编程初学者都是…

SSH连接vmware 虚拟机 centos

检查虚拟机设置的网络连接是否为NAT模式 点击左上角“编辑” -> “虚拟网络编辑器” 在虚拟网络编辑器中查看IP地址 &#xff0c;点击NAT模式后&#xff0c;点击“NAT设置 记住自己的网关,下面在服务器中配置需要 进入服务器的 /etc/sysconfig/network-scripts/ 编辑 i…

浑元太极马老师和小薇-UMLChina建模知识竞赛第4赛季第7轮[更新]

DDD领域驱动设计批评文集 欢迎加入“软件方法建模师”群 《软件方法》各章合集 参考潘加宇在《软件方法》和UMLChina公众号文章中发表的内容作答。在本文下留言回答。 第7轮一直无人得分&#xff0c;再次更换题目。 因有的题目之前已经出过&#xff0c;本轮需要最先答对全…

Android View 事件派发流程

原文链接 Android View 事件派发流程 自从乔帮主横空出世推出了iPhone以来&#xff0c;触控式的操作便成了21世纪智能设备的标准输入方式。对于同是智能操作系统的Android来说&#xff0c;也不例外。事件&#xff0c;特别是触控事件对于移动应用程序开发来说是一个非常重要的&…

软件DevOps云化发展的趋势 【课程限时免费】

你了解什么是DevOps吗&#xff1f; 它是怎么诞生的&#xff1f; DevOps能做些什么&#xff1f; 相信对于DevOps的实践者和关注者来说&#xff0c;对它已经不陌生了&#xff0c;但是对于刚刚进入开发者领域不久的小伙伴应该并不清楚&#xff0c;下面就让小智带你一起了解DevO…

C. Insert Zero and Invert Prefix - 构造+思维

分析&#xff1a; 数组b的最后一个元素永远不可能使1&#xff0c;因为即使在最后一个位置操作&#xff0c;也只会把前n-1个元素反转&#xff0c;最后一个元素只能为0.然后可以发现只要a[i]0就可以直接输出0&#xff0c;当a[i]1时一连串的1只需要最后一个1的位置改变成1的字串长…

Keil5中写的软件延时函数不起作用现象解析_ARM_Compiler_volatile关键字

一、问题描述 在学习野火霸天虎F407寄存器点亮LED时&#xff0c;出现实验现象&#xff1a;LED灯不亮&#xff0c;野火霸天虎F407资料。 main.c代码如下&#xff1a; #include "stm32f4xx.h"void Delay(unsigned int count);int main(void) { #if 0/* 第一步&a…

oracle rowscn 简单记录

可以通过ROWSCN 侦测row是否有变化&#xff0c;但需要注意&#xff1a; 默认是一个block的scn 相同可以通过create table ROWDEPENDENCIES 在每行上记录无论哪种模式&#xff0c;ROW SCN是一个大致值&#xff0c;不是准确值 NOROWDEPENDENCIES | ROWDEPENDENCIES This claus…