SpringCloud之组件Hystrix简介

news2025/3/11 0:36:10

 服务雪崩介绍

服务提供者不可用导致服务调用者也跟着不可用,以此类推引起整个链路中的所有微服务都不可用,

服务提供者A因为某种原因出现故障,那么服务调用者服务B依赖于服务A的请求便无法成功调用其提供的接口,假以时日依赖于服务A的请求越来越多导致服务B的Tomcat资源耗尽,造成服务B线程阻塞,导致服务B也出现故障。那么假如服务C依赖于服务B由于服务B也出现了故障导致服务C出现故障。以此类推引起整个链路中的所有微服务都不可用。

① 理解:

② 解决

将超时时间缩短(不可取)

优点:

  • 简单

缺点:

  • 有的服务超时时间都是提前预定好的

  • 在一些服务中可以会大量的代码或者连接DB等,这时连接时间如果如果不够代码的执行时间,那么一个正常的业务也无法执行完

设置拦截器

概述

在微服务中可以解决服务雪崩,称为熔断器或者断路器。能够防止分布式项目中出现联动故障(一个服务宕机,其他服务也无法正常运行)。

Hystrix中设置了类似拦截器的方案,如果需要调用的服务发生了宕机,那么就不调用这台机器,直接使用备选方案

使用

① rent-car-service

配置文件

server:
  port: 8080
spring:
  application:
    name: rent-car-service
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka
  instance:
    hostname: localhost
    instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port}
    lease-renewal-interval-in-seconds: 5

API:

@RestController
public class CarController {

    @GetMapping("rent")
    public String rent(){
        return "租车成功";
    }
}

② conusmer-service

hystrix依赖

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

配置文件

server:
  port: 8081
spring:
  application:
    name: consumer-service
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka
  instance:
    hostname: localhost
    instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port}
    lease-renewal-interval-in-seconds: 5

OpenFeign接口

@FeignClient(value = "rent-car-service",fallback = ConsumerRentCarFeignHystrix.class) // 指定发生服务雪崩时执行哪个类
public interface ConsumerRentCarFeign {

    @GetMapping("rent")
    String rent();
}

Hystrix实现类

@Component // 添加到IOC容器中
public class ConsumerRentCarFeignHystrix implements ConsumerRentCarFeign {

    /**
     * 备用方案
     * 当调用的服务挂掉后执行本方法
     * @return
     */
    @Override
    public String rent() {
        return "网络异常 稍后重试";
    }
}

API

@RestController
public class ConsumerController {

    @Autowired
    private ConsumerRentCarFeign consumerRentCarFeign;

    @GetMapping("consumerToRent")
    public String consumerToRent(){
        System.out.println("有人来租车");
        return consumerRentCarFeign.rent();
    }
}

开启Hystrix

feign:
  hystrix:
    enabled: true

断路器思想

常用配置

hystrix: #hystrix 的全局控制
  command:
    default: #default 是全局控制,也可以换成单个方法控制,把 default 换成方法名即可
      fallback:
        isolation:
          semaphore:
            maxConcurrentRequests: 1000 #信号量隔离级别最大并发数
      circuitBreaker:
        enabled: true #开启断路器
        requestVolumeThreshold: 3 #失败次数(阀值)
        sleepWindowInMilliseconds: 20000 #窗口时间
        errorThresholdPercentage: 60 #失败率
      execution:
        isolation:
          Strategy: thread #隔离方式 thread 线程隔离集合和 SEMAPHORE 信号量隔离
        thread:
          timeoutInMilliseconds: 3000 #调用超时时长

 相关面试题

什么是 Hystrix?

防雪崩利器,具备服务降级,服务熔断, 依赖隔离, 监控(Hstrix Dashboard)等功能

什么是服务熔断?熔断器的作用是什么?

首先我们说一下什么是扇出与雪崩效应:多个微服务之间调用的时候,假设微服

