【微服务治理】Spring Cloud 断路器Hystrix实战应用

news2024/11/20 1:26:03

系列文章目录

第一章 Java线程池技术应用
第二章 CountDownLatch和Semaphone的应用
第三章 Spring Cloud 简介
第四章 Spring Cloud Netflix 之 Eureka
第五章 Spring Cloud Netflix 之 Ribbon
第六章 Spring Cloud 之 OpenFeign
第七章 Spring Cloud 之 GateWay
第八章 Spring Cloud Netflix 之 Hystrix


文章目录

  • 系列文章目录
  • 前言
  • 1、Hystrix概念
  • 2、Hystrix作用
    • 2.1、服务降级
    • 2.2、服务熔断
  • 3、案例
    • 3.1、服务提供端降级
      • 3.1.1、修改pom.xml配置依赖
      • 3.1.2、在微服务方法上添加降级注解代码
      • 3.1.3、在启动类加上注解
    • 3.2、消费端降级
      • 3.2.1、修改pom.xml配置依赖
      • 3.2.2、修改application.yml配置
      • 3.2.3、在消费端方法上添加代码
      • 3.2.4、在消费端启动类上加上注解
    • 3.3、全局降级
    • 3.4、解耦降级
      • 3.4.1、修改application.yml
      • 3.4.2、在方法上修改
    • 3.5、服务熔断
      • 3.5.1、Hystrix 实现服务熔断的步骤
      • 3.5.2、实例
  • 总结


前言

在这里插入图片描述

多个微服务之间调用的时候,假如微服务A调用微服务B和微服务C,微服务B和微服务C又调用其他的微服务,这就是所谓的"扇出"。


如果扇出的链路上某个微服务的调用响应的时间过长或者不可用,对微服A的调用就会占用越来越多的系统资源,进而引起系统崩溃,即"雪崩效应"。


这时就需要一个组件(hytrix),来保证微服务出现故障时,不会导致整个系统出现雪崩效应,以提高分布式系统弹性。</font size=“4”>

在这里插入图片描述

1、Hystrix概念

  • Hystrix是一个用于处理分布式系统的延迟和容错的开源库,可以保证一个服务出现故障时,不会导致整个系统出现雪崩效应,以提高分布式系统弹性;
  • 作为“断路器”,在一个服务出现故障时,可以通过短路器监控,返回一个可以处理的响应结果,保证服务调用线程不会长时间被占用,避免故障蔓延

2、Hystrix作用

2.1、服务降级

当某个服务单元发生故障后,通过断路器的故障监控,向调用方法返回一个服务预期的、可处理的备选响应,而不是长时间的等待或者抛出调用方法无法处理的异常,避免了故障在分布式系统中的蔓延。
在这里插入图片描述

2.2、服务熔断

当某个服务单元发生故障后,通过断路器的故障监控,直接返回一个预设的失败响应,而不是长时间的等待或者抛出调用方法无法处理的异常,避免了故障在分布式系统中的蔓延。
在这里插入图片描述

3、案例

3.1、服务提供端降级

3.1.1、修改pom.xml配置依赖

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

3.1.2、在微服务方法上添加降级注解代码

//超过3秒钟降级到userInfoListFallBack
@HystrixCommand(fallbackMethod = "userInfoListFallBack",commandProperties = {@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds"
        ,value = "3000")})
  • 参数 fallbackMethod 属性用于指定降级方法。
  • 参数 execution.isolation.thread.timeoutInMilliseconds 用于设置自身调用超时时间的峰值,峰值内可以正常运行,否则执行降级方法

3.1.3、在启动类加上注解

@EnableHystrix

3.2、消费端降级

3.2.1、修改pom.xml配置依赖

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

3.2.2、修改application.yml配置

hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 3000

3.2.3、在消费端方法上添加代码

@HystrixCommand(fallbackMethod = "fallbackMethod")

3.2.4、在消费端启动类上加上注解

@EnableHystrix

3.3、全局降级

@RestController
@RequestMapping("/user")
@DefaultProperties(defaultFallback = "globalFallback")
@Slf4j
public class UserConsumer {
	@GetMapping("/userInfoList")
	@HystrixCommand
	public List<UserInfo> userInfoList(){
	}
}

3.4、解耦降级

