【Zero to One系列】微服务Hystrix的熔断器集成

news2025/4/8 23:53:19

 前期回顾:

【Zero to One系列】springcloud微服务集成nacos,形成分布式系统

【Zero to One系列】SpringCloud Gateway结合Nacos完成微服务的网关路由


1、hystrix依赖包

首先引入hystrix相关的依赖包,版本方面自己和项目内相对应即可,我这这边是直接使用的默认版本。

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

然后,演示的微服务,还是以我架构项目中的2个子模块为例,user模块与send模块:

user模块:调用方

send模块:被调用方


 2、hystrix配置

2.1 feign集成hystrix熔断(统一配置)

首先,写一个send模块的feign接口fallback实现类,例如:

package com.***.common.hystrix;

import com.***.common.bean.ResultBean;
import com.***.common.enums.ResponseCodeEnum;
import com.***.common.feign.SendFeignClient;
import org.springframework.stereotype.Component;

@Component
public class SendFallBack implements SendFeignClient {
	@Override
	public ResultBean sendSMS() {
		//todo 可以在对应的方法内写入使用统一降级策略,或是指定的降级策略处理
		return ResultBean.returnResult(ResponseCodeEnum.SUCCESS,"发送服务暂时断开连接,请稍后。。。");
	}
}

然后,在send模块的feign接口的注解上,直接配置对应的降级实现类,如下:

@FeignClient(name = "${sys.serviceName.send}",path = "${sys.serviceContext.send}",fallback = SendFallBack.class)

最后,在user模块中,配置上:

feign.hystrix.enabled=true

现在,启动2个微服务,我们测试一下效果:
1、显示2个服务都正常的情况下,调用结果如下:

 2、通过nacos的管理界面,我们手动下线send模块服务,或是手动停止send服务,模拟服务宕机异常情况,再看下请求效果:

 可以看到,通过feign集成的hystrix配置的降级处理,已经生效了。


2.2 指定接口自定义熔断配置

这里以send模块为例。。在启动类上,先加上注解:

@EnableHystrix

然后,写一个测试方法,如下:

@HystrixCommand(fallbackMethod = "failResult",commandProperties = 
			{@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "1000"),
			@HystrixProperty(name = "fallback.enabled", value = "true")})
@PostMapping(value = "/testHystrix")
public ResultBean testHystrix() throws InterruptedException {
	//线程睡眠2秒,模拟接口响应慢的情况
	Thread.sleep(2000);
	return ResultBean.returnResult(ResponseCodeEnum.SUCCESS,"send服务正常。。。");
}

private ResultBean failResult(){
	return ResultBean.returnResult(ResponseCodeEnum.FAIL,"send服务暂不可用。。。");
}

启动后,我们测试一下:

 可以看到,接口的执行已经进入到的降级的fallback方法中了。

这里,我贴一下HystrixCommand详细配置说明,可以参考使用:

Command属性主要用来控制HystrixCommand命令的行为,它主要分下面的类别:

1、Execution:用来控制HystrixCommand.run()的执行
execution.isolation.strategy:该属性用来设置HystrixCommand.run()执行的隔离策略。默认为THREAD。
execution.isolation.thread.timeoutInMilliseconds:该属性用来配置HystrixCommand执行的超时时间,单位为毫秒。
execution.timeout.enabled:该属性用来配置HystrixCommand.run()的执行是否启用超时时间。默认为true。
execution.isolation.thread.interruptOnTimeout:该属性用来配置当HystrixCommand.run()执行超时的时候是否要它中断。
execution.isolation.thread.interruptOnCancel:该属性用来配置当HystrixCommand.run()执行取消时是否要它中断。
execution.isolation.semaphore.maxConcurrentRequests:当HystrixCommand命令的隔离策略使用信号量时,该属性用来配置信号量的大小。当最大并发请求达到该设置值时,后续的请求将被拒绝。

