Hystrix熔断器

news2025/1/10 2:53:01

雪崩 

        当山坡积雪内部的内聚力抗拒不了它所受到的重力拉引时,积雪便向下滑动,引起⼤量雪体崩塌,人们把这种自然现象称作雪崩
        微服务中,一个请求可能需要多个微服务接口才能实现,会形成复杂的调用链路
        服务雪崩效应,是一种因“服务提供者的不可用”(原因)导致“服务调用者不可用”(结果),并将不可用逐渐放大的现象
                扇入:代表着该微服务被调用的次数,扇人大,说明该模块复用性好
                扇出:该微服务调用其他微服务的个数,扇出大,说明业务逻辑复杂
                扇入大是一个好事,扇出大不一定是好事
        服务雪崩效应形成原因
                1. 服务提供者不可用(硬件故障,程序BUG,缓存击穿,用户大量请求)
                2. 重试加大请求流量(用户重试,代码逻辑重试)
                3. 服务调用者不可用(同步等待造成的资源耗尽)
        服务雪崩效应解决方案
              1.  服务熔断:当扇出链路的某个微服务不可用或者响应时间太长时,熔断该节点微服务的调用,进行服务的降级,快速返回错误的响应信息。当检测到该节点微服务调用响应正常后,恢复调用链路(和服务降级一起使用,重点在"断",切断对下游服务的调用)
              2. 服务降级:把无关紧要的服务关掉,留给目前处于高峰的服务,每个服务都要在关停掉后能给用户返回一个默认值
              3.服务限流:在一次性有大多数用户涌入时,限制用户的数量,均速的放行用户
                        1).限制总并发数(如数据库连接池、线程池)
                        2).限制瞬时并发数(如Nginx限制瞬时并发连接数)
                        3).限制时间窗口内的平均速率(如Guava的RateLimiter、Nginx的limit_req模块,限制每秒的平均速率)
                        4).限制远程接口调用速率、限制MQ的消费速率等

Hystrix

        Hystrix:由Netfix开源的一个延迟和容错库,用于隔离访问远程系统,服务或者第三方库,防止级联失败,从而提升系统的可用性和容错性
        包裹请求:使用HystrixCommand包裹对依赖的调用逻辑。页面静态化微服务方法(@HystrixCommand添加Hystrix控制)。
        跳闸机制:当某服务的错误率超过一定的阈值时,Hystrix可以跳闸,停止请求该服务一段时间。 
        资源隔离:Hystrix为每个依赖都维护了一个小型的线程池(舱壁模式)。如果该线程池已满,发往该依赖的请求就被立即拒绝,而不是排队等待,从而加速失败判定。
        监控:Hystrix可以近乎实时地监控运行指标和配置的变化,例如成功、失败、超时、以及被拒绝的请求等
        回退机制:当请求失败、超时、被拒绝,或当断路器打开时,执行回退逻辑。回退逻辑由开发人员自行提供,例如返回一个缺省值。
        自我修复:断路器打开一段时间后,会自动进入“半开”状态(探测服务是否可用,如还是不可用, 再次退回打开状态) .

Hystrix应用

          1.在page微服务中导图熔断器的依赖

        <!-- 熔断器Hystrix -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>

        2.在page的启动类上启动熔断器

@EnableCircuitBreaker//开启Hystrix熔断器功能

         3.在page控制层,设置获取端口接口的熔断

    //如果服务提供者请求等待时间过长,服务消费方通过Hytrix来控制
    @HystrixCommand(
            threadPoolKey = "queryById",//线程池标识配置,默认情况下所有的请求共同维护一个线程池
            threadPoolProperties = {//配置线程的详细内容
                    @HystrixProperty(name = "coreSize",value = "2"),//核心线程为2
                    @HystrixProperty(name = "maxQueueSize",value = "20")//等待队列的最大长度
            },
            commandProperties = {//配置熔断器的属性信息
                    @HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value = "2000")//设置请求的超时时间(ms),一旦超过配置的时间会触发Hystrix的处理机制
            }
    )
    //获取服务的端口号
    @RequestMapping("queryPort")
    public String queryProductServerPort(){
       String url="http://leq-service-product/server/getPort";
      return restTemplate.getForObject(url,String.class);
    }

        4.为了演示熔断我们需要手动创建一个错误,在product900中的获取端口的接口中让线程睡眠5秒

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("server")
public class ServerConfigController {
    @Value("${server.port}")
    private String serverprot;