不管是业务方法指定的降级方法还是全局降级方法,它们都必须和业务方法在同一个类中才能生效,业务逻辑与降级逻辑耦合度极高。

3.4.1、修改application.yml

feign:
#  hystrix:
#    enabled: true
  circuitbreaker:
    enabled: true

3.4.2、在方法上修改

@FeignClient(value = "USER-SERVICE",fallback = UserServiceFallBack.class)
public class UserServiceFallBack implements UserService{

3.5、服务熔断

熔断机制是为了应对雪崩效应而出现的一种微服务链路保护机制。
在熔断机制中涉及了三种熔断状态:

  • 熔断关闭状态(Closed):当服务访问正常时,熔断器处于关闭状态,服务调用方可以正常地对服务进行调用。
  • 熔断开启状态(Open):默认情况下,在固定时间内接口调用出错比率达到一个阈值(例如 50%),熔断器会进入熔断开启状态。进入熔断状态后,后续对该服务的调用都会被切断,熔断器会执行本地的降级(FallBack)方法。
  • 半熔断状态(Half-Open): 在熔断开启一段时间之后,熔断器会进入半熔断状态。在半熔断状态下,熔断器会尝试恢复服务调用方对服务的调用,允许部分请求调用该服务,并监控其调用成功率。如果成功率达到预期,则说明服务已恢复正常,熔断器进入关闭状态;如果成功率仍旧很低,则重新进入熔断开启状态。
    在这里插入图片描述

3.5.1、Hystrix 实现服务熔断的步骤

  • 当服务的调用出错率达到或超过 Hystix 规定的比率(默认为 50%)后,熔断器进入熔断开启状态。
  • 熔断器进入熔断开启状态后,Hystrix 会启动一个休眠时间窗,在这个时间窗内,该服务的降级逻辑会临时充当业务主逻辑,而原来的业务主逻辑不可用。
  • 当有请求再次调用该服务时,会直接调用降级逻辑快速地返回失败响应,以避免系统雪崩。
  • 当休眠时间窗到期后,Hystrix 会进入半熔断转态,允许部分请求对服务原来的主业务逻辑进行调用,并监控其调用成功率。
  • 如果调用成功率达到预期,则说明服务已恢复正常,Hystrix 进入熔断关闭状态,服务原来的主业务逻辑恢复;否则 Hystrix 重新进入熔断开启状态,休眠时间窗口重新计时,继续重复第 2 到第 5 步。
参数描述
metrics.rollingStats.timeInMilliseconds统计时间窗。
circuitBreaker.sleepWindowInMilliseconds休眠时间窗,熔断开启状态持续一段时间后,熔断器会自动进入半熔断状态,这段时间就被称为休眠窗口期。
circuitBreaker.requestVolumeThreshold请求总数阀值。

在统计时间窗内,请求总数必须到达一定的数量级,Hystrix 才可能会将熔断器打开进入熔断开启转态,而这个请求数量级就是 请求总数阀值。Hystrix 请求总数阈值默认为 20,这就意味着在统计时间窗内,如果服务调用次数不足 20 次,即使所有的请求都调用出错,熔断器也不会打开。
circuitBreaker.errorThresholdPercentage错误百分比阈值。

当请求总数在统计时间窗内超过了请求总数阀值,且请求调用出错率超过一定的比例,熔断器才会打开进入熔断开启转态,而这个比例就是错误百分比阈值。错误百分比阈值设置为 50,就表示错误百分比为 50%,如果服务发生了 30 次调用,其中有 15 次发生了错误,即超过了 50% 的错误百分比,这时候将熔断器就会打开。

3.5.2、实例

@HystrixCommand(fallbackMethod = "paymentCircuitBreaker_fallback",commandProperties = {
        @HystrixProperty(name = "circuitBreaker.enabled",value = "true"),// 是否开启断路器
        @HystrixProperty(name = "metrics.rollingStats.timeInMilliseconds",value = "10000")//时间窗口10秒
        @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold",value = "10"),// 请求次数
        @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value = "30000"), // 时间窗口期
        @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value = "60"),// 失败率达到多少后跳闸
})
public interface UserService {
    public String paymentCircuitBreaker(@PathVariable("id") Integer id);
}
@Service
public class UserServiceImpl implements UserService {
    @Override
    @HystrixCommand(fallbackMethod = "paymentCircuitBreakerFallback",commandProperties = {
            @HystrixProperty(name = "circuitBreaker.enabled",value = "true"),// 是否开启断路器
            @HystrixProperty(name = HystrixPropertiesManager.METRICS_ROLLING_STATS_TIME_IN_MILLISECONDS,value = "10000"),
            @HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_REQUEST_VOLUME_THRESHOLD,value = "10"),// 请求次数
            @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value = "30000"), // 时间窗口期
            @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value = "60"),// 失败率达到多少后跳闸
    })
    public String paymentCircuitBreaker(Integer id) {
        if(id < 0)        {
            throw new RuntimeException("******id 不能负数");
        }
        String serialNumber = UUID.randomUUID().toString();
        return Thread.currentThread().getName()+"\t"+"调用成功,流水号: " + serialNumber;
    }
    
    public String paymentCircuitBreakerFallback(@PathVariable("id") Integer id) {
        return "id 不能负数,请稍后再试,/(ㄒoㄒ)/~~   id: " +id;
    }
}