2、Fallback:用来控制HystrixCommand.getFallback()的执行
fallback.isolation.semaphore.maxConcurrentRequests:该属性用来设置从调用线程中允许HystrixCommand.getFallback()方法执行的最大并发请求数。当达到最大并发请求时,后续的请求将会被拒绝并抛出异常。
fallback.enabled:该属性用来设置服务降级策略是否启用,默认是true。如果设置为false,当请求失败或者拒绝发生时,将不会调用HystrixCommand.getFallback()来执行服务降级逻辑。

3、Circuit Breaker:用来控制HystrixCircuitBreaker的行为。
circuitBreaker.enabled:确定当服务请求命令失败时,是否使用断路器来跟踪其健康指标和熔断请求。默认为true。
circuitBreaker.requestVolumeThreshold:用来设置在滚动时间窗中,断路器熔断的最小请求数。例如,默认该值为20的时候,如果滚动时间窗(默认10秒)内仅收到19个请求,即使这19个请求都失败了,断路器也不会打开。
circuitBreaker.sleepWindowInMilliseconds:用来设置当断路器打开之后的休眠时间窗。休眠时间窗结束之后,会将断路器设置为“半开”状态,尝试熔断的请求命令,如果依然时候就将断路器继续设置为“打开”状态,如果成功,就设置为“关闭”状态。
circuitBreaker.errorThresholdPercentage:该属性用来设置断路器打开的错误百分比条件。默认值为50,表示在滚动时间窗中,在请求值超过requestVolumeThreshold阈值的前提下,如果错误请求数百分比超过50,就把断路器设置为“打开”状态,否则就设置为“关闭”状态。
circuitBreaker.forceOpen:该属性默认为false。如果该属性设置为true,断路器将强制进入“打开”状态,它会拒绝所有请求。该属性优于forceClosed属性。
circuitBreaker.forceClosed:该属性默认为false。如果该属性设置为true,断路器强制进入“关闭”状态,它会接收所有请求。如果forceOpen属性为true,该属性不生效。

4、Metrics:该属性与HystrixCommand和HystrixObservableCommand执行中捕获的指标相关。
metrics.rollingStats.timeInMilliseconds:该属性用来设置滚动时间窗的长度,单位为毫秒。该时间用于断路器判断健康度时需要收集信息的持续时间。断路器在收集指标信息时会根据设置的时间窗长度拆分成多个桶来累计各度量值,每个桶记录了一段时间的采集指标。例如,当为默认值10000毫秒时,断路器默认将其分成10个桶,每个桶记录1000毫秒内的指标信息。
metrics.rollingStats.numBuckets:用来设置滚动时间窗统计指标信息时划分“桶”的数量。默认值为10。
metrics.rollingPercentile.enabled:用来设置对命令执行延迟是否使用百分位数来跟踪和计算。默认为true,如果设置为false,那么所有的概要统计都将返回-1。
metrics.rollingPercentile.timeInMilliseconds:用来设置百分位统计的滚动窗口的持续时间,单位为毫秒。
metrics.rollingPercentile.numBuckets:用来设置百分位统计滚动窗口中使用桶的数量。
metrics.rollingPercentile.bucketSize:用来设置每个“桶”中保留的最大执行数。
metrics.healthSnapshot.intervalInMilliseconds:用来设置采集影响断路器状态的健康快照的间隔等待时间。

5、Request Context:涉及HystrixCommand使用HystrixRequestContext的设置。
requestCache.enabled:用来配置是否开启请求缓存。
requestLog.enabled:用来设置HystrixCommand的执行和事件是否打印到日志的HystrixRequestLog中。

3、hystrix的配置参数说明

1.HystrixCommandProperties用于HystrixCommand配置,一个HystrixCommandKey对应一个HystrixCommandProperties实例。

2.HystrixThreadPoolProperties用于HystrixThreadPool配置,一个HystrixThreadPoolKey对应一个HystrixThreadPoolProperties实例。

3.HystrixCollapserProperties用于HystrixCollapserCommand配置,一个HystrixCollapserKey对应一个HystrixCollapserProperties实例。

类别

配置项

默认值

HystrixCommandProperties                       

hystrix.threadpool.[commandkey].circuitBreaker.enabled

true

hystrix.threadpool.[commandkey].circuitBreaker.requestVolumeThreshold

20