    @RequestMapping("getPort")
    public String findServerPort(){
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return serverprot;
    }
}

        5.重启page和product的项目,eureka集群之后启动,重启后在浏览器访问该接口

http://localhost:9100/page/queryPort

 

         可以看到一个正常一个又queryProductServerPort timed-out这个错误,说明我们的熔断配置成功,接下来就将该错误改为一个返回值就好

        6自定义服务不可用时返回默认数据(降级处理)        

                fallbackMethod = "" 如果对应的服务提供者出现问题,则会调用fallbackMethod属性指向的方法,将该方法的返回值作为最终响应给客户端的数据,该方法和目标方法的格式(返回值,参数)一致    

public String fallbackMethodgetPort(){
        return "-1";
    }

         7.重启page的微服务项目,重新访问上面的端口

         可以看到异常已经改为我们自定义的返回值

 

Hystrix舱壁模式:

        如果不进行任何设置,所有熔断方法使用一个Hystrix线程池(10个线程),那么这样的话会导致问题,这个问题并不是扇出链路微服务不可用导致的,而是我们的线程机制导致的,如果方法A的请求把10个线程都用了,方法B请求处理的时候压根都没法被访问,因为没有线程可用,并不是方法B服务不可用。为了避免服务请求过多导致正常服务无法访问的问题,Hystrix不是采用增加线程数,而是单独的为每一个控制方法创建一个线程池的方式,这种模式叫做“舱壁模式”,也是线程隔离的手段

Hystrix工作流程与高级应用

        Hystrix的工作流程图:

             1.在调用出现问题时,开启一个时间窗
             2.在这个时间窗内,统计调用次数是否达到最小请求数
             如 果没有达到,则重置统计信息,回到第1步。
             如果达到了,则统计失败的请求数占所有请求数的百分比,是否达到阈值。
                     (1)如果达到,则跳闸(不再请求对应服务)。
                     (2)如果没有达到,则重置统计信息,回到第1步。
             3.如果跳闸,则会开启一个活动窗口(默认5S),每隔5秒,Hystrix会让一个请求通过,到达那个问题服务,看是否调用成功?如果成功,重置断路器回到第1步;如果失败,回到第3步

        高级应用

                1.注解在@HystrixCommand下的commandProperties里面进行配置

 


             //Hystrix高级配置,定制工作过程细节
  @HystrixProperty(name="metrics.rollingStats.timeInMilliseconds",value = "8000"),//时间窗口的时长
  @HystrixProperty(name="circuitBreaker.requestVolumeThreshold",value = "2"),//时间窗口内的最小请求数
  @HystrixProperty(name="circuitBreaker.errorThresholdPercentage",value = "50"),//错误数量的百分比阈值
  @HystrixProperty(name="circuitBreaker.sleepWindowInMilliseconds",value = "3000")//自我修复时的活动窗口长度

           配置完成后重启,只要我们之前的业务没影响就证明配置成功

 

         

         2.将注解注释掉,确保是配置文件生效        在核心配置文件中配置(熔断器)

#时间窗口的时长
hystrix.command.default.metrics.rollingStats.timeInMilliseconds=8000
#强制打开熔断器
hystrix.command.default.circuitBreaker.forceOpen= false
#触发熔断错误比例阈值,默认值50%
hystrix.command.default.circuitBreaker.errorThresholdPercentage= 50
#熔断后休眠时间,默认值5秒
hystrix.command.default.circuitBreaker.sleepWindowInMilliseconds= 3000
#熔断触发最大请求次数,默认值是20
hystrix.command.default.circuitBreaker.requestVolumeThreshold= 2
#熔断超时设置,默认为1秒
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds= 2000

        在核心配置文件中配置(暴露接口)application.properties

#SpringBoot中暴露健康检查等断点接口
#management.endpoints.web.exposure.include="*"
#暴露健康接口的细节
management.endpoint.health.show-details=always

        不知道为什么我的SpringBoot中暴露健康检查等断点接口在application.properties中无法使用,只能在yml文件中生效

# Spring Boot中暴露健康检查等断点接口
management:
  endpoints:
    web:
      exposure:
        include: "*"

          在核心配置文件中配置(配置线程池)application.properties