总结

Hystrix是Netflix开源的一个用于处理分布式系统的延迟和容错的库,通过资源隔离、服务降级和熔断等方法,提高分布式系统的可用性和稳定性。在本章节中, 介绍了Hystrix具体方法上熔断、全局熔断案例,通过实战演练让大家更容易理解Hystrix断路器的作用。

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

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

相关文章

es elasticsearch 基础

es https://www.elastic.co/guide/en/elasticsearch/reference/6.8/getting-started.html 倒排索引&#xff1a; 正排–>从目录到文章内容 倒排–>内容到目录文章标题 if we dont need full text search ,we dont need to create 倒排 using text type 分词&#xff1a…

优雅而高效的JavaScript——解构赋值

&#x1f643;博主&#xff1a;小猫娃来啦 &#x1f643;文章核心&#xff1a;优雅而高效的JavaScript——解构赋值 文章目录 什么是解构赋值数组解构赋值基本用法默认值剩余参数 对象解构赋值基本用法默认值剩余参数 解构赋值的优势和应用场景代码简化和可读性提高交换变量值函…

硬件基本功--过流、过压保护电路

1.简介 过流保护(OCP)&#xff1a;当电路电流超过预定最大值时&#xff0c;使保护装置动作的一种保护方式。不允许超过预定最大值电流&#xff0c;不然会烧坏电路的器件。过压保护(OVP)&#xff1a;被保护电路电压超过预定的最大值时&#xff0c;使电源断开或使受控设备电压降低…

企业如何实现财务无纸化?票档一体化建设势在必行

随着“大智移云物区”等信息技术的发展&#xff0c;传统的财务管理开始向信息化、数字化转型&#xff0c;电子发票、电子凭证也逐渐取代传统的纸质档案资料&#xff0c;促使企业转型升级并逐步实现财务无纸化&#xff0c;助力降本增效。 同时&#xff0c;在政策强力推动下&…

【赠书活动】如何提高C++代码的性能

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

C++QT-day5

#include <iostream> //多继承using namespace std;class Sofa { private:string sitting; public:Sofa(){cout << "Sofa无参构造函数" << endl;}Sofa(string sitting):sitting(sitting){cout << "Sofa有参构造函数" << …

数据可视化——ucharts的使用

目录 1.引入 uCharts插件 2.使用组件 3.修改默认渲染数据的内容 1.修改柱状图上面渲染的内容 2.修改点击展示的内容 1.修改展示内容 2.自定义展示内容 4.修改其他设置查看官方文档 官网地址&#xff1a;uCharts官网 - 秋云uCharts跨平台图表库 uCharts是一款基于canvas API…

线性数据结构集会

目录 序言 一、数组 数组的优点 数组的缺点 数组的适用场景 二、链表 链表的优点 链表的缺点 链表的使用场景 链表的种类 Java单向链表的实现 三、队列 队列的特点 四、栈 栈的特点 栈的适用场景 五、时间复杂度简述 序言 线性数据结构是一种将数据元素以线性…

C语言,洛谷题:你的飞碟在这