hystrix.threadpool.[commandkey].circuitBreaker.sleepWindowInMilliseconds

5000

hystrix.threadpool.[commandkey].circuitBreaker.errorThresholdPercentage

50

hystrix.threadpool.[commandkey].circuitBreaker.forceOpen

false

hystrix.threadpool.[commandkey].circuitBreaker.forceClosed

false

hystrix.threadpool.[commandkey].execution.isolation.strategy

Thread

hystrix.threadpool.[commandkey].execution.isolation.thread.timeoutInMilliseconds

1000

hystrix.threadpool.[commandkey].execution.timeout.enabled

true

hystrix.threadpool.[commandkey].execution.isolation.thread.interruptOnTimeout

true

hystrix.threadpool.[commandkey].execution.isolation.thread.interruptOnFutureCancel

false

hystrix.threadpool.[commandkey].execution.isolation.semaphore.maxConcurrentRequests

10

hystrix.threadpool.[commandkey].fallback.isolation.semaphore.maxConcurrentRequests

10

hystrix.threadpool.[commandkey].fallback.enabled

true

hystrix.threadpool.[commandkey].metrics.rollingStats.timeInMilliseconds

10000

hystrix.threadpool.[commandkey].metrics.rollingStats.numBuckets

10

hystrix.threadpool.[commandkey].metrics.rollingPercentile.enabled

true

hystrix.threadpool.[commandkey].metrics.rollingPercentile.timeInMilliseconds

60000

hystrix.threadpool.[commandkey].metrics.rollingPercentile.numBuckets

6

hystrix.threadpool.[commandkey].metrics.rollingPercentile.bucketSize

100

hystrix.threadpool.[commandkey].metrics.healthSnapshot.intervalInMilliseconds

500

hystrix.threadpool.[commandkey].requestCache.enabled

true

hystrix.threadpool.[commandkey].requestLog.enabled

true

hystrix.threadpool.[commandkey].threadPoolKeyOverride

HystrixThreadPoolProperties

hystrix.threadpool.[threadPoolkey].coreSize

10

hystrix.threadpool.[threadPoolkey].allowMaximumSizeToDivergeFromCoreSize

false

hystrix.threadpool.[threadPoolkey].maximumSize

10

hystrix.threadpool.[threadPoolkey].keepAliveTimeMinutes

1

hystrix.threadpool.[threadPoolkey].maxQueueSize

-1

hystrix.threadpool.[threadPoolkey].queueSizeRejectionThreshold

5

hystrix.threadpool.[threadPoolkey].metrics.rollingStats.timeInMilliseconds

10000

hystrix.threadpool.[threadPoolkey].metrics.rollingStats.numBuckets

10

HystrixCollapserProperties

hystrix.collapser.[collapserCommandkey].maxRequestsInBatch

Integer.MAX_VALUE

hystrix.collapser.[collapserCommandkey].timerDelayInMilliseconds

10

hystrix.collapser.[collapserCommandkey].requestCache.enabled

true

hystrix.collapser.[collapserCommandkey].metrics.rollingStats.timeInMilliseconds

10000

hystrix.collapser.[collapserCommandkey].metrics.rollingStats.numBuckets

10

hystrix.collapser.[collapserCommandkey].metrics.rollingPercentile.enabled

true

hystrix.collapser.[collapserCommandkey].metrics.rollingPercentile.timeInMilliseconds

60000

hystrix.collapser.[collapserCommandkey].metrics.rollingPercentile.numBuckets

6

hystrix.collapser.[collapserCommandkey].metrics.rollingPercentile.bucketSize

100

内部每个属性由一个ChainHystrixProperty表示,ChainHystrixProperty是一个串联的HystrixDynamicProperty,持续获取串中的属性值,直到获得不为null值为止。ChainHystrixProperty串联的HystrixDynamicProperty默认通过插件获取的HystrixDynamicProperties获取(最后我们会讲到插件)。

  HystrixDynamicProperty表示动态配置数据,如果配置源发送变化,通过该对象获取配置也会相应变化。hystrix中有种实现类:

