前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >「 从0到1学习微服务SpringCloud 」13 断路器Hystrix

「 从0到1学习微服务SpringCloud 」13 断路器Hystrix

作者头像
KEN DO EVERTHING
发布于 2019-05-28 11:33:56
发布于 2019-05-28 11:33:56
45400
代码可运行
举报
文章被收录于专栏:KEN DO EVERTHINGKEN DO EVERTHING
运行总次数:0
代码可运行

背景与功能

微服务架构中,很多情况下,各个服务之间是相互依赖,一个服务可能会调用了好几个其他服务,假设其中有一个服务故障,便会产生级联故障,最终导致整个系统崩溃无法使用(这称为雪崩效应),Spring Cloud Hystrix正是用来防止雪崩效应的。

功能:服务降级、服务熔断、线程和信号隔离、请求缓存、请求合并以及服务监控等强大功能。

服务降级

定义

优先核心服务,非核心服务不可用或弱可用 比如:商城的微服架构中,突然涌入大量流量,但服务器资源是有限的,商品、订单、支付为核心服务,必须保证这些服务可用;积分、广告为非核心服务,可将其降级为弱可用或不可用。

实现

实现逻辑 1.通过HystrixCommand注解指定 2.fallbackMethod(回退函数)中实现具体降级逻辑

代码实现(使用eureka-client项目) 1.将config相关配置注释掉(不想多开个服务呀) 2.添加maven

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependency>
       <groupId>org.springframework.cloud</groupId>
       <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

3.启动类加上@EnableCircuitBreaker注解

4.新建一个controller做测试

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//添加Hystrix的注解,并指定回调函数
    @HystrixCommand(fallbackMethod = "fallback")
    @RequestMapping("/hys/hi")
    public String sayHi(){
        return hiService.hi();
    }

    /**
     * 上面方法指定的回调函数
     * 当上面的方法出现异常或在指定时间未返回时(默认超时时间1s),会调用此函数
     * @return
     */
    public String fallback(){
        return "用户拥挤,请稍后再试!";
    }

5.启动eureka-server,eureka-client项目,故意不开启service-hi项目,上面例子中调用hiService.hi()失败,会发生服务降级,调用回调函数

6.测试 浏览器输入http://localhost:8080/hys/hi

细节

若方法中出现异常时或在超时时间(默认1s)内未返回时,会调用回调函数,实现降级处理。 需要注意:这里有个超时时间,Hystrix默认1s,这个需要根据实际业务设置,可以通过一下注解进行设置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@HystrixCommand(commandProperties = {
   @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value="3000")
},fallbackMethod = "fallback")

依赖隔离

Hystrix会自动实现依赖隔离,这里所指的依赖隔离是线程池隔离。

Hystrix会为每一个@HystrixCommand注解的方法创建一个线程池,这样的话,当某个方法有线程延迟时,也不会影响到其他的方法。

服务熔断

服务熔断的原理就好像我们家里的电闸一样,当电流过大,为了保护电器,会出现跳闸的现象。

服务熔断也是一样,当遇到不断地出现异常的状况时,达到某个阈值时会触发熔断,而降级调用回调函数。

实现
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@HystrixCommand(commandProperties = {
            //开启熔断
            @HystrixProperty(name = "circuitBreaker.enabled",value="true"),
            //一个rolling window内最小的请求数。 默认20
            // 如果设为20,那么当一个rolling window(统计时间段,默认10s)的时间内收到19个请求,即使19个请求都失败,也不会触发circuit break(熔断)。
            @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold",value="10"),
            //触发短路的时间值,当该值设为5000时,则当触发circuit break后的5000毫秒内都会拒绝request,也就是5000毫秒后才会关闭circuit(断路器)。默认5000
            @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value="10000"),
            //错误比率阀值,如果错误率>=该值,circuit(断路器)会被打开,并短路所有请求触发fallback。默认50
            @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value="60")
    },fallbackMethod = "fallback")
    @GetMapping("/hys/circuitSayHi")
    public String circuitSayHi(Integer number){
        if(number == 2){
            return "success";
        }
        return hiService.hi();
    }

    public String fallback(Integer number){
        return "用户拥挤,请稍后再试!";
    }