#配置线程池队列
#并发执行的最大线程数
hystrix.threadpool.default.coreSize=10
#队列的最大存储数量
hystrix.threadpool.default.maxQueueSize=1500
#队列的最大请求数量
hystrix.threadpool.default.queueSizeRejectionThreshold=800

        配置完成后重启page的微服务项目,访问原来的接口也都有使用,然后我们配置了暴露接口,可以通过autuator/health来访问,通过这个接口来监控服务中心的健康状况

http://localhost:9100/actuator/health

 

 

 

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

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

相关文章

在Linux下通过MySQL二进制包安装MySQL5.7

在Linux下通过通用压缩包安装MySQL5.7 卸载MySQL 如果是第一次安装MySQL&#xff0c;在安装MySQL前&#xff0c;知道如何卸载MySQL是很有必要的。因为在安装过程中可能会 遇到各种各样的问题&#xff0c;自己玩的话 卸载重装即可。 1. find / -name mysql 查看MySQL相关包…

Layui之动态树 左侧树形菜单栏 详细全面

⭐ฅʕ•̫͡•ʔฅ本期看点&#xff1a;该篇是运用Layui框架来编写后台树形菜单栏&#xff0c;并且结合MySql来编写完成 目录 一.效果图 二.具体步骤 2.1 数据库 2.2 树形导航栏 第一个类&#xff1a;Treevo 第二个类&#xff1a;BuildTree&#xff1a; 2.3 Dao方法 2.3.…

【自我提升】Spring Data JPA之Specification动态查询详解

写在前面&#xff1a;刷完Spring Data JPA的课后&#xff0c;发现Specification动态查询还挺有意思的&#xff0c;还应用到了规约设计模式&#xff0c;在此记录下学习过程和见解。 目录 一、应用场景 二、源码解析 三、规约模式 四、实际应用 一、应用场景 1. 简介 有时我…

Linux中安装Tomcat

前提条件&#xff1a; 虚拟机中已经提前安装好jdk1.8。 安装步骤&#xff1a; 1.下载安装包 首先去Apache官网下载&#xff08;Apache Tomcat - Apache Tomcat 9 Software Downloads&#xff09; 2.上传到 linux 中&#xff0c;我这里上传的目录是&#xff1a; /opt 3. 解压…

element-plus坑总结

reactive和ref对比 // 定义变量 import { reactive } from vue; const person reactive({name: "John",age: 25, });// 赋值修改 person.name "Tom"; person.age 26;// 使用变量 <div>{{ person.name }}</div> <button click"perso…

layui介绍以及登录功能的实现

一. layui简介 1.1 layui介绍 Layui 是一套开源免费的 Web UI 组件库&#xff0c;采用自身轻量级模块化规范&#xff0c;遵循原生态的 HTML/CSS/JavaScript 开发模式&#xff0c;非常适合网页界面的快速构建。Layui 区别于一众主流的前端框架&#xff0c;它更多是面向于后端开…

3、Linux-进程管理类

进程管理类 进程是正在执行的一个程序或命令&#xff0c;每一个进程都是一个运行的实体&#xff0c;都有自己的地址空间&#xff0c;并占用一定的系统资源。 7.10.1 ps 查看当前系统进程状态 ps:process status 进程状态 1&#xff09;基本语法 ps aux | grep xxx &#xff08…

Python 导入引用其他文件的函数(持续更新)

文章目录 构造初始化文件结构&#xff0c;以此为例。【1】导入同目录且同级下其他文件的函数&#xff08;c.py文件导入d.py文件的函数&#xff09;&#xff08;1&#xff09;只引入d.py文件&#xff08;2&#xff09;直接引入函数&#xff08;3&#xff09;引入全部函数 【2】导…

docker服务启动过程分析

How docker.service start&#xff1f; just by ref 我们先了解docker的各个核心组件的介绍 runc&#xff1a;runc实现了容器的底层功能&#xff0c;例如创建、运行等。runc通过调用内核接口为容器创建和管理cgroup、namespace等Linux内核功能&#xff0c;来实现容器的核心特…

Spring5学习笔记--详细一文通

