`

跟我学Spring Cloud(Finchley版)-13-通用方式使用Hystrix

 
阅读更多

说明: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 注解。

  • 使用:

     
    @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

  • 本例使用了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的原因,此时可将代码修改为如下:

 
@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));
}

配套代码

相关文章

 

分享到:
评论

相关推荐

    spring-cloud-netflix-hystrix应用

    《深入理解Spring Cloud Netflix Hystrix:构建弹性微服务架构》 在当今的软件开发领域,微服务架构已经成为主流,而Spring Cloud作为Java生态中的微服务解决方案,深受开发者喜爱。其中,Spring Cloud Netflix ...

    spring-cloud-netflix-hystrix-dashboard-2.2.3.RELEASE.jar

    spring-cloud-netflix-hystrix-dashboard-2.2.3.RELEASE.jar

    Spring Cloud Finchley SR2全套(集成Spring Gateway)

    基于Spring Cloud Finchley SR2 Spring Boot 2.0.7的最新版本。 核心基础项目内实现类自定义的权限注解,配合RBAC权限模型+拦截器即可实现权限的控制,具体的参考项目中的实现。同时也封装了一些顶层类和结果集等。...

    springcloud2-hystrix-feign-zuul.zip

    标题 "springcloud2-hystrix-feign-zuul.zip" 提示了我们这是一组关于Spring Cloud 2的实现,具体涉及Hystrix、Feign和Zuul组件的实践项目。Spring Cloud 是一个用于构建分布式系统的服务发现、配置管理和微服务连接...

    SpringCloud-2.0-order-hystrix-ribbon-8011.zip

    在这个名为"SpringCloud-2.0-order-hystrix-ribbon-8011.zip"的项目中,我们主要探讨的是如何利用Hystrix实现服务间的短路保护,以及Ribbon作为客户端负载均衡器的作用。 Hystrix是Netflix开源的一款强大的断路器库...

    spring-cloud-examples

    Spring Cloud使用的各种示例,以最简单、最实用为标准 spring-cloud-eureka:eureka server单机、双机、集群示例 eureka-producer-consumer:利用eureka实现服务提供与调用示例 spring-cloud-hystrix:Hystrix熔断...

    spring-cloud-hystrix-feign(注册中心、member、feign-order).zip

    然后,"SpringCloud-2.0-order-hystrix-feign-8012"展示了如何使用Feign和Hystrix进行服务间调用。Feign是一个声明式Web服务客户端,使得编写Web服务客户端就像编写Java接口一样简单。在Order服务中,我们可以定义一...

    springcloud-ribbon-feign-hystrix-zuul-config

    在Spring Cloud框架中,"springcloud-ribbon-feign-hystrix-zuul-config"这个标题涉及到四个关键组件:Ribbon、Feign、Hystrix和Zuul,以及配置管理Config。这些组件都是构建分布式系统时常用的服务发现、客户端负载...

    spring-cloud-hystrix-dashboard(包含注册中心、member、hystrix-dashboard配置等).zip

    spring-cloud-hystrix-dashboard(包含注册中心、member、hystrix-dashboard配置等).zip 包含配置好的eureka注册中心,member服务生产者、hystrix-dashboard的hystrix配置和仪表盘配置

    springcloud-learning-master.zip springcloud学习合集

    本压缩包"springcloud-learning-master.zip"是一个关于SpringCloud学习的资源合集,包含了一系列的例子和教程,适合想要深入理解和掌握SpringCloud技术的开发者。 首先,我们要了解SpringCloud的基础概念。Spring...

    spring-cloud-netflix-hystrix-2.1.0.RELEASE.jar

    spring-cloud-netflix-hystrix-2.1.0.RELEASE

    spring-cloud-demo-master.zip

    《Spring Cloud实战:基于"spring-cloud-demo-master.zip"的入门指南》 在现代微服务架构中,Spring Cloud作为主流的工具集,为开发者提供了构建分布式系统的服务发现、配置管理、断路器等一系列功能。本篇文章将...

    spring-cloud-starter-netflix-hystrix-dashboard-2.1.0.RELEASE.jar

    spring-cloud-starter-netflix-hystrix-dashboard-2.1.0.RELEASE

    spring-cloud-starter-netflix-hystrix-2.1.0.RELEASE.jar

    spring-cloud-starter-netflix-hystrix-2.1.0.RELEASE

    spring-cloud-examples-master

    4. **Config Server** - 配置中心:Spring Cloud Config Server提供了一种集中式管理应用配置的方式,使得配置更新可以实时生效。在这个项目中,我们将了解如何配置Config Server,并在客户端应用中使用配置。 5. *...

    spring cloud降级服务-hystrix.7z

    Spring Cloud Hystrix 是一个基于 Netflix Hystrix 实现的服务降级、断路器和熔断器框架,它被广泛应用于分布式系统中的容错管理,以提高系统的稳定性和可用性。在微服务架构中,服务间通信是常见的操作,而Spring ...

    springcloud-learning-master.zip

    Spring Boot 提供了一种快速构建独立的、生产级别的基于Spring的应用程序的方式,而Spring Cloud则为开发分布式系统(如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性令牌、全局锁、领导选举、...

    基于Spring Cloud(Finchley版本)架构体系

    基于Spring Cloud(Finchley版本)架构体系,整合各微服务基础组件的最新最全的脚手架工程。微服务架构: Spring Cloud全家桶 + Spring boot 2.x + Oauth2 + Mybatis + Druid + Mysql + Sharding-JDBC 3.x + Redis ...

    spring-cloud使用的各种示例

    - [springcloud(五):熔断监控Hystrix Dashboard和Turbine](http://www.ityouknow.com/springcloud/2017/05/18/hystrix-dashboard-turbine.html) - [springcloud(六):配置中心git示例]...

    SpringCloud-Learning-master.zip

    《SpringCloud深度学习指南》 SpringCloud作为微服务架构中的热门框架,因其强大的服务治理功能和易用性,被广大开发者广泛采用。本资源“SpringCloud-Learning-master.zip”是程序猿DD关于SpringCloud的学习资料,...

Global site tag (gtag.js) - Google Analytics