在微服务项目中,一个系统可以分割成很多个不同的服务模块,不同模块之间我们通常需要进行相互调用。springcloud中可以使用RestTemplate+Ribbon和Feign来调用(工作中基本都是使用feign)。有时为了提高系统的健壮性,某些访问量大的服务模块还会做集群部署。但是服务之间的调用不可能百分之百成功的,如果出现超时、异常会导致服务无法提供功能。这时如果有大量请求访问异常服务,就会造成系统资源耗尽,导致服务瘫痪。服务与服务之间的依赖性,故障会传播,会对整个微服务系统造成灾难性的严重后果,这就是服务故障的“雪崩”效应。在实际工作中,复杂的系统往往有成百上千个服务模块,某个功能模块出现异常,不能影响其它功能的正常运行,所以熔断器Hystrix就派上用场了。

一、Hystrix简介:

Hystrix由Netfilix API团队研发于2011年,2012年开始在Hystrix公司内部推广和使用,Hystrix在Netflix中久经沙场,现在已经是一个非常成熟的系统,而最近流行的微服务架构和Spring Cloud,让Hystrix成为了配套的基础设施,在国内也逐渐流行起来。

hystrix的出现即为解决服务雪崩效应,它通过四个方面的机制来解决这个问题

1. 隔离(线程池隔离和信号量隔离):限制调用分布式服务的资源使用,某一个调用的服务出现问题不会影响其他服务调用。

2. 降级:超时降级、资源不足时(线程或信号量)降级,降级后可以配合降级接口返回托底数据。

3. 熔断:当失败率达到阀值自动触发降级(如因网络故障/超时造成的失败率高),熔断器触发的快速失败会进行快速恢复。

4. 缓存:提供了请求缓存、请求合并实现。

如果想要了解更多的Hystrix的底层及实现原理,可以参考相关文章学习,本系列主要讲解如何快速在工作中使用Hystrix。

二、环境准备:

最终目录结构:

本系列文章,都是层层递进的,本章内容在前面搭建好的项目框架上进行开发讲解,对搭建springcloud的多模块子项目框架不清楚的同学可以参考 :一起来学Spring Cloud | 第一章 :如何搭建一个多模块的springcloud项目

工作中,我们基本上都是使用feign进行服务调用的,所以本章只讲解Feign中使用断路器,对上一章feign工程搭建有兴趣的可以参考:一起来学Spring Cloud | 第四章:服务消费者 ( Feign )

三、Feign中使用断路器:

1. 在上章的springcloud-feign-client工程的application.properties配置文件中,加入配置:feign.hystrix.enabled=true

server.port=9600
spring.application.name=springcloud-feign-client
eureka.client.serviceUrl.defaultZone=http://localhost:8761/eureka/
feign.hystrix.enabled=true

2. 在上章的springcloud-feign-client工程中,新增一个FeignRemoteService类的实现类,命名为:HystrixFeignRemoteCallBack,做为出现接口异常时的回调方法

package com.haly.romote.hystrix;import org.springframework.stereotype.Component;import com.haly.romote.FeignRemoteService;@Component
public class HystrixFeignRemoteCallBack implements FeignRemoteService{@Overridepublic String hello(String name) {// TODO Auto-generated method stubreturn name + ",Due error,enter Hystrix";}}

3. 在上章的springcloud-feign-client工程中,新增一个FeignRemoteService类中加入回调实现类的注解配置

package com.haly.romote;import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;import com.haly.romote.hystrix.HystrixFeignRemoteCallBack;@FeignClient(value = "springcloud-eureka-client",fallback = HystrixFeignRemoteCallBack.class)
public interface FeignRemoteService {@RequestMapping(value = "/hello",method = RequestMethod.GET)public String hello(@RequestParam(value = "name") String name);}

4. 运行项目

① 先启动springcloud-eureka-server模块,开启eureka注册中心

② 启动springcloud-eureka-client模块,开启提供远程服务功能,并且提供接口能力 /hello

③ 启动springcloud-feign-client模块,开启消费模块,用来调用springcloud-eureka-client模块中的/hello接口

Eureka上的注册信息,如下图:

打开浏览器,输入网址:http://localhost:9600/getHello?name=young码农,运行结果如下:

我们模仿生产环境,服务提供者宕机(或者返回超时),这里我们手动停掉springcloud-eureka-client服务

输入网址:http://localhost:9600/getHello?name=young码农

本章我们只是在回调接口中,返回一个字符串,工作中,有些场景会做一些业务逻辑处理(比如调用短信发送接口,出现异常会在记录一条异常日志,后面来处理这些异常)。

工作中我们会遇到很多特殊场景,特别在访问量过大,业务较复杂的时候,会出现一些奇奇怪怪的问题,所以Feign,Hystrix有许多配置项可以使用,我们可以根据相应业务配进行合理配置

转载于:https://www.cnblogs.com/haly/p/10905469.html

一起来学Spring Cloud | 第五章:熔断器 ( Hystrix)相关推荐