Spring5学习笔记--详细一文通 1 Spring 框架概述1.1 Spring 5 简述1.2 Spring5入门案例1.2.1 Spring5下载1.1.2 打开 idea 工具&#xff0c;创建普通 Java 工程1.2.3 导入 Spring5 相关 jar 包1.2.4 创建普通类&#xff0c;在这个类创建普通方法1.2.5 创建 Spring 配置文件&…

同时多项目多个node版本-比nvm好用的volta

一、node版本问题场景&#xff1a; 1、服务器上跑的多个node项目需要不同的node版本&#xff0c;且没条件上docker。 2、开发环境中多个项目需要node版本不同&#xff0c;且同时不止是一个项目在开发中&#xff0c;用了nvm进行node版本管理和切换&#xff0c;但是太麻烦。 二…

如何开发一款软件?

创建软件的步骤 1. 头脑风暴 创意生成是制作应用程序的第一步。考虑这个问题的最好方法是将你的应用想象成解决问题。 你自己的经历可以成为灵感的重要来源。试着想想你面临的问题&#xff0c;无论是软件和计算机&#xff0c;还是你的一般生活。很有可能&#xff0c;你面临的…

3DVR全景乡村振兴创新展示,助力数字化乡村建设

导语&#xff1a; 随着社会进步和科技发展&#xff0c;3D虚拟现实&#xff08;VR&#xff09;全景技术在乡村振兴领域展现出巨大的潜力和创新空间。通过结合3DVR全景技术和乡村振兴理念&#xff0c;我们可以为乡村带来全新的展示方式和体验&#xff0c;推动乡村振兴的进程。本…

MiniGPT4 在RTX-3090 Ubuntu服务器部署步骤详解

主要参考知乎帖子&#xff1a; MiniGPT-4 本地部署 RTX 3090 - 知乎 MiniGPT-4部署比麻烦&#xff0c;首先需要获取LLaMA权重&#xff0c;并结合Vicuna的bitwise XOR增量文件完成Vicuna模型权重生成&#xff0c;最后准备好预训练的MiniGPT-4进行模型部署。为了便于理解&#…

Photoshop简单案例(10)——利用PS修改证件照尺寸为1寸(或其他)

目录 一、项目介绍二、基本流程三、效果演示 一、项目介绍 本文介绍一下利用Photoshop修改证件照尺寸为1寸的方法。 二、基本流程 首先打开新建一个空白画布&#xff0c;设置画布宽度和高度分别为25mm和35mm&#xff0c;分辨率为300&#xff0c;背景颜色与证件照背景相同&am…

基于GPT4All的大型语言模型设计生态系统

GPT4All 一套专为强大、定制的大型语言模型设计的生态系统,能够在消费级CPU上本地运行。在GPT4All中,所使用的模型是一个3GB至8GB的文件,读者可以自行下载该文件,并将其插入到GPT4All的开源生态系统软件中。这一软件生态系统由Nomic AI提供支持并进行维护,其目的是确保系统…

04-树 (数据结构和算法)

4.1 树的基本概念 树&#xff08;Tree&#xff09;是n&#xff08;n>0&#xff09;个结点的有限集&#xff0c;它或为空树&#xff08;n 0&#xff09;&#xff1b;或为非空树&#xff0c;对于非空树 T&#xff1a; 有且只有一个称之为根的结点 除根节点以外的其他结点可…

随手笔记——关于齐次变换矩阵的理解

随手笔记——关于齐次变换矩阵的理解 说明符号坐标系表示&#xff08;coordinate representation&#xff09;坐标系变换&#xff08;coordinate transformation&#xff09;点的操作&#xff08;point operator&#xff09; 说明 齐次变换矩阵的几种解释&#xff0c; 主要从坐…

十大排序算法【原理】【步骤】【动图】【C++实现】

十大排序算法 排序算法可以分为内部排序和外部排序&#xff0c;内部排序是数据记录在内存中进行排序&#xff0c;而外部排序是因排序的数据很大&#xff0c;一次不能容纳全部的排序记录&#xff0c;在排序过程中需要访问外存。常见的内部排序算法有&#xff1a;插入排序、希尔…

【面试题32】include和require的区别及用法

文章目录 一、前言二 、include和require的区别三、include和require的用法介绍3.1 include的用法3.2 require的用法及示例 四、include和require的用法示例4.1 包含文件4.2 包含文件并将结果赋值给变量4.3 动态包含文件4.4 使用绝对路径包含文件4.5 包含文件失败处理4.6 包含文…