1.通过archaius实现获取配置项,通过HystrixDynamicPropertiesArchaius创建该类HystrixDynamicProperty。

2.通过system实现获取配置项,通过HystrixDynamicPropertiesSystemProperties创建该类HystrixDynamicProperty。

还有yaml配置:

hystrix:
  command:
    #全局默认配置
    default:
      execution:
        timeout:
          #是否给方法执行设置超时时间,默认为true。一般我们不要改。
          enabled: true
        isolation:
          #配置请求隔离的方式,这里是默认的线程池方式。还有一种信号量的方式semaphore,使用比较少。
          strategy: threadPool
          semaphore:
            maxConcurrentRequests: 1000
          thread:
            #方式执行的超时时间,默认为1000毫秒,在实际场景中需要根据情况设置
            timeoutInMilliseconds: 60000
            #发生超时时是否中断方法的执行,默认值为true。不要改。
            interruptOnTimeout: true
            #是否在方法执行被取消时中断方法,默认值为false。没有实际意义,默认就好!
            interruptOnCancel: false
            #熔断器相关配置
      ##并发执行的最大线程数,默认10
      coreSize: 200
      #说明:是否允许线程池扩展到最大线程池数量,默认为false。
      allowMaximumSizeToDivergeFromCoreSize: true
      #说明:线程池中线程的最大数量,默认值是10。此配置项单独配置时并不会生效,需要启用allowMaximumSizeToDivergeFromCoreSize
      maximumSize: 200
      #说明1:作业队列的最大值,默认值为-1。表示队列会使用SynchronousQueue,此时值为0,Hystrix不会向队列内存放作业。
      #说明2:如果此值设置为一个正int型,队列会使用一个固定size的LinkedBlockingQueue,此时在核心线程池都忙碌的情况下,会将作业暂时存放在此队列内,但是超出此队列的请求依然会被拒绝
      maxQueueSize: 20000
      #设置队列拒绝请求的阀值,默认为5。
      queueSizeRejectionThreshold: 30000
 
      circuitBreaker:
        #说明:是否启动熔断器,默认为true。我们使用Hystrix的目的就是为了熔断器,不要改,否则就不要引入Hystrix。
        enabled: true
        #说明1:启用熔断器功能窗口时间内的最小请求数,假设我们设置的窗口时间为10秒,
        #说明2:那么如果此时默认值为20的话,那么即便10秒内有19个请求都失败也不会打开熔断器。
        #说明3:此配置项需要根据接口的QPS进行计算,值太小会有误打开熔断器的可能,而如果值太大超出了时间窗口内的总请求数,则熔断永远也不会被触发
        #说明4:建议设置一般为:QPS*窗口描述*60%
        requestVolumeThreshold: 3000
        #说明1:熔断器被打开后,所有的请求都会被快速失败掉,但是何时恢复服务是一个问题。熔断器打开后,Hystrix会在经过一段时间后就放行一条请求
        #说明2:如果请求能够执行成功,则说明此时服务可能已经恢复了正常,那么熔断器会关闭;相反执行失败,则认为服务仍然不可用,熔断器保持打开。
        #说明3:所以此配置的作用是指定熔断器打开后多长时间内允许一次请求尝试执行,官方默认配置为5秒。
        sleepWindowInMilliseconds: 5000
        #说明1:该配置是指在通过滑动窗口获取到当前时间段内Hystrix方法执行失败的几率后,根据此配置来判断是否需要打开熔断器
        #说明2:这里官方的默认配置为50,即窗口时间内超过50%的请求失败后就会打开熔断器将后续请求快速失败掉
        errorThresholdPercentage: 70
        #说明:是否强制启用熔断器,默认false,没有什么场景需要这么配置,忽略!
        forceOpen: false
        #说明:是否强制关闭熔断器,默认false,没有什么场景需要这么配置,忽略!
        forceClosed: false

对于hystrix的实现原理感兴趣的,可以看下我往期的博文:

【SpringCloud微服务系列】Hystrix熔断器底层原理


         至此,springcloud微服务集成hystrix熔断器的操作流程,就记录完啦。后续还会有分布式链路追踪的实现集成,感兴趣的话,请帮忙一键三连谢谢~~~

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

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

