springcloud断路器修改熔断时间_跟我学Spring Cloud(Finchley版)13通用方式使用Hystrix...

79a81d5392fee213d47e5a13597fe693.png

本节详细讲解使用Hystrix的通用方式。

简介

Hystrix是由Netflix开源的一个延迟和容错库,用于隔离访问远程系统、服务或者第三方库,防止级联失败,从而提升系统的可用性与容错性。Hystrix主要通过以下几点实现延迟和容错。

  • 包裹请求

使用HystrixCommand(或HystrixObservableCommand)包裹对依赖的调用逻辑,每个命令在独立线程中执行。这使用到了设计模式中的“命令模式”。

  • 跳闸机制

当某服务的错误率超过一定阈值时,Hystrix可以自动或者手动跳闸,停止请求该服务一段时间。

  • 资源隔离

Hystrix为每个依赖都维护了一个小型的线程池(或者信号量)。如果该线程池已满,发往该依赖的请求就被立即拒绝,而不是排队等候,从而加速失败判定。

  • 监控

Hystrix可以近乎实时地监控运行指标和配置的变化,例如成功、失败、超时、以及被拒绝的请求等。

  • 回退机制

当请求失败、超时、被拒绝,或当断路器打开时,执行回退逻辑。回退逻辑可由开发人员自行提供,例如返回一个缺省值。

  • 自我修复

断路器打开一段时间后,会自动进入“半开”状态。断路器打开、关闭、半开的逻辑转换,前面我们已经详细探讨过了,不再赘述。

通用方式使用Hystrix

服务降级

1 加依赖:

 org.springframework.cloud

 spring-cloud-starter-netflix-hystrix

2 加注解:在启动类上添加 @EnableCircuitBreaker 注解。

3 使用:

@HystrixCommand(fallbackMethod = "findByIdFallback")

@GetMapping("/users/{id}")

public User findById(@PathVariable Long id) {

 // 这里用到了RestTemplate的占位符能力

 User user = this.restTemplate.getForObject(

   "http://microservice-provider-user/users/{id}",

   User.class,

   id

 );

 // ...电影微服务的业务...

 return user;

}

public User findByIdFallback(Long id) {

 return new User(id, "默认用户", "默认用户", 0, new BigDecimal(1));

}

由代码可知,只需使用 @HystrixCommand 注解,就可保护该API。这里的”保护“,其实带有三层含义——”超时机制“、”仓壁模式“、”断路器“!如果您不了解这些是什么,或者想要探寻其中原理,可详见:跟我学Spring Cloud(Finchley版)-12-微服务容错三板斧

TIPS

1 本例使用了 fallbackMethod 属性,指定了一个降级方法,如不指定,Hystrix会有一个默认的降级方案,那就是抛异常,哈哈哈。

如何知道断路器打开还是关闭呢?还记得健康检查吗?只需访问应用的 /actuator/health 端点,即可查看!断路器的状态——当然,你必须添加如下配置:

management:

 endpoint:

   health:

     show-details: always

如果您对这部分知识有遗忘,可前往跟我学Spring Cloud(Finchley版)-03-监控:强大的Spring Boot Actuator 简单复习一下。

测试

1 启动 microservice-discovery-eureka

2 启动 microservice-provider-user

3 启动 microservice-consumer-movie-ribbon-hystrix-common

4 访问 http://localhost:8010/movies/users/1 ,能正常返回结果

5 关闭 microservice-provider-user ,再次访问 http://localhost:8010/movies/users/1 ,可返回类似如下结果,说明当服务提供者时,服务消费者进入了回退方法

{"id":1,"username":"默认用户","name":"默认用户","age":0,"balance":1}

6 访问 http://localhost:8010/actuator/health ,可获得类似如下结果:

{

   "status": "UP",

   "details": {

       "diskSpace": ...,

       "refreshScope": ...,

       "discoveryComposite": ...,

       "hystrix": {

           "status": "UP"

       }

   }

}

由结果不难发现,此时断路器并未打开!这是为什么呢? 原因是:此时只请求了一次,没有达到Hystrix的阈值——Hystrix设计来保护高并发应用的,它要求10秒(可用 hystrix.command.default.metrics.rollingStats.timeInMilliseconds 自定义)以内API错误次数超过20次(用 circuitBreaker.requestVolumeThreshold 自定义),此时才可能触发断路器。

7 持续不断地访问 http://localhost:8010/movies/users/1 多次(至少20次)

8 再次访问 http://localhost:8010/actuator/health ,可获得类似如下结果:

{

   "status": "UP",

   "details": {

       "diskSpace": ...,

       "refreshScope": ...,

       "discoveryComposite": ...,

       "hystrix": {

           "status": "CIRCUIT_OPEN",

           "details": {

               "openCircuitBreakers": ["MovieController::findById"]

           }

       }

   }

}

由结果可知,此时断路器已经打开,并且列出了是哪个API的断路器被打开了。

获得造成fallback的原因

在实际项目中,很可能需要获得造成fallback的原因,此时可将代码修改为如下:

@HystrixCommand(fallbackMethod = "findByIdFallback")

@GetMapping("/users/{id}")

public User findById(@PathVariable Long id) {

 // 这里用到了RestTemplate的占位符能力

 User user = this.restTemplate.getForObject(

   "http://microservice-provider-user/users/{id}",

   User.class,

   id

 );

 // ...电影微服务的业务...

 return user;

}

public User findByIdFallback(Long id, Throwable throwable) {

 log.error("进入回退方法", throwable);

 return new User(id, "默认用户", "默认用户", 0, new BigDecimal(1));

}

配套代码

  • GitHub:https://github.com/eacdy/spring-cloud-study/tree/master/2018-Finchley/microservice-consumer-movie-ribbon-hystrix-common

  • Gitee:https://gitee.com/itmuch/spring-cloud-study/tree/master/2018-Finchley/microservice-consumer-movie-ribbon-hystrix-common

相关热文

  • 实用技巧:Hystrix传播ThreadLocal对象(两种方案)

  • 生产技巧:Feign如何控制Hystrix的启停、超时、熔断?

  • Hystrix停止开发,我们该何去何从?

  • Spring Cloud 源码学习之 Hystrix 熔断器

  • Spring Cloud Edgware新特性之二:如何配置Zuul的Hystrix线程池

您的关注是对我最大的支持!

144fe005beb6142b307a366bcbc9fff9.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值