Hystrix熔断器

雪崩 

        当山坡积雪内部的内聚力抗拒不了它所受到的重力拉引时,积雪便向下滑动,引起⼤量雪体崩塌,人们把这种自然现象称作雪崩
        微服务中,一个请求可能需要多个微服务接口才能实现,会形成复杂的调用链路
        服务雪崩效应,是一种因“服务提供者的不可用”(原因)导致“服务调用者不可用”(结果),并将不可用逐渐放大的现象
                扇入:代表着该微服务被调用的次数,扇人大,说明该模块复用性好
                扇出:该微服务调用其他微服务的个数,扇出大,说明业务逻辑复杂
                扇入大是一个好事,扇出大不一定是好事
        服务雪崩效应形成原因
                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

 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Holoens证书过期

1. 删除Assets\WSATestCertificate.pfx证书文件。 2. 在Player Settings的Publishing Settings下找到Certificate,选择一个有效的证书。 3. 如果没有其他有效证书,需要生成一个新的测试证书: - Windows: MakeCert.exe -r -pe -n "CNTemporary Certificate" -ss MY …

Linux--操作系统进程的状态

【Linux】进程概念 —— 进程状态_linux d状态进程_Hello_World_213的博客-CSDN博客 新建&#xff1a;字面意思&#xff0c;将你的task_struct创建出来并且还未入队列 运行&#xff1a;task_struct结构体在运行队列中排队&#xff0c;就叫做运行态 阻塞&#xff1a; 等待非C…

GPT(Generative Pre-Training)论文解读及实现(一)

1 GPT Framework 1.1 Unsupervised pre-training Given an unsupervised corpus of tokens U {u1, . . . , un}, we use a standard language modeling objective to maximize the following likelihood: 在给定语料上下文环境下&#xff0c;目标时最大化下面的语言模型&…

OpenCV 图像处理算法和技术的应用实践

OpenCV 图像处理算法和技术的应用实践 导语一、图像滤波算法二、图像分割技术三、特征提取与描述算法四、实践示例&#xff1a;图像风格转换总结 导语 图像处理算法和技术在计算机视觉和图像处理领域发挥着重要作用&#xff0c;通过对图像进行分析、增强和转换&#xff0c;可以…

实验二 常用网络命令

文章目录 实验目的实验原理1. 通过 ping 命令检测网络故障2. ipconfig 命令3. arp 命令4. tracert 命令5. netstat 命令 实验内容1. ping命令2. ipconfig命令3. arp命令 实验总结 实验目的 了解常用网络命令及其使用方法。通过网络命令了解网络状态&#xff0c;并利用网络命令…

高速入门知识02:降低串扰和维持信号完整性的布线方法

文章目录 前言一、单端走线布线1.1.带有短截线的菊花链布线1.2.没有短截线的菊花链布线1.3.星型布线1.4.蛇型布线 二、差分走线布线 前言 串扰是并行走线间不需要的信号耦合。微带线和带状线正确的布线和叠层布局能够降低串扰。 双带线布局有两个靠近的信号层&#xff0c;为降…

Hbase drop 表卡住没有响应

在实际工作中遇到过重新创建一个hbase的hive外部表&#xff0c;在 disable table_name; drop table_name 在drop table_name卡住 最后有提示报错。 建议各位查看下表有无lock的情况&#xff0c; 查看和释放hbase lock可以通过如下方式来查看 pid获取&#xff1a; 在 Ma…

Python学习笔记-基于socket基础的http服务端程序

通过HTTP协议可以进行通信可以规范化的进行网络间通信。下面技术第一个http服务器小程序。简单的记录第一个试手程序。 1.http通信的基本流程 整个流程对应四层网络架构&#xff1a;应用层、传输层、网络层、链路层。有的部分已经封装&#xff0c;不需要我们再行处理。 2.服务…

轻松玩转Python正则表达式

引言 正则表达式是一种强大的文本匹配和处理工具&#xff0c;广泛应用于各种编程语言中。在Python中&#xff0c;我们可以使用内置的re模块来处理正则表达式。本文将带您从入门到精通&#xff0c;逐步介绍Python中的正则表达式用法&#xff0c;并提供实例演示。 1. 正则表达式…

JVM理论(二)类加载子系统