文中要把字母A对应到1&#xff0c;Z对应到26&#xff0c;这时候就要用上ASCII表了。A对应的ASCII码值是65&#xff0c;要让A对应1&#xff0c;只要将A减去64&#xff0c;后面的字母也是一样的只要减去64&#xff0c;就能对应其26字母中的顺序。 要存储字符串对应的每个元素的数…

计算机毕业设计选什么题目好?springboot 学生考勤管理系统

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

Java实验一 Java语言基础(12题)

文章目录&#xff1a; 1、我国历法中的天干、地支和生肖的排列是有规律的。天干的顺序是“甲乙丙丁戊己庚辛壬癸”&#xff0c;地支的顺序是“子丑寅卯辰巳午未申酉戌亥”&#xff0c;生肖的顺序是“鼠牛虎兔龙蛇马羊猴鸡狗猪”。天干、地支、生肖的计算方法非常简单&#xff…

Etsy玩家必看之7个运营技巧

2023年跨境电商行业趋势愈发旺盛&#xff0c;目前正处于红利期&#xff0c;而作为近年来的电商网红“Etsy”&#xff0c;以其低成本低竞争高回报的优势吸引了大批的跨境电商玩家。但仅仅入驻照搬其他平台经验很难出单&#xff0c;如果你正烦恼这个问题&#xff0c;那么接下来的…

软件测试学习(一)基础概念、实质、说明书测试、分类、动态黑盒测试

软件测试概念、背景 软件无处不在。然而&#xff0c;软件是人写的一所以不完美。 世界上有完美的软件吗&#xff1f;NO 世界上没有完美的软件。所有软件都可能存在缺陷、错误或漏洞&#xff0c;无论是操作系统、应用程序、游戏还是其他类型的软件。这些问题可能会导致功能问题…

1.软件开发-HTML结构-元素剖析

元素的嵌套 代码注释 ctrl/ URL url 统一资源定位符 一个给定的独特资源在web上的地址 URI

那些年,我们一起发现的Bug

一、背景 在这篇文章中&#xff0c;分享一些自己在工作中或别人发现的一些常见Bug&#xff0c;与大家共同成长~ 二、常见Bug分类 1、前后命名不一致 举个例子 接口入参中的名称是&#xff1a;aslrboot Java代码中使用的名称是&#xff1a;aslrBoot Codis中存储的名称是&…

LCD简介

lcd简介 LCD简介1、分辨率2、像素格式3、LCD时间参数4、RGB LCD屏幕时序6、像素时钟 此文章摘抄于正点原子的嵌入式linux驱动开发指南&#xff0c;仅作为笔记&#xff0c;以放便忘记时查阅 LCD简介 LCD全称是Liquid Crystal Display,也就是液晶显示器&#xff0c;其显示的基本原…

机器人的组成

机器人是一个机电一体化的设备&#xff0c;从控制的角度来看&#xff0c;机器人系统可以分成四大部分&#xff0c;即执行机构、驱动系统、传感系统和控制系统. 各部分之间的控制关系如下图所示。 执行机构 执行机构是直接面向工作对象的机械装置&#xff0c;相当于人体的手和脚…

3年测试经验,测试用例应该达到这个水平才合格

状态迁移法主要关注在测试状态转移的正确性上面。对于一个有限状态机&#xff0c;通过测试验证其在给定的条件内是否能够产生需要的状态变化&#xff0c;有没有不可达的状态和非法的状态&#xff0c;是否可能产生非法的状态转移等。通过构造能导致状态迁移的事件&#xff0c;来…

力扣-2512.奖励最顶尖的k名学生

Idea 记录caibi学习的第n天&#xff0c;这道题折磨了我两个多小时&#xff0c;终于用自己的思路ac了 大佬建议参考官方题解思路 用一个map记录学生id及其得分情况 用两个set存放 正面词汇集和负面词汇集 遍历report&#xff0c;然后获取每一个单词&#xff0c;跟两个set进行查找…

二叉树链式结构的遍历访问——前中后序

最开始接触树的时候&#xff0c;因为并不是二叉树&#xff0c;所以我们并不知道一个节点最多有几个度&#xff0c;所以我们要用链表来实现树的话就需要用孩子兄弟法 然后我们认识了完全二叉树&#xff0c;因为它是从左到右都满的二叉树&#xff0c;所以我们可以用顺序表&#…