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

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

作者头像
KEN DO EVERTHING
发布2019-05-28 19:33:56
4420
发布2019-05-28 19:33:56
举报
文章被收录于专栏:KEN DO EVERTHING

背景与功能

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

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

服务降级

定义

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

实现

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

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

代码语言:javascript
复制
<dependency>
       <groupId>org.springframework.cloud</groupId>
       <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

3.启动类加上@EnableCircuitBreaker注解

4.新建一个controller做测试

代码语言:javascript
复制
//添加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
复制
@HystrixCommand(commandProperties = {
   @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value="3000")
},fallbackMethod = "fallback")

依赖隔离

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

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

服务熔断

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

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

实现
代码语言:javascript
复制
@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
复制
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
复制
<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
复制
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 删除。

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景与功能
  • 服务降级
  • 依赖隔离
  • 服务熔断
  • 配置的使用
  • 图形化界面
相关产品与服务
云服务器
云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档