务 A 调用了微服务 B 和微服务 C,微服务 B 和微服务 C 又调用了其他的服务,这

就是所谓的扇出,如果扇出的链路上某个微服务的调用响应时间过长,或者是不

可用,那么该微服务调用者就会阻塞线程,占用越来越多的系统资源,进而崩溃。

同理,影响调用者的调用者,进而一步步崩溃,这也就是所谓的雪崩效应。

那么服务熔断机制就是应对雪崩效应的一种微服务链路保护机制,扇出链路

的某个微服务不可用,或者是响应时间过长,会进行服务的降级,进而会熔断该

节点微服务的调用,快速返回错误的响应信息,当检测到该节点微服务调用响应

正常的时候,恢复链路。在 SpringCloud 框架里熔断机制是通过 Hystrix 实现的。

Hystrix 会搞很多个小的线程池比如订单服务请求库存服务是一个线程池,

请求仓储服务是一个线程池,请求积分服务是一个线程池。每个线程池里的线程

仅仅用于请求那个服务,当某个线程池达到阈值时,就会启动服务熔断,服务降

级。如果其他请求继续访问,就直接返回 fallback 的默认值。

什么是服务降级?

服务熔断的时候,在返回的之前做一个熔断处理,比如将请求信息存储到数

据库以便后期数据恢复,我认为这种熔断后的处理指的就是服务降级。优先核心

服务,非核心服务不可用或弱可用。

服务降级案例:双十一:《哎哟喂,被挤爆了.…》或 app 秒杀:《网络开小差

了,请稍后再试…》

在 fallbackMethod (回退函数)中具体实现降级逻辑。

熔断和降级:调用服务失败后快速失败

  • 熔断:是为了防止异常不扩散,保证系统的稳定性

  • 降级:编写好调用失败的补救逻辑,然后对服务直接停止运行,这样这些接口就无法正常调用,但又不至于直接报错,只是服务水平下降

  • 通过HystrixCommand 或者 HystrixObservableCommand 将所有的外部系统(或者称为依赖)包装起来,整个包装对象是单独运行在一个线程之中(这是典型的命令模式)。

  • 超时请求应该超过你定义的阈值

  • 为每个依赖关系维护一个小的线程池(或信号量);如果它变满了,那么依赖关系的请求将立即被拒绝,而不是排队等待

  • 统计成功,失败(由客户端抛出的异常),超时和线程拒绝

  • 打开断路器可以在一段时间内停止对特性服务的所有请求,如果服务的错误百分比通过阈值,手动或自动的关闭断路器。

  • 当请求被拒绝、连接超时或者断路器打开,直接执行 fallback 逻辑。

  • 近乎实时监控指标和配置变化。

Hystrix如何避免雪崩效应的?

首先要避免雪崩效应的形成 需要一个强大的容错机制,Hystrix 就是实现了超时机制和断路器模式的工具类库
Hystrix主要通过以下几点实现延迟和容错:
包裹请求: 使用HystrixCOmmand 包裹对依赖的调用逻辑,每个命令在独立线程中执行.使用了设计模式种的"命令模式"
跳闸机制: 当服务的错误率超过了一定的阈值时,Hystrix 可以自动或者手动跳闸,停止请求服务一段时间
资源隔离: Hystrix 为每个依赖维护一个小型的线程池或者是信号量,如果该线程吃已满,发送到该依赖的请求立即被拒绝,而不是排队等候,从而加速失败判定.
监控: Hystrix可以近乎实时的监控运行指标和配置的变化,列如 成功,失败,超时和被拒绝的请求等.
回退机制: 当请求失败,超时,被拒绝,或者当断路器打开的时候,执行回退逻辑.回退逻辑由自行提供,列入返回一个缺省值
自我修复: 断路器打开一段时间后 ,会自动进入"半开状态",尝试请求服务,请求通过恢复请求,请求失败则继续断路器开启

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

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

相关文章

电子表格软件能解决什么问题?

