目前我也在摸索着学习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. python3练习100题——023

    再做一道,把这周的任务搞定- 其实看到这道题,很熟悉,让我想起大一时被C语言支配的恐惧.那个时候不停的在push自己,给自己很大的压力.上C语言课的时候让人昏昏欲睡,但是还是逼迫自己打起精神来学习,一 ...

  2. MANIFEST.MF详解及配置的注意事项

    一.详解 打开Java的JAR文件我们经常可以看到文件中包含着一个META-INF目录, 这个目录下会有一些文件,其中必有一个MANIFEST.MF,这个文件描述了该Jar文件的很多信息,下面将详细介 ...

  3. mysql之case..when ..then..else..end as..用法

    1.示例1 查询1: SELECT CASE main_xm_sam31 WHEN '02' THEN 2 ELSE 1 END AS SPDJ FROM SR_MAIN_BG A WHERE A.P ...

  4. 解决VS2013报错fopen、sprintf等函数安全的问题

    VS2013中使用fopen.sprintf等函数是会出现安全问题: error C4996: 'fopen': This function or variable may be unsafe. Co ...

  5. EAC3 mantissa quantization(VQ & GAQ)

    EAC3基于hebap来决定mantissa的quantizer. hebap如下: mantissa 使用VQ(vector quantization) 和GAQ(gain adaptive qua ...

  6. django 0

    web 框架的本质 - socket服务端 socket 收发消息 根据不同的路径返回不同的内容 模板渲染 jinja2 字符串替换 mvc model(模型/db) view(展示html) con ...

  7. mysql忘记密码,更改密码

    对MySQL有研究的读者,可能会发现MySQL更新很快,在安装方式上,MySQL提供了两种经典安装方式:解压式和一键式,虽然是两种安装方式,但我更提倡选择解压式安装,不仅快,还干净.在操作系统上,My ...

  8. 博客下方有一个2D动画

    第一步 第二步 第三步 将下面一段代码放入 支持 js代码的那里  (如果没有申请是不可以使用js代码的,记得申请) <script src="https://eqcn.ajz.mie ...

  9. Leetocde的两道丑数题目:264. 丑数 II➕313. 超级丑数

    Q: A: 用变量记录已经✖2.✖3.✖5的元素下标i2.i3.i5.表示截止到i2的元素都已经乘过2(结果添加到序列尾部的意思),i3.i5同理.这样每次可以循环可以O(1)时间找到下一个最小的丑数 ...

  10. IntelliJ IDEA 2017.3尚硅谷-----修改类头的文档注释信息

    /** @author shkstart @create ${YEAR}-${MONTH}-${DAY} ${TIME} */ ${PACKAGE_NAME} - the name of the ta ...