微服务: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.hqwc.cn/news/8122.html

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

相关文章

NSS [MoeCTF 2022]ezphp

NSS [MoeCTF 2022]ezphp 先看题目&#xff0c;看到这个就想到了BUU的mark love cat。但是完全不一样&#xff0c;这道题exit()在foreach()之前 法一且唯一&#xff1a; echo回显flag 如果要echo&#xff0c;那么不能exit&#xff0c;那么必须传flag&#xff08;get或者post&a…

【SLAM学习】FAST-LIO配置

本文主要记录如何配置FAST-LIO Eigen库 Eigen库安装&#xff1a; sudo apt install libeigen3-dev 查看Eigen版本&#xff1a; $ pkg-config --modversion eigen3 PCL库 PCL库安装&#xff1a; sudo apt install libpcl-dev 也可以指定版本安装&#xff1a; sudo apt …

Unity 新输入系统InputAction设置按键的阈值

输入阈值问题 在新的输入系统中&#xff0c;如果添加一个手柄按键只需要添加Pressed就够了&#xff0c;监听他的三个动作就可以得到按下&#xff0c;点击&#xff0c;抬起。 例如下面的代码&#xff1a; inputAction.Player.Trigger_Right.started OnRightTriggerStarted;i…

天翎群晖NAS为全文检索插翅起飞

编者按&#xff1a;企业的文档资料随着企业的业务发展会越来越多&#xff0c;想要某个资料的时候&#xff0c;最怕找不到想要的资料&#xff0c;这时KMS的全文检索功能就非常重要了&#xff0c;只需只言片语的零星关键字&#xff0c;查找文档没压力。 关键词&#xff1a;全文检…

【网络原理之一】应用层协议、传输层协议UDP和TCP,TCP的三次握手和四次挥手以及TCP的可靠和效率机制

应用层协议XML协议JSONHTTP 传输层协议UDP协议UDP的特点UDP协议格式 TCP协议TCP的特点TCP协议格式TCP的安全和效率机制确认应答(可靠机制)超时重传(可靠机制)连接管理(可靠机制)三次握手(连接过程)四次挥手(断开的过程)状态的转化 滑动窗口(效率机制)流量控制(可靠机制)拥塞控制…

代码随想录二刷 day38 | 动态规划之 509. 斐波那契数 70. 爬楼梯 746. 使用最小花费爬楼梯

day38 509. 斐波那契数1 确定dp数组以及下标的含义2 确定递推公式3 dp数组如何初始化4 确定遍历顺序5 举例推导dp数组 70. 爬楼梯1 确定dp数组以及下标的含义2 确定递推公式3 dp数组如何初始化4 确定遍历顺序5 举例推导dp数组 746. 使用最小花费爬楼梯1 确定dp数组以及下标的含…

探索Gradio库中的Image模块及其强大功能

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

jvm运行时数据区

一、jdk、jre、jvm的关系 jvm只是把class字节码文件翻译成机器识别的二进制数据&#xff0c;不同的操作系统生成的操作系统指令又会不一样jre除了包含jvm外&#xff0c;还提供了很多类库&#xff08;java.io、java.swing等包下类库&#xff09;提供工具&#xff0c;比如javac&a…

MongoDB【MongoDB命令、CRUD操作 】(二)-全面详解(学习总结---从入门到深化)

目录 MongoDB命令 CRUD操作 MongoDB命令 基本操作 查看数据库 show dbs; 切换数据库 如果没有对应的数据库则创建 use 数据库名;创建集合 db.createCollection("集合名") 查看集合 show tables; show collections; 删除集合 db.集合名.drop(); 删除当前…

基于matlab使用深度学习的语义分割算法实现(附源码)

一、前言 此示例演示如何使用语义分割网络对图像进行分割。 语义分割网络对图像中的每个像素进行分类&#xff0c;从而生成按类分割的图像。语义分割的应用包括自动驾驶的道路分割和医疗诊断的癌细胞分割。 此示例首先向您展示如何使用预训练的 Deeplab v3 [1] 网络分割图像&am…

看一眼Mysql查询语句

目录 &#x1f6fb; 查询数据 &#x1f6fb;基本查询语句 &#x1f6fb;单表查询 &#x1f695;查询所有字段 &#x1f695;查询指定字段 &#x1f695;查询指定记录 &#x1f695;带in关键字的查询 &#x1f695;带between and的范围查询 &#x1f695;带like的字符匹…

NIO-Selector 网络编程

目录 一、阻塞 & 非阻塞 1、阻塞 2、非阻塞 二、selector 1、连接和读取 2、处理客户端断开 3、处理消息的边界 4、ByteBuffer大小分配 三、多线程优化 四、NIO vs BIO 1、stream vs channnel 2、IO模型 阻塞IO 非阻塞IO 多路复用 异步IO模型 一、阻塞 &am…