在当下的时代&#xff0c;全球经济非常活跃&#xff0c;对于企业来说&#xff0c;经营的成果需要“用数字说话”——以数字来反映经营管理的的状况&#xff0c;这些都离不开报表&#xff0c;可以说报表的需求是无处不在的。 在企业所有的科技类项目中报表是最基本的功能。作为…

第二章:uniapp整合axios之真机测试两问题

第二章&#xff1a;uniapp整合axios之真机测试两问题 上一章节&#xff0c;笔者编写了uniapp整合axios并实现前后端跨域请求的方案&#xff0c;完成了这些基本配置后&#xff0c;在浏览器端的测试基本是可以完成了&#xff0c;但是当笔者将程序运行到手机时&#xff0c;却出现…

4个 Python 库来美化你的 Matplotlib 图表

Matplotlib是一个被广泛使用的Python数据可视化库&#xff0c;相信很多人都使用过。 但是有时候总会觉得&#xff0c;Matplotlib做出来的图表不是很好看、不美观。 今天我就给大家分享四个美化Matplotlib图表的Python库&#xff0c;它们可以轻松让你的Matplotlib图表变得好看…

fastjson 反序列化之mysql JDBC 利用

前言&#xff1a; 在打春秋云境Exchange 靶场时&#xff0c;入口点是华夏ERP 2.3版本系统&#xff0c;存在fastjson 反序列化漏洞&#xff0c;在尝试常见的fastjson利用链反弹shell都没有反应&#xff0c;最终使用mysql JDBC利用链反弹shell成功。在此记录一下。 复现本地靶场…

QT安装mysql驱动和使用ODBC连接mysql

文章目录 QT安装mysql驱动和使用ODBC连接mysql使用驱动连接mysql编译mysql驱动连接mysql 使用ODBC连接mysql QT安装mysql驱动和使用ODBC连接mysql 上一篇博文中提到了mysql的使用&#xff0c;但是很多人在使用新版Qt连接mysql的时候出现连接不上或者是没有mysql驱动的问题&…

不懂就问,Milvus 新上线的资源组功能到底怎么样?

在近期更新的 Milvus 2.x 版本中&#xff0c;我们上线了在社区中呼声一直很高的【资源组功能】。有了这个功能&#xff0c;用户再也不需要“为每个 collection 部署一套 Milvus 服务”的方案&#xff0c;轻松实现对 Query Node 资源进行分组管理&#xff0c;达到物理资源隔离的…

【C++】STL中的容器适配器 stack queue 和 priority_queue 的模拟实现

STL中的容器适配器 一、容器适配器1、什么是容器适配器2、STL标准库中的容器适配器 二、stack的模拟实现1、stack的简单介绍2、栈的模拟实现 三、queue的模拟实现1、queue的简单介绍2、queue的模拟实现 四、priority_queue的模拟实现1、priority_queue的简单介绍2、priority_qu…

家用洗地机哪款好用?好用的洗地机分享

要说现在家居清洁用什么单品更省心&#xff0c;洗地机必须要算一项。虽然这在国际上也不是什么新鲜的概念了&#xff0c;但是在国内兴起也只是这几年的事&#xff0c;关于家用洗地机什么牌子最好之类的问题也是很多人都比较关心的问题。我个人也是不喜欢做家务的&#xff0c;家…

Anaconda及其他说明及安装

来自神秘人的投稿&#xff01; 以下内容来源于官方视频说明&#xff1a;Anaconda Distribution versus Miniconda和其他整理与添加。 一、基础信息了解 1. 什么是Anaconda Anaconda Distribution&#xff1a;形象的比喻——一台笔记本电脑&#xff0c;一切都组装好了&#x…

利用用户生成内容来促进您的 WooCommerce 商店的销售

用户生成内容 (UGC) 是由对品牌或其产品和服务进行评论或评论的消费者创建的内容。它可以包括评论、照片、博客文章、推文或任何类型的社交媒体内容。 UGC 可以应品牌要求制作&#xff0c;也可以由产品用户独立制作。当用户生成的内容是独立制作的时候——比如一个新布加迪手…