测试

背景:当我传递参数number=2的时,服务调用是成功的,否则失败(因service-hi不开启) 1.直接调用 http://localhost:8080/hys/circuitSayHi?number=2 访问成功(用于对比参照)

2.在10秒内(rolling window),调用http://localhost:8080/hys/circuitSayHi10次(我们设置错误率为60%) 因为开始调用时不一定就在一个rolling window开头,所以我们调用10次,肯定会触发熔断

3.然后调用 http://localhost:8080/hys/circuitSayHi?number=2,处在断路状态,仍然调用的是回调函数

配置的使用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
hystrix:
  command:
    default:
      circuitBreaker:
        #开启熔断
        enabled: true
        #滚动窗口中将使断路器跳闸的最小请求数量
        requestVolumeThreshold: 20
        #设置失败百分比的阈值。如果失败比率超过这个值,则断路器跳闸并且进入fallback逻辑
        errorThresholdPercentage : 60
      execution:
        isolation:
          thread:
            #设置调用者执行的超时时间(单位毫秒)
            timeoutInMilliseconds: 2000
     #为某个方法设定特殊的配置 方法名
     circuitSayHi:
           circuitBreaker:
             #开启熔断
             enabled: true
             #滚动窗口中将使断路器跳闸的最小请求数量
             requestVolumeThreshold: 10
             #设置失败百分比的阈值。如果失败比率超过这个值,则断路器跳闸并且进入fallback逻辑
             errorThresholdPercentage : 40
           execution:
             isolation:
               thread:
                 #设置调用者执行的超时时间(单位毫秒)
                 timeoutInMilliseconds: 1000

更多配置项,自定谷歌百度

图形化界面

Hystrix提供了一个图形化界面,用于监控断路情况

1.添加maven

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

<dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-stream-rabbit</artifactId>
</dependency>

2.添加配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
management:
  endpoints:
      web:
        exposure:
          # 开启指定端点
          include: 'hystrix.stream'

3.重启项目,打开 http://localhost:8080/hystrix

4.分别调用一下

http://localhost:8080/hys/circuitSayHi?number=2 http://localhost:8080/hys/circuitSayHi

5.

在监控的界面有两个重要的图形信息:一个实心圆和一条曲线。

  • 实心圆:1、通过颜色的变化代表了实例的健康程度,健康程度从绿色、黄色、橙色、红色递减。2、通过大小表示请求流量发生变化,流量越大该实心圆就越大。所以可以在大量的实例中快速发现故障实例和高压实例。
  • 曲线:用来记录2分钟内流浪的相对变化,可以通过它来观察流量的上升和下降趋势。

就讲到这里咯,已同步更新github,下期见~ https://github.com/zhangwenkang0/springcloud-learning-from-0-to-1

点击阅读原文,直达系列文章

如果觉得不错,请给个「好看」

分享给你的朋友!

THANDKS

