目前我也在摸索着学习Spring Cloud,本节主要摸索的是服务熔断、服务降级、Hystrix服务监控。

一、Hystrix概述

(1)服务雪崩

  服务雪崩:多个微服务之间调用的时候,假设微服务A调用微服务B和微服务C,微服务B和微服务C又调用其他的微服务,这就是所谓的“扇出”。如果扇出的链路上某个微服务的调用响应时间过长或不可用,对微服务A的调用就会占用越来越多的系统资源,进行引起系统崩溃,所谓的“服务雪崩”。

  对于高流量的应用来说,单一的后端依赖可能会导致所有服务器上的所有资源都在几秒钟内饱和。比失败更糟糕的是,这些应用程序还可能导致服务之间的延迟增加,备份队列,线程和其他系统资源紧张,导致整个系统发生更多的联级故障。这些都表示需要对故障和延迟进行隔离和管理,以便单个依赖关系的失败,不能取消整个应用程序或系统。

(2)Hystrix是什么?

  Hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统中,许多依赖不可避免地会调用失败,比如超时、异常等,Hystrix能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性。

  “断路器”本身是一种开关装置,当某个服务单元发生故障之后,通过断路器的故障监控(类似熔断保险丝),向调用方返回一个符合预期的、可处理的备选响应(FallBack),而不是长时间的等待或抛出调用方无法处理的异常,这样就保证了服务调用方线程不会被长时间、不必要地占用,从而避免了故障在分布式系统中的蔓延,乃至雪崩。

  官网地址:https://github.com/Netflix/Hystrix

  本工程项目地址:https://github.com/Simple-Coder/microservice-demo-study

二、服务熔断

(1)服务熔断介绍

  服务熔断:熔断机制是应对雪崩效应的一种微服务链路保护机制。当扇出链路的某个微服务不可用或响应时间太长时,会进行服务的降级,进而熔断该节点微服务的调用,快速返回“错误”的响应信息。当检测到该节点的微服务调用响应正常后恢复调用链路。在Spring Cloud框架里熔断机制通过Hystix实现。Hystrix会监控微服务间调用的状况,当失败的调用到一定的阈值,缺省是5秒内20次调用失败就会启动熔断机制。熔断机制的注解是@HystrixCommand

(2)服务熔断工程搭建

1.Maven的模块结构图

2.microservice-provider-hystrix添加pom依赖

 <!--hystrix相关-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>

3.Controller层添加注解:@HystrixCommand

4.启动类添加注解:@EnableCircuitBreaker ,对hystrix熔断机制的支持

5.测试:依次启动3个Eureka、1个provider-hystrix、1个consumer

6.浏览器访问:http://localhost:7001/consumer/get/10999

  至此,服务熔断模块测试完成!

三、服务降级

  服务的降级处理是在客户端实现完成,与服务端没有关系。在服务熔断机制下,每个方法都要有一个对应的注解HystrixCommand和fallback方法,这样显然是不合适的,而且对本身业务也有侵入性。所以服务降级可以实现上述逻辑的解耦和分离。而这里又是面向接口编程,所以自然想到了将异常等处理逻辑与接口进行绑定,即可实现对业务本身无侵入,实现解耦。服务降级过程实现如下:

(1)Maven模块结构图(主要操作以下两个模块)

(2)根据已有的接口ConsumerClientService

  新建一个实现了FallBackFactory接口的类ConsumerClientServiceFallbackFactory

(3)修改已有接口:ConsumerClientService注解相关配置

(4)microservice-consumer-feign模块application.yml配置文件修改

(5)测试:依次启动3个eureka、3个provider、1个consumer-feign

(6)浏览器访问:http://localhost:7001/consumer/get/1001

(7)手动关闭3个provider,继续访问:http://localhost:7001/consumer/get/1001

  至此、服务降级已经测试完成!

四、服务监控HystrixDashboard

  除了隔离依赖服务的调用以外,Hystrix还提供了准实时的调用监控(Hystrix Dashboard),Hystrix会持续地记录通过Hystrix发起的请求的执行信息,并以统计报表和图形的形式展示给用户,包括每秒执行多少请求多少成功,多少失败等。Netflix通过hystrix-metrics-event-stream项目实现了对以上指标的监控。Spring Cloud也提供了Hystrix Dashboard的整合,对监控内容的转成可视化界面。

(1)Maven模块工程结构图

(2)microservice-consumer-hystrix-dashboard模块添加pom依赖

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

pom

(3)启动类增加注解@EnableHystrixDashboard

(4)application.yml文件修改

(5)启动microservice-consumer-hystrix-dashboard:localhost:6001/hystrix,出现以下界面说明搭建完成

(6)测试:依次启动3个eureka、1个provider-hystrix

(7)浏览器访问:http://localhost:9001/hystrix.stream,这种页面显然是不好看的。

(8)填写监控地址:http://localhost:9001/hystrix.stream

(9)不断刷新点击:http://localhost:9001/provider/get/1001,查看以下报表

(10)查看结果?

  简记:7色,1圈,1线

  7个颜色分别对应有英文提示说明;

  1圈越大,说明该服务的访问频率越高,流量压力也比较大;

  1线就很明显了,实时的调用频率。

  说明

    ①实心圆:两层含义,它通过颜色的变化代表了实例的健康程度,它的健康程度从绿色<黄色<橙色<红色依次递减。此外,它的大小也会根据实例的请求流量发生变化,流量越大该实心圆就越大。所以通过实心圆的展示,就可以在大量的实例中快速的发现故障实例和高压力实例。

    ②曲线:用来记录2分钟内的相对变化,可以通过它来观察到流量的上升和下降趋势。

    

  至此,服务监控的搭建完成!