相关文章

ABB变频器使用PROFINET IO通信协议时的输入和输出介绍

ABB变频器使用PROFINET IO通信协议时的输入和输出介绍 前面和大家分享了 ABB变频器使用PROFINET IO通信模块时的激活方法 本次继续和大家分享ABB变频器使用PROFINET IO通信协议时的数据输入和输出。 如下图所示,在参数号52、53中可以设置现场总线适配器的数据输入和数据输出,…

MyBatis:配置文件

MyBatis 前言全局配置文件映射配置文件注 前言 在 MyBatis 中&#xff0c;配置文件分为 全局配置文件&#xff08;核心配置文件&#xff09; 和 映射配置文件 。通过这两个配置文件&#xff0c;MyBatis 可以根据需要动态地生成 SQL 语句并执行&#xff0c;同时将结果集转换成 …

深入探索:AbstractQueuedSynchronizer 同步器的神秘面纱

文章目录 &#x1f31f; 一、AQS的底层实现原理&#x1f34a; 1. AQS的概述&#x1f34a; 2. AQS的数据结构&#x1f389; (1) 同步状态&#x1f389; (2) 等待队列 &#x1f34a; 3. AQS的锁请求和释放过程&#x1f389; (1) 独占模式&#x1f389; (2) 共享模式 &#x1f34a…

Electron 学习

Electron基本简介 如果你可以建一个网站&#xff0c;你就可以建一个桌面应用程序。Eletron 是一个使用 JavaScript, HTML和 CSS等Web 技术创建原生程序的框架&#xff0c;它负责比较难搞的部分&#xff0c;你只需把精力放在你的应用的核心上即可。 Electron 可以让你使用纯 Jav…

s27.linux运维面试题分享

第一章 计算机基础和Linux安装 1.冯诺依曼体系结构组成部分 计算机硬件由运算器、控制器、存储器、输入设备和输出设备五大部分组成。2.Linux哲学思想(或Liunx基本原则、思想、规则) 一切都是一个文件&#xff08;包括硬件&#xff09;。小型&#xff0c;单一用途的程序。连…

分享一个月份连续的MSSA插值的GRACE level03数据集

1. 背景介绍 我们通常使用的GRACE数据包含球谐数据和mascon数据。而不管是球谐产品还是mascon产品&#xff0c;都存在月份数据的缺失&#xff0c;如下图所示&#xff08;Yi and Sneeuw, 2021&#xff09;。本专栏分享了一个利用多通道奇异谱分析&#xff08;MSSA&#…

PostgreSQL 插件 CREATE EXTENSION 原理

PostgreSQL 提供了丰富的数据库内核编程接口&#xff0c;允许开发者在不修改任何 Postgres 核心代码的情况下以插件的形式将自己的代码融入内核&#xff0c;扩展数据库功能。本文探究了 PostgreSQL 插件的一般源码组成&#xff0c;梳理插件的源码内容和实现方式&#xff1b;并介…

Apache Doris (四十七): Doris表结构变更-Schema变更

🏡 个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 🚩 私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。 🔔 博主个人B栈地址:豹哥教你大数据的个人空间-豹哥教你大数据个人主页-哔哩哔哩视频 目录

报错解决:libcudart.so和libprotobuf.so链接库未找到

报错解决&#xff1a;libcudart.so和libprotobuf.so链接库未找到 libcudart.so链接库未找到原因解决方法 libprotobuf.so链接库未找到原因解决方法 此博客介绍了博主在编译软件包时遇到的两个报错&#xff0c;主要是libcudart和libprotobuf两个动态链接库未找到的问题&#xff…

频繁full GC排查

场景&#xff1a;通过prometheus去拉取通过actuator组件暴露的端点中的JVM相关指标。通过告警规则&#xff0c;检测线上服务出现频繁full gc。 ((jvm_gc_pause_seconds_count{action"end of major GC",cause!"Heap Dump Initiated GC"}- jvm_gc_pause_sec…

显示屏没有信号monitor no signal from device

