`
valiant025
  • 浏览: 15369 次
  • 性别: Icon_minigender_2
  • 来自: 广州
社区版块
存档分类
最新评论

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: trueCOPY

其中新增了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";
    }
}
COPY

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

所有改动结束。

4. 测试

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

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

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

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

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

现在说明我们的测试已经成功了。(企业架构源码可以加求球:三五三六二四七二五九)

分享到:
评论

相关推荐

    springcloud 熔断器Hystrix的具体使用

    本篇文章主要介绍了springcloud 熔断器Hystrix的具体使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    SpringCloud之五 熔断器Hystrix

    SpringCloud之五 熔断器Hystrix,使用Hystrix熔断器结合Feign和ribbon来熔断微服务报错的情况

    SpringCloud10-Hystrix熔断器及服务熔断

    SpringCloud10-Hystrix熔断器及服务熔断

    SpringCloud之熔断器Hystrix的实现

    主要介绍了SpringCloud之熔断器Hystrix的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

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

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

    SpringCloud我服务基础教程

    SpringCloud我服务基础教程,包括服务注册中,服务提供者,服务消费端, RestTemplates,负载均衡Ribbon,Fegin,熔断器hystrix

    微服务架构与SpringCloud.pptx

    文档中详细介绍了spring cloud的相关组件,包含了服务发现与注册 Eureka,服务消费 Ribbon 和 Reign,链路监控 Sleuth,断路器(熔断器)Hystrix,分布式配置中心 Config,消息总线 Bus,服务网关 Zuul,Spring Boot...

    spring-cloud使用的各种示例

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

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

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

    SpringCloud与五大组件的整合.zip

    这是一个简单的SpringCloud整合五大组件注册中心Eureka、负载均衡Ribbon、熔断器Hystrix、伪装Feign、服务网关Zuu,旨在认识这五大组件,以及这五大组件该如何使用

    spring cloud Hystrix断路器的使用(熔断器)

    主要介绍了spring cloud Hystrix断路器的使用(熔断器),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    Spring Cloud项目技术解决方案闪电战

    项目集成了以下功能: ...2、Eureka用户认证 3、服务续约保活(心跳机制) 4、Eureka高可用 ...11、Hystrix熔断器 12、Hystrix隔离策略 13、Hystrix数据监控 14、Feign远程调用 15、Zuul服务网关 16、admin服务监控

    SpringCloud-Hystrix原理

    融断:当失败率达到阀值自动触发降级(如因网络故障/超时造成的失败率高),熔断器触发的快速失败会进行快速恢复。缓存:返回结果缓存,后续请求可以直接走缓存。请求合并:可以实现将一段时间内的请求(一般是对同一

    Hystrix熔断器项目.zip

    微服务架构中,会根据业务模块将系统划分为不同的模块,这些服务之间相互通过调用进行通信。但是不同的服务在不同的进程中进行,这时候服务通过远程调用的方式进行通信就可能发生...最后实feign也内置熔断器的功能。

    SpringCloud框架.pdf

    springcloud框架个人学习笔记;思维导图得形式,包括Eureka、Zuul、Ribbon、Feign、Hystrix(熔断器);这些组件的介绍和如何使用,的个人总结。

    SpringCloud分布式开发基础工程

    SpringCloud分布式开发基础工程,包括服务注册中心,服务提供者,服务消费者,服务调用的方式Rest和Fegin,配置中心,熔断器Hystrix等

    springcloud基础文档.docx

    springcloud基础文档,内涵框架技术的整合,Eureka、熔断器Hystrix和监控工具、配置中心、服务网关zuul、链路跟踪(我们公司最终是用nacos作为配置中心和服务中心,有技术问题可私信)

    SpringCloud的基本搭建

    SpringCloud的基本搭建,包含三个Eureka集群(7001,7002,7003)、一个熔断器监控面板(7004)、三个基本服务提供者(3001,3002,3003)、一个Hystrix(熔断器)服务提供者(3004)、一个基本消费者(30)、一个feign式消费者(31)...

    SpringCloud.rar

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

    springcloud微服务视频大全(资料+视频+代码)

    springcloud微服务视频大全(资料+视频+代码),Eureka,服务注册,服务发现,Feign,服务调用,Ribbon,负载均衡,hystrix,熔断器,zuul,API网关,Sidecar,异构服务,SpringCloudConfig,配置中心

Global site tag (gtag.js) - Google Analytics