五、总结

  ①服务熔断:@HystrixCommand(fallback="xxx"),@EnableCircuitBreaker支持对服务熔断的机制

  ②服务降级:客户端实现,与服务端没有关系,实现解耦,与@FeignClient结合使用

  ③服务监控:HystrixDashboard,使用非常简单@EnableHystrixDashboard

 

SpringCloud全家桶学习之断路器---Hystrix(五)的更多相关文章

  1. SpringCloud全家桶学习之Feign负载均衡----Feign(四)

    一.Feign概述 (1)Feign是什么? 官网地址:https://projects.spring.io/spring-cloud/spring-cloud.html#spring-cloud-f ...

  2. SpringCloud全家桶学习之分布式配置中心----Config(七)

    一.概述 (1)背景 微服务意味着将单体应用中的业务拆分成一个个子服务,每个服务的粒度相对较小,因此系统中出现大量的服务.由于每个服务都需要配置必要的配置信息才能运行,所以一套集中式的.动态的配置管理 ...

  3. SpringCloud全家桶学习之一阶段总结(一)

    一.概述 前几篇小博客记录了我学习SpringCloud组件的过程,并与工作中所用的Dubbo框架做了一点比较,基本组件:Eureka.Ribbon.Hystrix.Feign.Zuul.Config ...

  4. SpringCloud全家桶学习之服务注册与发现及Eureka高可用集群搭建(二)

    一.Eureka服务注册与发现 (1)Eureka是什么? Eureka是NetFlix的一个子模块,也是核心模块之一.Eureka是一个基于REST的服务,用于定位服务,以实现云端中间层服务发现和故 ...

  5. SpringCloud全家桶学习之概览(一)

    一.概览 根据百度百科的描述,微服务架构是一项在云中部署应用和服务的新技术.而SpringCloud是微服务架构思想的一个具体实现,它为开发人员提供了构建分布式系统中一些常见模式的工具(服务注册与发现 ...

  6. SpringCloud全家桶学习之消息总线---SpringCloud Bus

    一.概述 ConfigClient(微服务)从ConfigServer端获取自己对应的配置文件,但是目前的问题是:当远程git仓库配置文件发生改变时,每次都是需要重启ConfigCient(微服务), ...

  7. SpringCloud全家桶学习之客户端负载均衡及自定义负载均衡算法----Ribbon(三)

    一.Ribbon是什么? Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端  负载均衡的工具(这里区别于nginx的负载均衡).简单来说,Ribbon是Netf ...

  8. SpringCloud全家桶学习之路由网关----Zuul(六)

    一.Zuul概述 (1)Zuul是什么? Zuul包含了对请求的路由和过滤的两个最主要的功能,其中路由功能负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础:而过滤功能则负责对请求的 ...

  9. 框架用多了真的会死人的,spring-cloud全家桶与mybitais 集成完整示例(附下载)

    ​ 题外话: 看到这一长串包含各种技术名词的标题,一路走来感觉研发深深的被各种框架给绑架了,从我们刚出生最简单的jsp,servlet打天下,到spring mvc的盛行,再到现在spring-boo ...

随机推荐

  1. dp--B - Hard problem

    B - Hard problem Vasiliy is fond of solving different tasks. Today he found one he wasn't able to so ...

  2. Safari 导航栏

    目录 引子 隐藏 Safari 导航栏 显示 Safari 导航栏 iPhone 系统占比 参考资料 引子 最近在 iPhone 的 Safari 查看 h5 页面时,发现有些平台的页面向下滚动时,顶 ...

  3. HTMLinput标签

    <input> 标签用于搜集用户信息. 常用的属性: type指定输入项的类型 name定义 input 元素的名称. id给输入项取一个名字,方便后期找到和操作 type指定输入项的类型 ...

  4. 【资料】哈代&拉马努金相关,悼文,哈佛演讲,及各种杂七杂八资料整理

    悼文和哈佛演讲,因为有一堆公式所以实在懒得放lofter了. 信件和其他资料翻译在这里放个备份,基本上来自<Ramanujan:Letters and commentary>和<Ra ...

  5. Go反射

    一.引入 不同语言的反射模型不尽相同,有些语言还不支持反射.<Go 语言圣经>中是这样定义反射的: Go 语言提供了一种机制在运行时更新变量和检查它们的值.调用它们的方法,但是在编译时并不 ...

  6. 洛谷 P4555 [国家集训队]最长双回文串(Manacher)

    题目链接:https://www.luogu.com.cn/problem/P4555 首先明白两个回文串,那么要使两个回文串成立,那么我们只能把$'#'$作为中间节点. 然后我们跑一边Manache ...

  7. docker镜像 - 下载、创建镜像和导入导出镜像

    实验环境 CentOS 7.5 安装并启动docker yum install -y docker systemctl start docker 镜像 安装镜像 docker pull [OPTION ...

  8. Gevent和猴子补丁

    定义 在2018年看Flutent python时了解到猴子补丁,知道咋回事,但是现在通过代码更深刻认识猴子补丁. 猴子补丁:在运行时修改类或模块,而不改动源码. 例子1 没有用猴子补丁 import ...

  9. 第二十七篇 玩转数据结构——集合(Set)与映射(Map)

          1.. 集合的应用 集合可以用来去重 集合可以用于进行客户的统计 集合可以用于文本词汇量的统计   2.. 集合的实现 定义集合的接口 Set<E> ·void add(E) ...

  10. 用eclipse发布springboot项目

    使用eclipse打包springboot项目时一直报错 [ERROR] No compiler is provided in this environment. Perhaps you are ru ...