双屏幕总是有个屏幕连接不上&#xff0c;显示没有信号。 环境 win11 Dell dual monitor双屏 解决方法 检查电源有没有插好&#xff0c;HDMI或DP线有没有插好。如果仍然出现这个情况&#xff0c;试着更新一下驱动。 如果还是点不亮&#xff0c;那么关掉亮的那个显示屏。用…

前端开发技术栈(工具篇):详细介绍npm、pnpm和cnpm分别是什么,使用方法以及之间有哪些关系

目录 npm、pnpm和cnpm分别是什么 npm pnpm cnpm NPM包管理器 使用npm管理&#xff0c;创建/初始化项目 修改npm镜像&#xff08;npm源设置&#xff09; 基本命令 安装依赖项 下载特定版本的依赖 下载开发依赖 下载全局依赖&#xff08;全局安装&#xff09; 升级依…

redis分布式锁的应用

redis 作为分布式锁的东西 分布式锁的应用 redis,zk,数据库这些都可以实现分布式锁 我们今天主要基于redis实现的分布式锁&#xff0c;而且要求性能要好 基于一个小的业务场景来说&#xff0c;就比如说秒杀中的减库存&#xff0c;防止超卖这种代码就会有并发问题,比方说3个线程…

C++动态规划算法的应用:得到 K 个半回文串的最少修改次数 原理源码测试用例

本文涉及的基础知识点 动态规划 题目 得到 K 个半回文串的最少修改次数 给你一个字符串 s 和一个整数 k &#xff0c;请你将 s 分成 k 个 子字符串 &#xff0c;使得每个 子字符串 变成 半回文串 需要修改的字符数目最少。 请你返回一个整数&#xff0c;表示需要修改的 最少…

VS Code打造Julia IDE

文章目录 运行和调试Workspace绘图选项卡代码编辑 搜索并下载Julia插件后&#xff0c;左侧工具栏会出现Julia的三圆图标&#xff0c;点进去之后分为Workspace, Documentation以及Plot navigator三个子窗。 运行和调试 打开.jl文件后&#xff0c;其右上角会出现一个三角形的符…

【洛谷算法题】P3954-成绩【入门1顺序结构】

&#x1f468;‍&#x1f4bb;博客主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P3954-成绩【入门1顺序结构】&#x1f30f;题目背景&#x1f30f;题目描述&#…

【1++的Linux】之文件(三)

&#x1f44d;作者主页&#xff1a;进击的1 &#x1f929; 专栏链接&#xff1a;【1的Linux】 文章目录 一&#xff0c;磁盘结构二&#xff0c;磁盘的抽象结构三&#xff0c;文件系统四&#xff0c;文件的增删查改五&#xff0c;软硬链接六&#xff0c;动静态库1. **动态库和静…

Socket实现服务器搭建

一、前言&#xff1a; Socket上篇文章已经介绍过了 他是实现网络编程的基础 。 在服务器模型中通常都是多个客户端一个服务器端&#xff0c;那么服务器是如何处理多个客户端的请求&#xff1f; 1.顺序处理 依次处理--效率低下 2.并发处理 2.1 多线程并发&#xff08;线程池…

《向量数据库》——Zilliz X Dify.AI ,快速打造知识库 AI 应用

Zilliz 大模型生态矩阵再迎新伙伴!近日,Zilliz 和 Dify.AI 达成合作,Zilliz 旗下的产品 Zilliz Cloud、Milvus 与开源 LLMOps 平台 Dify 社区版进行了深度集成。 01. Zilliz Cloud v.s. Dify Dify 作为开源的 LLMs App 技术栈,在此前已支持丰富多元的大型语言模型的接入,…

解密Java中神奇的Synchronized关键字

文章目录 &#x1f389; 定义&#x1f389; JDK6以前&#x1f389; 偏向锁和轻量级锁&#x1f4dd; 偏向锁&#x1f4dd; 轻量级锁&#x1f4dd; 自旋锁&#x1f4dd; 重量级锁&#x1f525; 1. 加锁&#x1f525; 2. 等待&#x1f525; 3. 撤销 &#x1f389; 锁优化&#x1f…