`
田田万558
  • 浏览: 14372 次
社区版块
存档分类
最新评论

SpringCloud系列教程 | :熔断器Hystrix

 
阅读更多

1. 熔断器

服务雪崩

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

你以为这就是结束么,图样图森破,这才是噩梦的开始,在同一个调用链上的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新增

server:
  port: 8081
spring:
  application:
    name: spring-cloud-consumers
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/
feign:
  hystrix:
    enabled: true

 

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

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

package com.springcloud.consumers.fallback;

import com.springcloud.consumers.remote.HelloRemote;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestParam;

/**
 * Created with IntelliJ IDEA.
 *
 * @User: weishiyao
 * @Date: 2019/7/2
 * @Time: 23:14
 * @email: inwsy@hotmail.com
 * Description:
 */
@Component
public class HelloRemoteFallBack implements HelloRemote {
    @Override
    public String hello(@RequestParam(value = "name") String name) {
        return "hello " + name + ", i am fallback massage";
    }
}

 

3. 添加fallback属性

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

package com.springcloud.consumers.remote;

import com.springcloud.consumers.fallback.HelloRemoteFallBack;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

/**
 * @Author: shiyao.wei
 * @Date: 2019/7/2 11:14
 * @Version: 1.0
 * @Desc:
 */
@FeignClient(name= "SPRING-CLOUD-PRODUCER", fallback = HelloRemoteFallBack.class)
public interface HelloRemote {
    @RequestMapping(value = "/hello")
    String hello(@RequestParam(value = "name") String name);
}

 

所有改动结束。

4. 测试

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

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

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

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

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

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

 

分享到:
评论

相关推荐

    spring-cloud使用的各种示例

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

    最详细的 Spring Cloud 系列教程

    - **熔断器**:Spring Cloud Hystrix 提供了服务降级、熔断和隔离的策略,防止服务雪崩效应。 - **API网关**:Spring Cloud Gateway 是Spring Cloud生态中的API网关,用于统一处理请求转发、路由、过滤、限流等操作...

    SpringCloud黑马商城后端代码

    首先,Spring Cloud是基于Spring Boot的一套微服务解决方案,它提供了服务注册与发现、配置中心、API网关、负载均衡、熔断器、服务追踪等一系列微服务必备的组件。在“黑马商城”项目中,我们可以看到这些组件的具体...

    springcloud-基于Spring Boot的微服务开发框架

    其核心目标是通过利用 Spring Boot 的自动化配置特性,帮助开发者快速搭建分布式系统中的各个关键组件,例如服务发现、配置中心、熔断器、智能路由、消息总线、负载均衡、断路器、数据监控等。这些组件共同构成了一...

    spring_cloud.rar

    3. **Hystrix**或**Resilience4j**:是熔断器组件,用于保护服务免受级联故障的影响,当服务调用出现异常时,会快速失败并进入保护模式,防止系统雪崩。 4. **Ribbon**:是客户端负载均衡器,与Eureka结合使用,...

    springcloud视频学习6-2

    SpringCloud作为一个完整的微服务解决方案,它提供了包括服务注册与发现、配置中心、全链路监控、熔断器、负载均衡、API Gateway等一系列功能,帮助开发者快速构建复杂的分布式系统。 在描述中提到的学习资源被高度...

    SpringCloud面试题(2020最新版).pdf

    Dubbo 是阿里巴巴开源的分布式服务框架,侧重于 RPC 调用,而 Spring Cloud 更全面,不仅包含 RPC,还有服务发现、配置中心、熔断器、API 网关等功能,提供了一整套微服务解决方案。 面试题中的知识点: 1. 服务...

    基于 Spring Cloud 2021 、Spring Boot 2.7、 OAuth2 的 RBAC 权限管理系统源码

    Spring Cloud 2021作为微服务生态的重要组成部分,提供了服务发现、配置中心、负载均衡、熔断器、API网关等一系列微服务解决方案。例如,Eureka用于服务注册与发现,Zuul或Gateway作为API网关处理请求路由,Hystrix...

    springcloud+springcloudalibaba

    SpringCloud作为Spring生态系统中的微服务治理框架,提供了包括服务注册与发现、配置中心、熔断器、路由、负载均衡、消息总线、分布式会话、集群状态等全套解决方案。其中,Eureka是服务注册与发现组件,Hystrix是...

    spring-cloud分布式实战视频教程.txt

    通过以上分析可以看出,Spring Cloud为开发者提供了一套完整的微服务解决方案,不仅包括服务注册与发现、负载均衡、服务间调用等功能,还包括熔断器、API网关等高级特性。这些组件相互配合,可以极大地提高开发效率...

    Spring Cloud高级视频.txt

    Hystrix:熔断器 Hystrix是一个延迟和容错库,用于隔离远程系统、服务和第三方库的访问点,当出现故障时停止它们失败。它能够防止级联故障,确保单一模块的性能问题不会导致整个应用程序崩溃。通过设置熔断机制,...

    spring-cloud-study:spring cloud 学习 - 曾阿水

    5. **熔断器**:Hystrix是Netflix开源的容错管理工具,用于隔离服务调用,防止服务雪崩,提供降级、熔断、隔离等机制,保证系统的稳定。 6. **服务跟踪**:Spring Cloud Sleuth与Zipkin结合,提供了分布式追踪解决...

    didispace-SpringCloud-Learning-master.zip_java编程_redcck

    SpringBoot以其便捷的起步和自动化配置,使得开发更加高效,而SpringCloud则在此基础上提供了服务发现、负载均衡、熔断器、配置中心等一系列微服务治理功能。 在这个压缩包中,我们能看到一系列从1到20的章节,这...

    cloud2020-Study:spring cloud 2020 学习教程, 来源于尚硅谷

    4. **Hystrix熔断器** Hystrix是Netflix开源的一个用于处理分布式系统的延迟和容错的库,它实现了断路器模式,当服务调用出现故障时,能迅速切换到备用方案,防止整个系统因某个服务的故障而雪崩。 5. **Ribbon...

    springcloud:spring学习教程-把代码写成诗系列微服务服务治理服务中心服务提供服务消费熔断器网关eureka功能区feign hystrix网关

    在本教程中,我们将深入探讨Spring Cloud,这是一个用于构建分布式系统的服务发现、配置管理和工具集。Spring Cloud基于Spring Boot,简化了开发复杂分布式系统(如配置管理、服务发现、断路器、智能路由、微代理、...

    SpringCloud基于SpringBoot 分布式服务实现.zip

    在SpringBoot的基础上,SpringCloud进一步提供了服务发现、负载均衡、熔断器、配置中心、API网关等一系列微服务基础设施。 1. **服务发现**:SpringCloud借助Eureka实现了服务注册与发现。每个服务启动后,会向...

    springcloud-study:springcloud的学习

    7. **测试与监控**:使用Actuator进行健康检查,使用Hystrix Dashboard和Turbine进行熔断器的监控。 四、实战案例 1. **微服务构建**:创建多个微服务实例,如订单服务、商品服务等,各自注册到Eureka。 2. **服务...

    SpringCloudLearning:Spring Cloud学习笔记和演示

    Spring Cloud是中国开发者非常熟悉的一个微服务框架,它基于Spring Boot实现了包括服务发现、配置中心、负载均衡、熔断器、API网关、消息总线、服务跟踪等一系列功能,旨在简化微服务开发和部署的复杂性。...

    51CTO Spring Cloud 完整视频

    - **熔断器**:当某个服务出现故障时,熔断器会自动“打开”,从而阻止对该服务的进一步调用,直到服务恢复正常。 - **超时和重试机制**:设置调用超时时间,并在必要时进行重试。 - **降级机制**:当服务不可用时,...

    spring boot spring could

    Spring Cloud是对一系列开源软件的集合,它为开发者提供了构建分布式系统中的服务发现、配置中心、负载均衡、熔断器等功能。其中一些关键组件包括: - Eureka:服务注册与发现,使得服务能够相互找到彼此 - ...

Global site tag (gtag.js) - Google Analytics