微服务熔断

article/2025/9/25 16:18:52

https://mp.weixin.qq.com/s/cxd0Fol4BBzx4v2qm-hlwQ
 

我这篇文章来的晚了些,因为hystrix已经进入维护模式。但已经有非常多的同学入坑了,那么本篇文章就是及时雨。本文将说明熔断使用的一些注意事项,可能会细的让你厌烦。

前半段,是理论部分,各种熔断都适用。后半段,是参数部分,适合微调。

那我们开始。

通常来说,皇帝在微服务里想夜生活过得舒服,能够大刀阔斧单刀直入,不因私事丢江山,就不得不靠熔断大总管

时过境迁。提到熔断大总管就不得不说他手下最突出的三位公公:sentinel,或hystrix,也可能是resilience4j。

这三位都是解决一类问题的,如著名的雪崩:A→B→C互相依次调用,但C项目很可能出现问题(流量过大或者报错等),引发线程一直进行等待,导致拖垮整个链路层,线程资源耗尽。

 

 

一、背景

假如是用的spring全家桶系列,在接口调用上大多会走这个路线。我们这里依然是在说hystrix,虽然现在不再受宠。

Feign —-→
Hystrix —-→
Ribbon —-→
Http Client(apache http components/Okhttp)

具体如下图所示:

 

二、配置

首先来点理论性的东西。好吃不贵。

Ⅰ隔离方式

线程隔离(默认):使用一个线程池来存储当前的请求,线程池对请求作处理,设置任务返回处理超时时间,堆积的请求堆积入线程池队列。这种方式需要为每个依赖的服务申请线程池,有一定的资源消耗,好处是可以应对突发流量(流量洪峰来临时,处理不完可将数据存储到线程池队里慢慢处理)

信号隔离:使用一个原子计数器(或信号量)来记录当前有多少个线程在运行,请求来先判断计数器的数值,若超过设置的最大线程个数则丢弃改类型的新请求,若不超过则执行计数操作请求来计数器+1,请求返回计数器-1。这种方式是严格的控制线程且立即返回模式,无法应对突发流量(流量洪峰来临时,处理的线程超过数量,其他的请求会直接返回,不继续去请求依赖的服务)

Ⅱ熔断

如果某个目标服务调用慢或者大量超时,则此时熔断该服务的调用,对于后续调用请求,不再继续调用目标服务,直接返回,快速释放资源。如果目标服务情况好转,则恢复调用。

这个过程,可以想象成保险丝的行为。

行为虽然简单,但需要调节的参数却非常多。

使用方式

1.引入依赖

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

2.配置参数

feign:hystrix:
#不配置或为false则不生效enabled: true
hystrix:command:default:execution:isolation:thread:
#若配置了重试则超时时间= (1 + MaxAutoRetries + MaxAutoRetriesNextServer) * ReadTimeouttimeoutInMilliseconds: 60000threadpool:default:coreSize: 10maxQueueSize: 50queueSizeRejectionThreshold: 30keepAliveTimeMinutes: 3

3.配置fallback

因业务处理不同,建议每个feign client使用不同的fallback

到此,hystrix已经可以走马上任,至于干活儿稳不稳那是后话。

4.配置的其他姿势

hystrix到任务后,发现有的服务接口1s内就完事儿 ,还有的5s到10几秒才堪堪返回。一刀切的配置已难以管理诸多服务&接口。

想必已经有人发现,之前配置中混进了奇怪的东西——default关键词。这是对全局配置,那么对应的肯定有局部的配置。

如:对服务的,对某个接口的…

hystrix:command:default:execution:isolation:thread:timeoutInMilliseconds: 60000threadpool:
#全局配置default:coreSize: 10maxQueueSize: 50queueSizeRejectionThreshold: 30keepAliveTimeMinutes: 3
#对某个服务配置,写service-idbase-rpc:coreSize: 10maxQueueSize: 30queueSizeRejectionThreshold: 20keepAliveTimeMinutes: 3
#对某个接口配置BaseApiClient#searchItemSkuList(PosSkuSearch):coreSize: 10maxQueueSize: 40queueSizeRejectionThreshold: 30keepAliveTimeMinutes: 1

另外,还可以使用@HystrixCommand注解进行配置。

5.配置的动态修改