UG NX二次开发(C#)-建模-移除特征参数

文章目录 1、前言2、在UG NX中的操作3、 利用UFun函数实现1、前言 UG NX建模方式是采用特征建模的,创建一个对象都是一个特征,这在历史记录中可以查看特征的建模历史、特征的参数已经特征之间的关联关系。有时为了设计的需要,需要去除特征之间的关联关系,那么就要移除特征…

【硬件外设使用】——ADC

【硬件外设使用】——ADC ADC基本概念ADC使用方法pyb.adcmachine.adc ADC可用的传感器 ADC基本概念 ADC是模拟数字转换器&#xff08;Analog-to-Digital Converter&#xff09;的缩写&#xff0c;它是一种将模拟信号转换成数字信号的电子元件。 ADC广泛用于测量和监测领域&…

sggJava基础第四天

1 分支结构 分支结构 根据条件&#xff0c;选择性地执行某段代码。 有if…else和switch-case两种分支语句。 概述 顺序结构的程序虽然能解决计算、输出等问题 但不能做判断再选择。对于要先做判断再选择的问题就要使用分支结构 if…else形式 单分支结构 代码实现 …

leetcode160. 相交链表

给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据 保证 整个链式结构中不存在环。 注意&#xff0c;函数返回结果后&…

把脉分布式事务的模型、协议和方案

在当前的技术发展阶段&#xff0c;不同的业务场景对一致性、可靠性、易用性、性能等要求不同&#xff0c;应用架构可以根据实际场景的需求&#xff0c;灵活选择合适的分布式事务解决方案。行业中把分布式事务解决方案分为刚性事务方案和柔性事务方案这两大类。 就刚性事务这个…

leetcode328. 奇偶链表

给定单链表的头节点 head &#xff0c;将所有索引为奇数的节点和索引为偶数的节点分别组合在一起&#xff0c;然后返回重新排序的列表。 第一个节点的索引被认为是 奇数 &#xff0c; 第二个节点的索引为 偶数 &#xff0c;以此类推。 请注意&#xff0c;偶数组和奇数组内部的相…

CentOS 7安装GitLab、创建用户、创建Repo、拉取推送

效果图 前言 gitlab全球出名&#xff0c;包含免费的社区版CE、收费的企业版EE&#xff0c;在国内安装速度一般&#xff1b; gitlab极狐版是中国特供版&#xff0c;用起来就跟CE一样&#xff0c;推荐国内使用~ 实现步骤 - 安装&配置 先准备好gitlab服务对外的访问地址&am…

技术分享 | MySQL级联复制下进行大表的字段扩容

作者&#xff1a;雷文霆 爱可生华东交付服务部 DBA 成员&#xff0c;主要负责Mysql故障处理及相关技术支持。爱好看书&#xff0c;电影。座右铭&#xff0c;每一个不曾起舞的日子&#xff0c;都是对生命的辜负。 本文来源&#xff1a;原创投稿 *爱可生开源社区出品&#xff0c;…

使用Vite工具构建OpenLayers应用

vite作为最近大火的前端构建工具,吸引了大批开发者和工具框架作者的关注。vite自称为下一代的构建工具,这是要取代webpack的节奏啊。openlayers最新版本的案例代码就使用了vite来构建,因此这一篇文章我们来给大家示范一下如何使用vite来构建一个基于openlayers的应用。 首先…

从「搭子」文化,看融云如何助力垂类社交应用增长

互联网人拜佛 be like &#x1f446;&#xff0c;主打的就是一个垂直和精准。关注【融云全球互联网通信云】了解更多 其实&#xff0c;这也是年轻人的交友现状。最近随着大学生“特种兵式”旅游出圈的“搭子”友情&#xff0c;就是这样。 “搭子”&#xff0c;AKA 垂直细分领…