前言:微服务架构应用的特点就是多服务,而服务层之间通过网络进行通信,从而支撑起整个应用系统,所以,各个微服务之间不可避免的存在耦合依赖关系。但任何的服务应用实例都不可能永远的健康或网络不可能永远的都相安无事,所以一旦某个服务或局部业务发生了故障,会导致系统的不可用,我们知道当故障累积到一定程度就会造成系统层面的灾害,也就是级联故障,也叫雪崩效应,所以微服务需要在故障累计到上限之前阻止或疏通这些故障以保证系统的稳固安全,在市面上已经有很多这样的框架来解决这样的问题,如Twitter的Finagle、Netflix的Hystrix和Google的Stubby等,下面就简单介绍下Hystrix和Hystrix在SpringCloud中的应用。

一、Hystrix简介

  Hystrix(https://github.com/Netflix/Hystrix)是由Netflix开源的一个延迟和容错库,用于隔离访问远程系统、服务或者第三方库,防止级联失败,从而提升系统的可用性、容错性与局部应用的弹性,是一个实现了超市机制和断路器模式的工具类库。

二、Hystrix如何解决依赖隔离

  

  1、包裹请求:使用HystrixCommand包裹对依赖的调用逻辑,每个命令在独立的线程中执行,使用了设计模式中的“命令模式”;
  2、跳闸机制:当某服务的错误率超过一定阈值时,Hystrix可以自动或者手动跳闸,停止请求该服务一段时间;
  3、资源隔离:Hystrix为每个依赖都维护了一个小型的线程池(或者信号量)。如果该线程已满,则发向该依赖的请求就会被立即拒绝,而不是排队等候,从而加速失败判定;
  4、监控:Hystrix可以近乎实时地监控运行指标和配置的变化,例如成功、失败、超时、以及被拒绝的请求等;
  5、回退机制:当请求失败、超时、被拒绝,或当断路器打开时,执行回退逻辑,回退逻辑由开发人员自行提供,如返回一个缺省值;
  6、自我修复:断路器打开一段时间后,会自动进入“半开”状态,此时断路器可允许一个请求访问依赖的服务,若请求成功,则断路器关闭,否则断路器转为“打开”状态;

三、Hystrix在SpringCloud中的简单应用

1、简单整合Hystrix(在这部分会用到Ribbon测试的相关项目)

  ①、创建基于Eureka和Ribbon的服务端 eureka-ribbon-server和两个客户端生产者 eureka-ribbon-client2、消费者:复制项目eureka-ribbon-client,将AritfactId修改为eureka-hystrix-client;

  ②、在消费者中添加依赖:

  1. <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-hystrix</artifactId>
    </dependency>

  ③、在启动类ClientApplication上添加@EnableHystrix或@EnableCircuitBreaker;

  ④、修改HystrixController,在其中添加getUser方法,并添加熔断回调方法注解及回调方法:

  1. @HystrixCommand(fallbackMethod = "getDefaultUser")
    @RequestMapping("/getUser")
    public String getUser() {
    return restTemplate.getForObject("http://client-87/getUser", String.class);
    }
  2.  
  3. private String getDefaultUser() {
    System.out.println("熔断,默认回调函数");
    return "{\"username\":\"admin\",\"age\":\"-1\"}";
    }

  ⑤、分别启动eureka-ribbon-server、eureka-ribbon-client2、eureka-hystrix-client,调用localhost:8765/getUser,如图:


  ⑥、关掉eureka-ribbon-client2后,再次调用,发现熔断器调用了回调函数,如图:

  关于Hystrix的配置属性,可以自行测试了解:https://github.com/Netflix/Hystrix/tree/master/hystrix-contrib/hystrix-javanica#configuration

  而我们如何知道hystrix是否开启,可以通过SpringBoot Actuator组件查看,注意:出发回调并不是hystrix打开,他的状态还处在关闭,若失败率达到阈值(默认为5秒内20次失败)后才会打开;

2、基于Feign使用Hystrix

  通常情况下的Hystrix是通过注解@HystrixCommand的fallbackMethod属性实现回调的,而在Feign中,由于Feign是用借口实现的声明式Rest,所以Hystrix的通用方法在这里就不适用于Feign了,实际上在Feign与SpringCloud的依赖库中已经默认的将Hystrix加入其中了,如图:

  那么,该怎么实现呢?

  1. 将上面通用Hystrix的项目中的消费者模块修改为,由于feign中已经集成了hystrix类库,所以就不需要重复导入了:

  pom.xml:

  1. <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-feign</artifactId>
    </dependency>

  application.properties属性配置文件:

  1. server.port=8762
    spring.application.name=client-8762
    #默认feign的hystrix为关闭状态
    feign.hystrix.enabled=true
    eureka.client.service-url.defaultZone=http://localhost:8761/eureka/

  启动类添加@EnableFeignClients,控制层通过注入feign的接口去完成声明式调用:

  feign的接口:

  1. package com.cn.feign;
  2.  
  3. import org.springframework.cloud.netflix.feign.FeignClient;
  4. import org.springframework.web.bind.annotation.RequestMapping;
  5. //接口类上加入的注解中添加属性fallback,指定回调类
  6. @FeignClient(name = "CLIENT-87",fallback = FeignClientFallback.class)
  7. public interface UserFeign {
  8.  
  9. @RequestMapping("/getUser")
  10. public String getUser();
  11.  
  12. }

  创建回调类:

  1. package com.cn.feign;
  2.  
  3. import org.springframework.stereotype.Component;
  4.  
  5. /**
  6. * @Description: 回调实现类
  7. * @Param:
  8. * @return:
  9. * @Author:
  10. * @Date: 2018/6/19
  11. */
  12. @Component
  13. class FeignClientFallback implements UserFeign {
  14.  
  15. @Override
  16. public String getUser() {
  17. System.out.println("熔断,默认回调函数");
  18. return "{\"username\":\"admin\",\"age\":\"-1\"}";
  19. }
  20. }

  2.测试结果如下:

  在未关闭生产者服务实例时:

  关闭实例后:

代码示例:https://gitee.com/lfalex/springcloud-example( eureka-hystrix-client、 eureka-feign-hystrix-client、 eureka-ribbon-client2、 eureka-ribbon-server

参考书籍:《SpringCloud与Docker微服务架构实战》周力著

SpringCloud-容错处理Hystrix熔断器(五)的更多相关文章

  1. SpringCloud学习(6)——Hystrix熔断器

    分布式系统面临的问题 复杂的分布式体系结构中的应用程序有数十个依赖关系, 每个依赖关系在某些时刻不可避免的失败. 服务雪崩效应 多个微服务调用的时候, 假设微服务A调用微服务B和微服务C, 微服务B和 ...

  2. SpringCloud之初识Hystrix熔断器 ----- 程序的保护机制

    在上一篇的-负载均衡Robbin中,我们简单讲解到负债均衡的算法和策略.负载均衡就是分发请求流量到不同的服务器,以减小服务器的压力和访问效率,但是当负载均衡的某个服务器或是服务挂掉之后,那么程序会出现 ...

  3. 基于springcloud搭建项目-Hystrix篇(五)

    1.概述 (1).首先要知道分布式系统面临的问题复杂分布式体系结构中应用程序有数十个依赖关系,每个依赖关系在某些时候将不可避免的失败 (2).服务雪崩 多个服务之间相互调用的时候,假设微服务A调用微服 ...

  4. Spring-Cloud之Hystrix熔断器-5

    一.在分布式系统中,服务与服务之间的依赖错综复杂,一种不可避免的情况就是某些服务会出现故障,导致依赖于它们的其他服务出现远程调度的线程阻塞 Hystrix是Netflix 公司开源的一个项目,它提供了 ...

  5. springcloud之hystrix熔断器-Finchley.SR2版

    本篇和大家分享的是springcloud-hystrix熔断器,其主要功能是对某模块调用失败做断路和降级,简单点就当某个模块程序出问题了并达到某阈值就限制后面请求,并降级的方式提供一个默认返回数据.最 ...

  6. SpringCloud无废话入门04:Hystrix熔断器及监控

    1.断路器(Circuit Breaker)模式 在上文中,我们人为停掉了一个provider,在实际的生产环境中,因为意外某个服务down掉,甚至某一层服务down掉也是会是有发生的.一旦发生这种情 ...

  7. Spring Cloud Hystrix 熔断器(五)

    序言 感觉hystrix很精彩,文档讲的也很好,这篇总结到哪里是哪里吧 写Hystrix之前,我们先简单的说说熔断器,和限流,这样你看完之后,就可以很容易理解Hystrix 熔断器 熔断器模式源于Ma ...

  8. 服务容错保护断路器Hystrix之五:配置

    接着<服务容错保护断路器Hystrix之二:Hystrix工作流程解析>中的<2.8.关于配置>再列举重要的配置如下 一.hystrix在生产中的建议 1.保持timeout的 ...

  9. Spring Cloud(四):服务容错保护 Hystrix【Finchley 版】

    Spring Cloud(四):服务容错保护 Hystrix[Finchley 版]  发表于 2018-04-15 |  更新于 2018-05-07 |  分布式系统中经常会出现某个基础服务不可用 ...

  10. SpringCloud系列-整合Hystrix的两种方式

    Hystrix [hɪst'rɪks],中文含义是豪猪,因其背上长满棘刺,从而拥有了自我保护的能力.本文所说的Hystrix是Netflix开源的一款容错框架,同样具有自我保护能力. 本文目录 一.H ...

随机推荐

  1. [翻译] UIColor-uiGradientsAdditions

    UIColor-uiGradientsAdditions https://github.com/kaiinui/UIColor-uiGradientsAdditions Beautiful color ...

  2. swift如何打印对象的地址

    swift如何打印对象的地址 打印对象的地址还是有着很多实用价值的,在swift中,你可以用以下的方式打印一个对象的地址: 打印结果: 有时候,if let a = b 这种操作会给人一种错觉,认为 ...

  3. 基于scrapyd爬虫发布总结

    一.版本情况 python以丰富的三方类库取得了众多程序员的认可,但也因此带来了众多的类库版本问题,本文总结的内容是基于最新的类库版本. 1.scrapy版本:1.1.0 D:\python\Spid ...

  4. LinkedHashSet 元素唯一,存储取出有序

      package cn.itcast_04; import java.util.LinkedHashSet; /* * LinkedHashSet:底层数据结构由哈希表和链表组成. * 哈希表保证元 ...

  5. zhuangxiu

    红宝石家居广场国际家居馆 党湾综合市场(青年文明路)

  6. November 5th Week 45th Saturday 2016

    The longest day has an end. 最难过的日子也会有尽头. No, no, no, I can't see the end of such days, of course, if ...

  7. 词组查询以及多值映射等SolrNet使用中的细节问题

    转自:http://www.duxuan.cn/doc/6896594.html

  8. Z :彻底了解指针数组,数组指针以及函数指针 [复

    原创 :彻底了解指针数组,数组指针以及函数指针 [复制链接] 00 roking 白手起家 帖子 60 主题 16 精华 0 可用积分 74 专家积分 0 在线时间 0 小时 注册时间 2003-10 ...

  9. print(dir(...)) 打印对象或者类中的方法和函数

  10. #002 Emmet完整API

    介绍 这里包含了,所有的Emmet API,非常的详细,但是有一点详细过头了,如果只想快速上手,那么推荐<#001 Emmet的API图片> Emmet (前身为 Zen Coding) ...