- End -

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-05-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 java从心 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Hystrix断路器(服务熔断、服务降级、服务限流)
复杂分布式体系结构中的应用程序有数十个依赖关系,每个依赖关系在某些时候将不可避免地失败。
别团等shy哥发育
2023/02/25
1.1K0
Hystrix断路器(服务熔断、服务降级、服务限流)
微服务(九)——Hystrix服务降级、熔断、限流(下)
熔断机制是应对雪崩效应的一种微服务链路保护机制。当扇出链路的某个微服务出错不可用或者响应时间太长时,会进行服务的降级,进而熔断该节点微服务的调用,快速返回错误的响应信息。当检测到该节点微服务调用响应正常后,恢复调用链路。
不愿意做鱼的小鲸鱼
2022/09/26
1.2K0
微服务(九)——Hystrix服务降级、熔断、限流(下)
Spring Cloud 之 Hystrix
不管是业务方法指定的降级方法还是全局降级方法,它们都必须和业务方法在同一个类中才能生效,业务逻辑与降级逻辑耦合度极高。
一只
2024/07/01
1330
Spring Cloud 之 Hystrix
SpringCloud之Hystrix
复杂分布式体系结构中的应用程序有数十个依赖关系,每个依赖关系在某些时候将不可避免地失败。
shaoshaossm
2022/12/27
3640
SpringCloud之Hystrix
SpringCloud集成Hystrix
复杂分布式体系结构中的应用程序有数十个依赖关系,每个依赖关系在某些时候将不可避免地失败。
大忽悠爱学习
2021/12/07
5550
SpringCloud集成Hystrix
11-SpringCloud Hystrix
复杂分布式体系结构中的应用程序有数十个依赖关系,每个依赖关系在某些时候将不可避免地失败。
彼岸舞
2021/08/25
6520
使用Hystrix对微服务进行保护
在微服务实战这本书中提到过一个健康的微服务架构,一定是可伸缩的,弹性的。可伸缩的的无非是服务从单机变成了集群,可以根据服务的业务能力把控住服务分片的数量。自然可伸缩的也不是今天要讨论的重点,下一个弹性的才是今天要Battle的课题。
姜同学
2022/10/27
4480
使用Hystrix对微服务进行保护
Hystrix 服务降级|熔断
复杂分布式体系结构中的应用程序有数十个依赖关系,每个依赖关系在某些时候将不可避免地失败。
用户9615083
2022/12/25
7750
Hystrix 服务降级|熔断
Spring Cloud Hystrix - 服务容错
在微服务架构中,由于某个服务的不可用导致一系列的服务崩溃,被称之为雪崩效应。所以防御服务的雪崩效应是必不可少的,在Spring Cloud中防雪崩的利器就是Hystrix,Spring Cloud Hystri是基于Netflix Hystrix实现的。Hystrix的目标在于通过控制那些访问远程系统、服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力。Hystrix 具备服务降级、服务容错、服务熔断、线程和信号隔离、请求缓存、请求合并以及服务监控等强大功能。
端碗吹水
2020/09/23
5860
Spring Cloud Hystrix - 服务容错
Spring Cloud 系列之熔断器 Hystrix
  Hystrix 是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,比如超时、异常等,Hystrix 能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性。    “熔断器”本身是一种开关装置,当某个服务单元发生故障之后,通过断路器的故障监控(类似熔断保险丝),向调用方返回一个符合预期的、可处理的备选响应(FallBack),而不是长时间的等待或者抛出调用方无法处理的异常,这样就保证了服务调用方的线程不会被长时间、不必要地占用,从而避免了故障在分布式系统中的蔓延,乃至雪崩。