  1. Spring Cloud第五章:服务网关Zuul

    在微服务架构中,需要几个关键的组件,服务注册与发现.服务消费.负载均衡.断路器.智能路由.配置管理等,由这几个组件可以组建一个简单的微服务架构,如下图: 客户端的请求首先经过负载均衡(zuul.Ngn ...

  2. 告诉老默我想学Spring Cloud了(新手篇):从0到1搭建Spring Cloud项目(实际项目开发的浓缩精华版)

    告诉老默我想学Spring Cloud了(新手篇):从0到1搭建Spring Cloud项目 一.前言 二.如何选择版本 2.1 SpringCloud 和 Spring Boot 版本选型 2.1. ...

  3. 《深入理解 Spring Cloud 与微服务构建》第九章 熔断器 Hystrix

    <深入理解 Spring Cloud 与微服务构建>第九章 熔断器 Hystrix 文章目录 <深入理解 Spring Cloud 与微服务构建>第九章 熔断器 Hystrix ...

  4. 跟我学Spring Cloud(Finchley版)-10-Feign深入

    上一节( 跟我学Spring Cloud(Finchley版)-09-Feign )讲了Feign的入门姿势并深入对比了RestTemplate,本节来深入探讨Feign的高级特性.总的来说,Feig ...

  5. 跟我学Spring Cloud(Finchley版)-07-Ribbon入门

    经过前文讲述,我们已经实现了服务发现.本节来解决 跟我学Spring Cloud(Finchley版)-02-构建分布式应用 提到的如下问题: 负载均衡如何考虑?难道得在电影微服务和用户微服务之间加个 ...

  6. hystrix 全局熔断_跟我学Spring Cloud(Finchley版)14Feign使用Hystrix

    Feign默认已经整合了Hystrix,本节详细探讨Feign使用Hystrix的具体细节. 服务降级 1 加配置,默认Feign是不启用Hystrix的,需要添加如下配置启用Hystrix,这样所有 ...

  7. 跟我学Spring Cloud(Finchley版)-04-服务注册与服务发现-原理剖析

    为什么80%的码农都做不了架构师?>>>    第2节( 跟我学Spring Cloud(Finchley版)-02-构建分布式应用 )说过: 地址硬编码问题--电影微服务中将用户微 ...

  8. Spring Cloud第四章:熔断器Hystrix

    在微服务架构中,根据业务来拆分成一个个的服务,服务与服务之间可以相互调用(RPC),在Spring Cloud可以用RestTemplate+Ribbon和Feign来调用.为了保证其高可用,单个服务 ...

  9. Spring Cloud第六章:配置中心Config

    在上一篇文章讲述zuul的时候,已经提到过,使用配置服务来保存各个服务的配置文件.它就是Spring Cloud Config. 一.简介 在分布式系统中,由于服务数量巨多,为了方便服务配置文件统一管 ...

最新文章

  1. 【IP地址の乾坤大挪移】C语言实现“IP地址/数字”互转
  2. Angular 应用 bootstrapModule 映射的 app Component 的初始化逻辑
  3. 1110: 最近共同祖先(函数专题)
  4. 学习Spring Boot:(二十二)使用 AOP
  5. linux查看xml文件的配置,3、kvm虚拟机日常管理与配置
  6. thinkphp php 5.2,ThinkPHP5.2:时间查询(改进、优化)
  7. 每日一程-4. PyQt5-实现显示和业务逻辑分离
  8. oracle date 截取年月,在Oracle中,可用于提取日期时间类型特定部分(如年、月、日、时、分、秒)的函数有那些...
  9. LeetCode题解之Single Number
  10. CSP-J (初中级别比赛)初赛总结
  11. 时尚【女连衣裙秋季新款连衣裙】搭配技巧
  12. 关于VB提示ByRef参数类型不符的分析
  13. 数字图像处理第三章part2
  14. android 蓝牙sco开发
  15. 高德地图使用-高亮省市区
  16. 金字塔原理4个基本原则_总结盆景养护的4个原则
  17. 静态编译qemu_如何用QEMU运行x86 kernel
  18. 数仓知识10_数据泛化
  19. Android实战:手把手实现“捧腹网”APP(二)-----捧腹APP原型设计、实现框架选取...
  20. Python基础(2.3w字,无一废话)---最新更新2021.7.18

热门文章

  1. [zz]GNU C __attribute__ 机制简介
  2. Yolov5 使用精灵标注助手制作数据集
  3. C语言 下标运算符和指针运算符
  4. 10-03视图的优缺点及注意事项
  5. 使用Python管理Azure(1):基础配置
  6. [ios2]iOS 使用subversion管理iOS源代码 【转】
  7. KDE Web开辟工具──KDE-Webdev
  8. 在sql查询中使用表变量
  9. XtraBackup出现 Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock'
  10. Object.defineProperty与双向绑定、数据监听