类加载流程 类加载流程 类加载器子系统负责从文件系统或者网络中加载class文件,class文件的文件头有特定的文件标识(CAFEBABE是JVM识别class文件是否合法的依据)classLoader只负责文件的加载,而执行引擎决定它是否被执行加载类的信息存放在运行时数据区的方法区中,方法区还包括…

VBA代码如何切换word和excel(3)

【分享成果&#xff0c;随喜正能量】人不能因为一件好事&#xff0c;高兴一整年&#xff0c;却能因为一个创伤&#xff0c;郁郁终生。痛苦给人的刺激&#xff0c;总是远远大于快乐。成年人的烦恼&#xff0c;和谁说都不合适&#xff0c;悲喜自渡&#xff0c;他人难悟。人最强大…

4-软件错误(BUG)

目录 1.什么是bug? 2.如何描述一个bug? ①发现问题的版本 ②问题出现的环境 ③错误重现的步骤 ④预期行为的描述 ⑤错误行为的描述 ⑥其他 ⑦不要把多个bug放到一起 PS&#xff1a;案例1 PS&#xff1a;案例2 3.如何定义bug的级别&#xff1f; ①Blocker&#x…

springboot+mysql财务管理系统

财务管理系统的开发运用java技术、springboot框架&#xff0c;MIS的总体思想&#xff0c;以及Mysql等技术的支持下共同完成了该系统的开发&#xff0c;实现了财务管理的信息化&#xff0c;使员工体验到更优秀的财务管理&#xff0c;管理员管理操作将更加方便&#xff0c;实现目…

10.3.2 【Linux】历史命令:history

[dmtsaistudy ~]$ alias hhistory 在正常的情况下&#xff0c;历史命令的读取与记录是这样的&#xff1a; 当我们以 bash 登陆 Linux 主机之后&#xff0c;系统会主动的由主文件夹的 ~/.bash_history 读取以前曾经下过的指令&#xff0c;那么 ~/.bash_history 会记录几笔数据呢…

网络编程7——IP协议(子网掩码,NAT机制,IPv6协议) + 以太网

文章目录 前言一、IP协议协议头格式认识IP地址格式组成子网掩码 地址管理1.动态分配2.NAT机制3.IPv6协议 路由选择 二、以太网以太网帧格式认识MTU 总结 前言 本人是一个普通程序猿!分享一点自己的见解,如果有错误的地方欢迎各位大佬莅临指导,如果你也对编程感兴趣的话&#x…

MongoDB【MongoDB索引Index (索引概述、索引类型、复合索引、)】(三)-全面详解(学习总结---从入门到深化)

目录 MongoDB索引Index 聚合操作 通过聚合操作可以处理多个文档&#xff0c;并返回计算后的结果。 对多个文档进行分组对分组的文档执行操作并返回单个结果分析数据变化 聚合管道 分别由多个阶段来处理文档&#xff0c;每个阶段的输出是下个阶段的输入&#xff0c; 返回的是…

GitLab名词介绍

GitLab名词介绍 分支&#xff1a;active、stale、default、protected IDEA中git面板&#xff1a;本地、远程、HEAD 合并时的选项&#xff1a;Delete、squash 查看Git常用操作 分支&#xff1a;active、stale、default、protected 在分支页面下&#xff0c;有active、stale…

Acwing 849. Dijkstra求最短路 I

Acwing 849. Dijkstra求最短路 I 链接:849. Dijkstra求最短路 I - AcWing题库 /*题解:dijkstra算法模板对于单源最短路径dijkstra1.每次找到当前距离源最近的节点 作为确定距离的点2.通过这个点看能否让其他的节点来松弛其他点到源的距离重复12操作*/ #include<algorithm&g…

端口映射的作用?如何在路由器上做端口映射

一、端口映射作用 路由器中设置端口映射的主要作用&#xff0c;就是让Internet上的其他用户&#xff0c;可以访问你路由器下面电脑中的数据(软件、文件)。 当家里的电脑使用路由器上网后&#xff0c;在Internet下的其它电脑、手机等网络设备&#xff0c;将无法自接访问你电脑…

linux常用的命令

一.操作目录命令 1.1 ls 命令 语法&#xff1a; ls [选项] [目录或文件] 功能: 对于目录&#xff0c;该命令列出该目录下的所有子目录与文件。对于文件&#xff0c;将列出文件名以及其他信息。 常用选项&#xff1a; a 列出目录下的所有文件&#xff0c;包括以 . 开头的隐含…