`
6696
  • 浏览: 15305 次
社区版块
存档分类
最新评论

SpringCloud:熔断器Hystrix

 
阅读更多

 

1. 熔断器

服务雪崩

在正常的微服务架构体系下,一个业务很少有只需要调用一个服务就可以返回数据的情况,这种比较常见的是出现在demo中,一般都是存在调用链的,比如A->B->C->D,如果D在某一个瞬间出现问题,比如网络波动,io偏高,导致卡顿,随着时间的流逝,后续的流量继续请求,会造成D的压力上升,有可能引起宕机。(了解源码可+求求: 1791743380)

你以为这就是结束么,图样图森破,这才是噩梦的开始,在同一个调用链上的ABC三个服务都会随着D的宕机而引发宕机,这还不是结束,一个服务不可能只有一个接口,当它开始卡顿宕机时,会影响到其他调用链的正常调用,最终导致所有的服务瘫痪。

如下图所示:

 

SpringCloud系列教程 | 第四篇:熔断器Hystrix
 

 

熔断器

相信大家都知道家用电闸,原来老式的电闸是使用保险丝的(现在很多都是空气开关了),当家里用电量过大的时候,保险丝经常烧断,这么做是保护家里的用电器,防止过载。

熔断器的作用和这个很像,它可以实现快速失败,如果在一段时间内服务调用失败或者异常,会强制要求当前调用失败,不在走远程调用,走服务降级操作(返回固定数据或者其他一些降级操作)。从而防止应用程序不断地尝试执行可能会失败的操作,使得应用程序继续执行而不用等待修正错误,或者浪费CPU时间去等到长时间的超时产生。熔断器也可以自动诊断错误是否已经修正,如果已经修正,应用程序会再次尝试调用操作。

熔断器模式就像是那些容易导致错误的操作的一种代理。这种代理能够记录最近调用发生错误的次数,然后决定使用允许操作继续,或者立即返回错误。 Hystrix会有一个熔断时间窗口,具体转换逻辑如下:

 

SpringCloud系列教程 | 第四篇:熔断器Hystrix
 

 

熔断器就是保护服务高可用的最后一道防线。

2. Hystrix

1. 断路器机制

断路器很好理解, 当Hystrix Command请求后端服务失败数量超过一定比例(默认50%), 断路器会切换到开路状态(Open)。这时所有请求会直接失败而不会发送到后端服务。断路器保持在开路状态一段时间后(默认5秒), 自动切换到半开路状态(HALF-OPEN)。这时会判断下一次请求的返回情况, 如果请求成功, 断路器切回闭路状态(CLOSED), 否则重新切换到开路状态(OPEN)。Hystrix的断路器就像我们家庭电路中的保险丝, 一旦后端服务不可用, 断路器会直接切断请求链, 避免发送大量无效请求影响系统吞吐量, 并且断路器有自我检测并恢复的能力。

2. Fallback

Fallback相当于是降级操作。对于查询操作, 我们可以实现一个fallback方法, 当请求后端服务出现异常的时候, 可以使用fallback方法返回的值。fallback方法的返回值一般是设置的默认值或者来自缓存。

3. 资源隔离

在Hystrix中, 主要通过线程池来实现资源隔离。通常在使用的时候我们会根据调用的远程服务划分出多个线程池。例如调用产品服务的Command放入A线程池, 调用账户服务的Command放入B线程池。这样做的主要优点是运行环境被隔离开了。这样就算调用服务的代码存在bug或者由于其他原因导致自己所在线程池被耗尽时, 不会对系统的其他服务造成影响。但是带来的代价就是维护多个线程池会对系统带来额外的性能开销。如果是对性能有严格要求而且确信自己调用服务的客户端代码不会出问题的话, 可以使用Hystrix的信号模式(Semaphores)来隔离资源。

3. Feign Hystrix

原来我们使用了producer和consumers,熔断器是只作用在服务调用端,因此上一篇使用到的consumers我们可以直接拿来使用。因为,Feign中已经依赖了Hystrix所以在maven配置上不用做任何改动。

1. 配置文件application.yml新增

Java代码  收藏代码
  1. server:  
  2.   port: 8081  
  3. spring:  
  4.   application:  
  5.     name: spring-cloud-consumers  
  6. eureka:  
  7.   client:  
  8.     service-url:  
  9.       defaultZone: http://localhost:8761/eureka/  
  10. feign:  
  11.   hystrix:  
  12.     enabled: true  

 其中新增了feign.hystrix.enabled = true

2. 创建fallback类,继承与HelloRemote实现回调的方法

Java代码  收藏代码
  1. package com.springcloud.consumers.fallback;  
  2.   
  3. import com.springcloud.consumers.remote.HelloRemote;  
  4. import org.springframework.stereotype.Component;  
  5. import org.springframework.web.bind.annotation.RequestParam;  
  6.   
  7. /** 
  8.  * Created with IntelliJ IDEA. 
  9.  * 
  10.  * @User: weishiyao 
  11.  * @Date: 2019/7/2 
  12.  * @Time: 23:14 
  13.  * @email: inwsy@hotmail.com 
  14.  * Description: 
  15.  */  
  16. @Component  
  17. public class HelloRemoteFallBack implements HelloRemote {  
  18.     @Override  
  19.     public String hello(@RequestParam(value = "name") String name) {  
  20.         return "hello " + name + ", i am fallback massage";  
  21.     }  
  22. }  

 3. 添加fallback属性

在HelloRemote类添加指定fallback类,在服务熔断的时候返回fallback。

Java代码  收藏代码
  1. package com.springcloud.consumers.remote;  
  2.   
  3. import com.springcloud.consumers.fallback.HelloRemoteFallBack;  
  4. import org.springframework.cloud.openfeign.FeignClient;  
  5. import org.springframework.web.bind.annotation.RequestMapping;  
  6. import org.springframework.web.bind.annotation.RequestParam;  
  7.   
  8. /** 
  9.  * @Author: shiyao.wei 
  10.  * @Date: 2019/7/2 11:14 
  11.  * @Version: 1.0 
  12.  * @Desc: 
  13.  */  
  14. @FeignClient(name= "SPRING-CLOUD-PRODUCER", fallback = HelloRemoteFallBack.class)  
  15. public interface HelloRemote {  
  16.     @RequestMapping(value = "/hello")  
  17.     String hello(@RequestParam(value = "name") String name);  
  18. }  

 

所有改动结束。

4. 测试

现在我们测试看下结果,老规矩,顺次启动注册中心Eureka、provider、consumer

访问上一节我们访问过的链接:http://localhost:8081/hello/spring

现在可以看到页面正常显示:hello spring,producer is ready

现在我们手动把provider停掉,再访问一下链接看一下:

现在页面已经显示我们熔断后的信息了:hello spring, i am fallback massage

现在说明我们的测试已经成功了。

分享到:
评论

相关推荐

    SpringCloud10-Hystrix熔断器及服务熔断

    本文将深入探讨Spring Cloud中的Hystrix熔断器以及服务熔断机制。 首先,理解什么是熔断器模式至关重要。熔断器模式源自电路设计,当电流超过一定阈值时,电路会自动断开以保护系统不受损害。在软件系统中,Hystrix...

    SpringCloud之熔断器Hystrix的实现

    「Hystrix熔断器在SpringCloud中的实现」 在微服务架构中,服务之间的调用关系非常复杂,可能会出现某个服务故障,导致整个系统故障的情况,这种现象被称为服务雪崩效应。为了解决这个问题,SpringCloud中引入了...

    spring-cloud-netflix-hystrix应用

    7. **配置管理**:Hystrix的配置可通过Spring Cloud Config进行集中管理,方便在运行时动态调整熔断器的阈值、超时时间等参数,适应不断变化的业务需求。 在实践中,Spring Cloud Netflix Hystrix的使用通常包含...

    springcloud hystrix 断路由

    现在,我们来看如何在 Spring Cloud 应用中集成和配置 Hystrix: 1. **依赖添加**:在 Maven 或 Gradle 的构建文件中添加 Spring Cloud Netflix Hystrix 的依赖。 2. **服务接口封装**:通过 `@HystrixCommand` ...

    spring cloud降级服务-hystrix.7z

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

    springcloud 熔断器Hystrix的具体使用

    springcloud 熔断器Hystrix 的具体使用 在微服务架构中,服务雪崩效应是一种常见的问题,它是由于基础服务的故障可能会导致级联故障,进而造成整个系统不可用的情况。熔断器是保护服务高可用的最后一道防线,它可以...

    spring cloud gateway配置Hystrix 熔断、限流、后台调用注意点.pdf

    在上面的代码中,我们可以看到使用 `f.hystrix(config -> config.setName("accept")` 配置了熔断器,名为 "accept"。并且设置了回退 URI 为 "forward:/gateway-fallback",这意味着当熔断器触发时,将会回退到该 URI...

    spring cloud hystrix原理介绍及使用

    - 熔断器模式:Hystrix通过熔断器来判断何时应该打开对某个服务的调用,何时应恢复调用。它通过统计一定时间窗口内的请求成功、失败、拒绝的次数来决定是否打开或关闭熔断器。 - 降级策略:如果熔断器处于打开状态...

    SpringCloud10-Hystrix熔断器学习代码及指定默认的全局兜底方法

    这个标题"SpringCloud10-Hystrix熔断器学习代码及指定默认的全局兜底方法"揭示了我们要讨论的主题——如何使用Hystrix进行熔断操作,并配置全局的 fallback 方法来处理服务调用失败的情况。 Hystrix的工作原理基于...

    spring-cloud-netflix-hystrix原理.rar

    Spring Cloud Netflix Hystrix 是一个强大的熔断器和断路器库,旨在帮助开发者构建弹性、容错的服务架构,以应对分布式系统中的延迟和故障。Hystrix 的设计目标是隔离服务之间的调用,防止服务级联失败,从而增强...

    《深入理解Spring Cloud与微服务构建》学习笔记(十八)~路由网关Spring Cloud Zuul~熔断器

    1. 添加依赖:在`pom.xml`文件中引入Spring Cloud的Zuul依赖,通常还包括Eureka(服务发现)和Hystrix(熔断器)。 2. 配置Zuul:在`application.yml`或`application.properties`中设置Zuul的相关属性,如路由规则...

    详解spring cloud分布式关于熔断器

    spring cloud分布式熔断器详解 熔断器是spring cloud分布式系统中的一种重要机制,用于防止服务之间的故障传播和雪崩效应。熔断器的出现是为了解决服务之间的依赖关系,避免某个服务的故障影响到其他服务。 什么是...

    Spring Cloud(Hystrix)使用.zip

    3. **熔断器**:Hystrix熔断器模式借鉴了电路保护机制,当错误率超过预设阈值时,熔断器打开,后续请求不再调用实际服务,而是直接返回失败结果或执行回退逻辑。 4. **短路器**:短路器模式与熔断器类似,但更侧重...

    SpringCloud项目源码下载.docx

    5. **Hystrix**:熔断器,用来防止服务间的依赖导致的雪崩效应,实现服务之间的隔离和容错。 6. **Zuul**:API网关,作为所有请求的入口,负责路由转发和过滤。 7. **Sleuth**:用于收集服务间的调用链路数据,便于...

    SpringCloud-使用熔断器防止服务雪崩-Ribbon和Feign方式示例代码.zip

    为了解决这个问题,我们可以采用熔断器模式,Spring Cloud 提供了 Hystrix 库来实现这一功能。Hystrix 是 Netflix 开源的一个用于处理分布式系统中延迟和故障的库,通过隔离服务调用、熔断保护和降级策略来确保系统...

    SpringCloud.rar

    Spring Cloud Netflix:核心组件,可以对多个Netflix OSS开源套件进行整合,包括以下几个组件: Eureka:服务治理组件,包含服务注册与发现 Hystrix:容错管理组件,实现了熔断器 Ribbon:客户端负载均衡的服务调用...

    springCloud 框架,整合feign,ribbon,熔断器

    在本项目中,我们关注的是如何整合 Feign、Ribbon 和熔断器,这些都是 SpringCloud 生态系统中的关键组件。 1. **Eureka**:Eureka 是 Netflix 提供的服务注册与发现组件。在分布式系统中,服务之间需要互相调用,...

    spring-cloud使用的各种示例

    - [springcloud(四):熔断器Hystrix](http://www.ityouknow.com/springcloud/2017/05/16/springcloud-hystrix.html) - [springcloud(五):熔断监控Hystrix Dashboard和Turbine]...

    springcloud:springcloud学习

    3. **Hystrix**:熔断器 Hystrix是处理服务降级、熔断、隔离的组件,防止因某个服务故障导致整个系统雪崩。它通过设置超时和熔断策略,保护系统在高并发或服务不稳定时仍能正常运行。 4. **Zuul**:API网关 Zuul...

Global site tag (gtag.js) - Google Analytics