说明:SpringCloud系列笔者自学系列,学习来源是周立的博客 http://www.itmuch.com/ 。而此处转载其博客只是为了方便自己以后的学习。
本篇来源 http://www.itmuch.com/spring-cloud/finchley-13/
本节详细讲解使用Hystrix的通用方式。
简介
Hystrix是由Netflix开源的一个延迟和容错库,用于隔离访问远程系统、服务或者第三方库,防止级联失败,从而提升系统的可用性与容错性。Hystrix主要通过以下几点实现延迟和容错。
- 包裹请求
使用HystrixCommand(或HystrixObservableCommand)包裹对依赖的调用逻辑,每个命令在独立线程中执行。这使用到了设计模式中的“命令模式”。
- 跳闸机制
当某服务的错误率超过一定阈值时,Hystrix可以自动或者手动跳闸,停止请求该服务一段时间。
- 资源隔离
Hystrix为每个依赖都维护了一个小型的线程池(或者信号量)。如果该线程池已满,发往该依赖的请求就被立即拒绝,而不是排队等候,从而加速失败判定。
- 监控
Hystrix可以近乎实时地监控运行指标和配置的变化,例如成功、失败、超时、以及被拒绝的请求等。
- 回退机制
当请求失败、超时、被拒绝,或当断路器打开时,执行回退逻辑。回退逻辑可由开发人员自行提供,例如返回一个缺省值。
- 自我修复
断路器打开一段时间后,会自动进入“半开”状态。断路器打开、关闭、半开的逻辑转换,前面我们已经详细探讨过了,不再赘述。
通用方式使用Hystrix
服务降级
-
加依赖:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency>
-
加注解:在启动类上添加
@EnableCircuitBreaker
注解。 -
使用:
"findByIdFallback") (fallbackMethod = "/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
-
本例使用了
fallbackMethod
属性,指定了一个降级方法,如不指定,Hystrix会有一个默认的降级方案,那就是抛异常,哈哈哈。 -
如何知道断路器打开还是关闭呢?还记得健康检查吗?只需访问应用的
/actuator/health
端点,即可查看!断路器的状态——当然,你必须添加如下配置:management: endpoint: health: show-details: always
如果您对这部分知识有遗忘,可前往跟我学Spring Cloud(Finchley版)-03-监控:强大的Spring Boot Actuator 简单复习一下。
测试
-
启动
microservice-discovery-eureka
-
启动
microservice-provider-user
-
启动
microservice-consumer-movie-ribbon-hystrix-common
-
访问
http://localhost:8010/movies/users/1
,能正常返回结果 -
关闭
microservice-provider-user
,再次访问http://localhost:8010/movies/users/1
,可返回类似如下结果,说明当服务提供者时,服务消费者进入了回退方法。{"id":1,"username":"默认用户","name":"默认用户","age":0,"balance":1}
-
访问
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
自定义),此时才可能触发断路器。 -
持续不断地访问
http://localhost:8010/movies/users/1
多次(至少20次) -
再次访问
http://localhost:8010/actuator/health
,可获得类似如下结果:{ "status": "UP", "details": { "diskSpace": ..., "refreshScope": ..., "discoveryComposite": ..., "hystrix": { "status": "CIRCUIT_OPEN", "details": { "openCircuitBreakers": ["MovieController::findById"] } } } }
由结果可知,此时断路器已经打开,并且列出了是哪个API的断路器被打开了。
获得造成fallback的原因
在实际项目中,很可能需要获得造成fallback的原因,此时可将代码修改为如下:
"findByIdFallback") (fallbackMethod = "/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
相关文章
- 跟我学Spring Cloud(Finchley版)-14-Feign使用Hystrix
- 跟我学Spring Cloud(Finchley版)-15-Hystrix监控详解
- 跟我学Spring Cloud(Finchley版)-12-微服务容错三板斧
- Spring Cloud中,如何解决Feign/Ribbon第一次请求失败的问题?
- 跟我学Spring Cloud(Finchley版)-09-Feign
相关推荐
使用 Feign Hystrix 因为熔断只是作用在服务调用这一端,因此我们根据上一篇的示例代码只需要改动 eureka-consumer-feign 项目相关代码就可以。 POM 配置 因为 Feign 中已经依赖了 Hystrix 所以在 maven 配置上不用...
一、Hystrix Dashboard简介 在微服务架构中为例保证程序的可用性,防止程序出错导致网络阻塞,出现了断路器模型。断路器的状况反应了一个程序的可用性和健壮性,它是一个重要指标。Hystrix Dashboard是作为断路器...
《跟我学Spring》是一份全面且深入的Spring学习资源,旨在帮助初学者和有经验的开发者从零开始掌握Spring框架,逐步进阶为Spring高手。这份资料不仅包含了Spring的基本概念和核心特性,还通过实战项目让你亲身体验...
跟我学Spring Cloud系列文章代码仓库 本仓库为《跟我学Spring Cloud系列文章》代码仓库,欢迎点赞,收藏。更多文章可访问博客站获取。 如果我的文章对您有帮助,请扫码关注我的公众号,所有的文章都会在公众号首推:...
代码示例可能会展示如何使用Eureka进行服务注册与发现,使用Zuul或Spring Cloud Gateway实现API网关,以及如何利用Hystrix实现熔断策略。 3. **Spring Data**:这个项目简化了数据访问层的开发,支持多种数据存储,...