很多情况下,不能修改个配置,特别是临时修改配置就重启下服务,能动态刷新就最好了。
于是我们盯上了hystrix使用archaius管理配置的问题。

archaius是Netflix公司开源项目之一,基于java的配置管理类库,主要用于多配置存储的动态获取。
主要功能是对apache common configuration类库的扩展。在云平台开发中可以将其用作分布式配置管理依赖构件。同时,它有如下一些特性:
动态获取属性
高效和线程安全的配置操作
配置改变时提供回调机制
可以通过jmx操作配置
复合配置

说了这么多那该怎么整呢?以下就是简单的示例。

//捞配置
AbstractConfiguration config = ConfigurationManager.getConfigInstance();//提取关注的部分,比如hystrix.threadpool
Iterable<String> iterable = () -> config.getKeys("hystrix.threadpool");
List<Property> result = StreamSupport.stream(iterable.spliterator(), false).map(t -> new Property(t, config.getString(t, ""))).sorted(Comparator.comparing(Property::getName)).collect(Collectors.toList());//修改配置
config.setProperty("hystrix.threadpool.base-rpc.coreSize", 20);//移除配置
config.clearProperty(hystrix.threadpool.base-rpc.coreSize");

三、其他参数

要是觉得hystrix这么听话,那就太小看它了。别忘了前面有feign,后面还有ribbon,再往后http client呢!一堆超时参数,当代的八门金锁阵

1.feign超时

feign:hystrix:enabled: trueclient:config:default:connectTimeout: 5000readTimeout: 5000rpc-pos:connectTimeout: 5000readTimeout: 8000xx-rpc:connectTimeout: 5000readTimeout: 12000order-rpc:connectTimeout: 5000readTimeout: 8000

feign是暴露给用户使用的,Spring在处理这一块的时候,会有意识地使用feign的超时时间来设置后面的ribbon 和http client组件。

2.ribbon超时

#全局配置
ribbon:ReadTimeout: 60000ConnectTimeout: 10000#false to only allow get method to retryOkToRetryOnAllOperations: true# Max number of next servers to retry (excluding the first server)MaxAutoRetriesNextServer: 2# Max number of retries on the same server (excluding the first try)MaxAutoRetries: 0# Interval to refresh the server list from the sourceServerListRefreshInterval: 5000retryableStatusCodes: 404,500
#服务配置
base-rpc:ribbon:ReadTimeout: 60000ConnectTimeout: 10000#false to only allow get method to retryOkToRetryOnAllOperations: true# Max number of next servers to retry (excluding the first server)MaxAutoRetriesNextServer: 2# Max number of retries on the same server (excluding the first try)MaxAutoRetries: 0# Interval to refresh the server list from the sourceServerListRefreshInterval: 5000retryableStatusCodes: 404,500

当feign设置了超时时间,Ribbon会依据feign的设置同步。Ribbon的这个超时时间,用于指导真正调用接口时,设置真正实现者的超时时间。

httpclient超时

feign:hystrix:enabled: trueokhttp:enabled: truehttpclient:enabled: false
//连接池最大连接数,默认200max-connections: 500
//每一个IP最大占用多少连接 默认 50max-connections-per-route: 50
//默认连接超时时间:2000毫秒connection-timeout: 8000
//连接池管理定时器执行频率:默认 3000毫秒connection-timer-repeat: 6000
//连接池中存活时间,默认为5time-to-live: 5time-to-live-unit: minutes

超时设置遵循的基本原则是:依赖方的超时配置覆盖被依赖方的配置,而其配置覆盖的形式,则是使用的Spring Boot 的 AutoConfiguration 机制实现的

如:若开启feign.okhttp.enabled=true,则okhttp的超时时间是feign.httpclient.connectionTimeout的值,默认2000毫秒

总结:超时——还是  feign  说了算!

四、hystrix dashboard

能够将这些状态可视化,是非常棒的,需要引入一个jar包。

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

下面这张图,就是针对后台监控的一些解释。


(图片来自网络)

附:配置参数说明

一、Command Properties

以下属性控制HystrixCommand,前缀hystrix.command.default

1、Execution

以下属性控制HystrixCommand.run()如何执行。
比较重要的参数,有:
execution.isolation.strategy
execution.isolation.thread.timeoutInMilliseconds

2、Fallback

以下属性控制HystrixCommand.getFallback()如何执行。这些属性适用于ExecutionIsolationStrategy.THREAD和ExecutionIsolationStrategy.SEMAPHORE。

3、Circuit Breaker

断路器属性控制HystrixCircuitBreaker。

 

4、Metrics

以下属性与从HystrixCommand和HystrixObservableCommand执行捕获指标有关。

5、Request Context

这些属性涉及HystrixCommand使用的HystrixRequestContext功能

二、Command Properties

下列属性控制HystrixCollapser行为。前缀:hystrix.collapser.default

三、ThreadPool Properties

以下属性控制Hystrix命令在其上执行的线程池的行为。
大多数时候,默认值为10的线程会很好(通常可以做得更小)前缀:hystrix.threadpool.default

End

 

这货,说不更新,还真不更新了。但我们的遗留系统,有很多模块在用着,所以我还是把它的细节参数给抠出来了。这应该是绝版吧,因为hystrix是绝更了。

本文只适合收藏,不适合分享。分享出去,会等于拿着大喇叭告诉别人,你正在给某个遗留系统填坑呢。

 


http://chatgpt.dhexx.cn/article/sjCNtOnZ.shtml

相关文章

【服务熔断】服务熔断完整说明

文章目录 1.创始人文档2.熔断机制3.原理总结4.断路器打开之后5.服务监控hystrixDashboarda.七色b.一圈c.一线d.单个图说明e.多个图说明 1.创始人文档 大神文档 2.熔断机制 熔断机制概述 熔断机制是应对雪崩效应的一种微服务链路保护机制。当扇出链路的某个微服务出错不可用…

Istio的熔断

一、理解熔断   熔断&#xff08;Circuit Breaker&#xff09;&#xff0c;原是指当电流超过规定值时断开电路&#xff0c;进行短路保护或严重过载时的一种保护机制。后来熔断也广泛应用于金融领域&#xff0c;指当股指波幅达到规定的熔断点时&#xff0c;交易所为控制风险采…

hystrix熔断

熔断操作放在服务提供层&#xff0c;是在类的方法上&#xff0c;而降级是在消费者的接口层面设置 1.加入jar包 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-hystrix</artifactId><version&…

服务熔断降级

之前给大家讲了很多服务之前的关系&#xff0c;今天主要给大家介绍&#xff0c;当服务出现问题时&#xff0c;我们该如何解决。 首先我们先进行一些场景分析&#xff1a; 场景一 服务提供端提供了A、B、C、D 4个服务&#xff0c;服务调用方调用服务时&#xff0c;D服务出现了…

Hystrix 服务熔断

目录 服务雪崩 一、什么是Hystrix 二、服务熔断 案例 三、服务降级 什么是服务降级 降级工厂类 设置fallbackFactory 开启feign.hystrix 四、服务熔断和降级的区别 五、DashBoard流监控 添加依赖 分布式系统面临的问题&#xff1a; 复杂分布式体系结构中的应用程序…

sentinel 熔断降级

sentinel 熔断降级 官网&#xff1a;https://sentinelguard.io/zh-cn/docs/circuit-breaking.html 熔断降级 熔断降级&#xff1a;服务由于响应慢、异常等原因触发熔断策略后&#xff0c;快速失败&#xff0c;避免线程堆积造成服务雪崩&#xff08;熔断降级通常在调用端配置&am…

kong网关熔断插件

Request Termination经常被作为kong的熔断器使用。以下在自建的konga管理界面里进行了测试配置 配置参数如下&#xff1a; 客户端发起请求&#xff0c;可以通过response进行验证&#xff0c;可以看到响应的状态码和报文都能生效。 以上配置是基于kong 0.12.3&#xff0c;可…

服务熔断的实现

# 0.服务熔断的实现思路 - 引入hystrix依赖,并开启熔断器(断路器) - 模拟降级方法 - 进行调用测试 # 1.项目中引入hystrix依赖 <!--引入hystrix--> <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-start…

熔断

我们知道&#xff0c;如果一个软件系统的并发请求数目超过了系统的最佳线程数&#xff0c;那么就会导致激烈的资源竞争&#xff0c;随着资源的匮乏甚至枯竭&#xff0c;整个系统也就面临着灾难。所以&#xff0c;很多软件系统为了保证即使在出现并发用户数>最佳线程数时&…

什么是服务熔断?

一、什么是服务熔断&#xff1f; 考试过程中当断则断的方式&#xff0c;正好符合微服务架构中的一种安全机制&#xff1a;【熔断】 熔断这一概念来源于电子工程中的断路器&#xff08;Circuit Breaker&#xff09;。 在互联网系统中&#xff0c;当下游服务因访问压力过大而响应…

熔断原理分析与源码解读

熔断机制&#xff08;Circuit Breaker&#xff09;指的是在股票市场的交易时间中&#xff0c;当价格的波动幅度达到某一个限定的目标&#xff08;熔断点&#xff09;时&#xff0c;对其暂停交易一段时间的机制。此机制如同保险丝在电流过大时候熔断&#xff0c;故而得名。熔断机…

【C++程序设计语言A视频教程 全12讲 中科院】【下载链接】

C程序设计语言A视频教程 全12讲 中科院 这个是我在淘宝上面买的 杨力祥老师的教程~~ 奉献给大家~~~ *************************************************************************************************************************************** 下面是网上对杨力祥老师的…

国科大杨力祥老师操作系统答案总结

基于网上搜索的版本以及历届师兄的版本&#xff0c;进行了整合和修改 对应参考书籍如下&#xff0c;对应P页数也是指该书的页数。 1.为什么开始启动计算机的时候&#xff0c;执行的是BIOS代码而不是操作系统自身的代码&#xff1f; 最开始启动计算机的时候&#xff0c;计算机…

简述Mean shift 算法及其实现

文章目录 Mean shift 是什么Mean shift 算法的预备知识什么是特征什么是特征空间什么是核密度估计核函数的表示 Mean shift 算法Mean shift算法的公式推导Mean shift算法的流程Mean shift算法图示 Mean shift 算法应用Mean Shift 算法应用在聚类Mean Shift 算法图像分割 Mean s…

Johnson-Trotter算法求全排列

下面我将贴出Johnson-Trotter算法的JAVA代码 package JT;import java.util.Scanner;public class Johnson_Trotter {//求最大的移动元素public static int maxk(int n, int[] array, boolean[] f) {//k存储最大移动元素的下标int k -1, max 0;for(int i 0; i < n; i) {/…

全源最短路Johnson算法

最短路Johnson算法( O ( n m l o g m ) O(nmlogm) O(nmlogm)) 可以求任意两点最短路&#xff0c; 新图的边权改造为&#xff1a; w ( x , y ) h ( x ) − h ( y ) w(x,y)h(x)-h(y) w(x,y)h(x)−h(y) 构造的新图 d 1 ( x , y ) d ( x , y ) h ( x ) − h ( y ) d1(x,y)d(x,y…

流水线作业调度问题-动态规划(运用Johnson算法)

问题描述 n个作业{1&#xff0c;2&#xff0c;…&#xff0c;n},要在由机器M1和M2组成的流水线上完成加工。每个作业加工的顺序都是先在M1上加工&#xff0c;然后在M2上加工。M1和M2加工作业i所需的时间分别为ai和bi。 要求确定这n个作业的最优加工顺序&#xff0c;使得从第一…

【随机算法】Johnson-Lindenstrauss Theorem 详细解读

前言 最近经常接触降维, 主要是做图像处理和视频处理的维度实在是比较多, 降维这个可真是真正的技术活儿, 而且在不同情况下降维的选择至关重要, 可以说会影响到最终的结果,今天主要是详细讲解一下其中一种当今的降维准则. Johnson-Lindenstrauss Theorem的问题定义 首先, JL要…

最短路径算法--Dijkstra算法,Bellmanford算法,Floyd算法,Johnson算法

最短路径算法 在交通地图上&#xff0c;两地点之间的路径通常标有长度&#xff0c;我们可以用加权有向来描述地图上的交通网。加权有向图中每条路径都有一个路径权值&#xff0c;大小为该路径上所有边的权值之和。本节将重点讨论顶点之间最短路径问题。在实际问题中&#xff0c…

在有向图中找出所有简单环--Johnson算法

注&#xff1a;本算法和计算图所有结点对最短路径的Johnson算法不同。 目录 综述 代码解析 实例解析 引用 综述 Johnson算法由B. Johnson发表于1975年&#xff0c;用于在一个有向图中寻找所有简单环。时间复杂度上界为O((ne)(c1))&#xff0c;空间复杂度为O(ne)&#xff0…