Demo_Null
2020/11/11
1.3K0
Spring Cloud 系列之熔断器 Hystrix
SpringCloud服务降级与熔断Hystrix
cheese
2023/10/25
2890
SpringCloud服务降级与熔断Hystrix
Hystrix
Hystix是Netflix开源的一个延迟和容错库,用于隔离访问远程服务、第三方库,防止出现级联失败。
暴躁的程序猿
2022/03/24
5440
Hystrix
【云原生】springcloud11——Hystrix是怎样让微服务“易凡峰顺”的
官方文档:https://github.com/Netflix/Hystrix/wiki
半旧518
2022/10/26
4540
【云原生】springcloud11——Hystrix是怎样让微服务“易凡峰顺”的
使用Hystrix实现自动降级与依赖隔离[微服务]
目前对于一些非核心操作,如增减库存后保存操作日志 发送异步消息时(具体业务流程),一旦出现MQ服务异常时,会导致接口响应超时,因此可以考虑对非核心操作引入服务降级、服务隔离。
高广超
2018/12/12
1.1K0
springcloud:Hystrix,思想学习,场景业务解决,服务监控
​ 多个微服务之间调用的时候,假设微服务A调用微服务B和微服务C,微服务B和微服务C又调用其它的微服务,这就是所谓的“扇出”。如果扇出的链路上某个微服务的调用响应时间过长或者不可用,对微服务A的调用就会占用越来越多的系统资源,进而引起系统崩溃,所谓的“雪崩效应”. 对于高流量的应用来说,单一的后端依赖可能会导致所有服务器上的所有资源都在几秒钟内饱和。比失败更糟糕的是,这些应用程序还可能导致服务之间的延迟增加,备份队列,线程和其他系统资源紧张,导致整个系统发生更多的级联故障。这些都表示需要对故障和延迟进行隔离和管理,以便单个依赖关系的失败,不能取消整个应用程序或系统。 ​ 所以,通常当你发现一个模块下的某个实例失败后,这时候这个模块依然还会接收流量,然后这个有问题的模块还调用了其他的模块,这样就会发生级联故障,或者叫雪崩。
冷环渊
2021/10/19
5880
SpringBoot集成Hystrix
当访问http://localhost:8082/hystrix1/test1抛出异常,服务降级返回fail1。 当访问http://localhost:8082/hystrix1/test2抛出异常,服务不断降级返回default fail。
用户2032165
2019/03/06
2.1K0
SpringBoot集成Hystrix
断路器流程图
 涉及到断路器的三个重要参数:快照时间窗、请求总数阀值、错误百分比阀值。 1:快照时间窗:断路器确定是否打开需要统计一些请求和错误数据,而统计的时间范围就是快照时间窗,默认为最近的10秒。 2:请求总数阀值:在快照时间窗内,必须满足请求总数阀值才有资格熔断。默认为20,意味着在10秒内,如果该hystrix命令的调用次数不足20次,即使所有的请求都超时或其他原因失败,断路器都不会打开。 3:错误百分比阀值:当请求总数在快照时间窗内超过了阀值,比如发生了30次调用,如果在这30次调用中,有15次发生了超时异常,也就是超过50%的错误百分比,在默认设定50%阀值情况下,这时候就会将断路器打开。
一个风轻云淡
2022/11/13
4450
断路器流程图
hystrix服务熔断(1)
熔断机制是应对雪崩效应的一种微服务链路保护机制。当扇出链路的某个微服务出错不可用或者响应时间太长时, 会进行服务的降级,进而熔断该节点微服务的调用,快速返回错误的响应信息。 当检测到该节点微服务调用响应正常后,恢复调用链路。 在Spring Cloud框架里,熔断机制通过Hystrix实现。Hystrix会监控微服务间调用的状况, 当失败的调用到一定阈值,缺省是5秒内20次调用失败,就会启动熔断机制。熔断机制的注解是@HystrixCommand。
一个风轻云淡
2022/11/13
2530
hystrix服务熔断(1)
Spring Cloud 之 Hystrix.
 在微服务架构中,我们将系统拆分成了很多服务单元,各单元的应用间通过服务注册与订阅的方式互相依赖。由于每个单元都在不同的进程中运行,依赖通过远程调用的方式执行,这样就有可能因为网络原因或是依赖服务自身间题出现调用故障或延迟,而这些问题会直接导致调用方的对外服务也出现延迟,若此时调用方的请求不断增加,最后就会因等待出现故障的依赖方响应形成任务积压,最终导致自身服务的瘫痪。
JMCui
2019/07/15
5530
Spring Cloud 之 Hystrix.
SpringCloud 服务降级
​ https://github.com/Netflix/Hystrix/wiki/How-To-Use
OY
2022/03/17
4.7K0
SpringCloud 服务降级
相关推荐
Hystrix断路器(服务熔断、服务降级、服务限流)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验