SpringClound——Hystrix断路器
SpringCloud学习资料汇总超级棒的
如上是我在看文章时忽然看到的一个很好的学习SpringCloud的网站
SpringClound——微服务概述——史上最烂
SpringClound——SpringClound入门概述——史上最烂
SpringCloud——Eureka——史上最基本
SpringClound——Ribbon负载均衡——史上最烂系列
SpringClound——Feign
SpringClound——Hystrix断路器
文章目录
- 1:Hystrix断路器介绍
- 2:服务熔断
- 3:服务降级
- 4:服务限流
- 5:豪猪hystrixDashboard
- 6:Hystrix 工作流程
1:Hystrix断路器介绍
- Hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,比如超时、异常等Hystrix能够保证在一个依赖出问题的情况下, 不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性。
- “断路器”本身是一种开关装置,当某个服务单元发生故障之后,通过断路器的故障监控(类似熔断保险丝),向调用方返回一个符合预期的、可处理的备选响应(FallBack) ,而不是长时间的等待或者抛出调用方无法处理的异常,这样就保证了服务调用方的线程不会被长时间、不必要地占用,从而避免了故障在分布式系统中的蔓延,乃至雪崩。
多个微服务之间调用的时候,假设微服务A调用微服务B和微服务C,微服务B和微服务C又调用其它的微服务,这就是所谓的“扇出”。如果扇出的链路上某个微服务的调用响应时间过长或者不可用,对微服务A的调用就会占用越来越多的系统资源,进而引起系统崩溃,所谓的“雪崩效应”.
对于高流量的应用来说,单一的后端依赖可能会导致所有服务器上的所有资源都在几秒钟内饱和。比失败更糟糕的是,这些应用程序还可能导致服务之间的延迟增加,备份队列,线程和其他系统资源紧张,导致整个系统发生更多的级联故障。这些都表示需要对故障和延迟进行隔离和管理,以便单个依赖关系的失败,不能取消整个应用程序或系统。
- 可以干嘛:服务降级,服务熔断,服务限流,接近实时监控
2:服务熔断
- 熔断机制是应对雪崩效应的一种微服务链路保护机制。
- 过程:服务降级-》进而熔断-》恢复调用链路
- 当扇出链路的某个微服务不可用或者响应时间太时,会进行服务的降级,进而熔断该节点微服务的调用,快速返回"错误”的响应信息。当检测到该节点微服务调用响应正常后恢复调用链路。在SpringCloud框架里熔断机制通过Hystrix实现。 Hystrix会监控微服务间调用的状况,当失败的调用到一定阈值,缺省是5秒内20次调用失败就会启动熔断机制。熔断机制的注解是@HystrixCommand.
- 使用@HystrixCommand.,需要在pom文件中引入如下maven
<!-- hystrix --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-hystrix</artifactId></dependency>
- 熔断类型
熔断打开:
请求不再进行调用当前服务。内部设置时钟-般为MTTR (平均故障处理时间)。当打开时长达到所设时钟则进入半熔断状态
熔断关闭:
熔断关闭不会对服务进行熔断
熔断半开:
部分请求根据规则调用当的服务,如果请求成功目符合规则则认为当前服务恢复正常,关闭熔断
- 断路器开关或者关闭条件
1:当满足一定的阀值的时候(默认10秒内超过20个请求次数)
2:当失败率达到一定的时候(默认10秒内超过50%的请求失败)
3:到达以上阀值,断路器将会开启
4:当开启的时候,所有请求都不会进行转发
5:一段时间之后(默认是5秒),这个时候断路器是半开状态,会让其中一个请求进行转发。如果成功,断路器会关闭,若失败,继续开启。
- 断路器在什么情况起作用?
如下报错,就会调用注解@HystrixCommand,断路器就起作用了
涉及到断路器的三个重要参数:快照时间窗、请求总数阀值、错误百分比阀值。
1:快照时间窗(sleepWindowInMilliseconds):断路器确定是否打开需要统计-些请求和错误数据,而统计的时间范围就是快照时间窗,默认为最近的10秒。
2:请求总数阀值(requestVolumeThreshold):在快照时间窗内,必须满足请求总数阀值才有资格熔断。默认为20,意味着在10秒内,如果该hystrix命令的调用次数不足20次,即使所有的请求都超时或其他原因失败,断路器都不会打开。
3:错误百分比阀值(errorThresholdPercentage):当请求总数在快照时间窗内超过了阀值,比如发生了30次调用,如果在这30次调用中,有15次发生了超时异常,也就是超过50%的错误百分比,在默认设定50%阀值情况下,这时候就会将断路器打开。
// ================= 服务熔断 ==================@HystrixCommand(fallbackMethod = "paymentCircuitBreaker_fallback", commandProperties = {@HystrixProperty(name = "circuitBreaker.enabled", value = "true"), // 是否开启断路器@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "10"), // 请求次数@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "10000"), // 时间窗口期@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "60") // 失败率达到多少后跳闸})public String paymentCircuitBreaker(Integer id) {if (id < 0) {throw new RuntimeException("******** id 不能为负数 *********");}String simpleUUID = IdUtil.simpleUUID();return Thread.currentThread().getName() + "\t" + "调用成功, 流水号: " + simpleUUID;}
public String paymentCircuitBreaker_fallback(Integer id) {return "******** id 不能为负数 请稍后再试 o(╥﹏╥)o *********";}
DeptController.java
@RestController
public class DeptController
{@Autowiredprivate DeptService service;@Autowiredprivate DiscoveryClient client;@RequestMapping(value = "/dept/get/{id}", method = RequestMethod.GET)//一旦调用服务方法失败并抛出了错误信息后,会自动调用@HystrixCommand标注好的fallbackMethod调用类中的指定方法@HystrixCommand(fallbackMethod = "processHystrix_Get")public Dept get(@PathVariable("id") Long id){Dept dept = this.service.get(id);if (null == dept) {throw new RuntimeException("该ID:" + id + "没有没有对应的信息");}return dept;}public Dept processHystrix_Get(@PathVariable("id") Long id){return new Dept().setDeptno(id).setDname("该ID:" + id + "没有没有对应的信息,null--@HystrixCommand").setDb_source("no this database in MySQL"); }
当输入地址查询的时候,如果传进来的id,找不到,就会抛出异常,然后会自动调用@HystrixCommand标注好的fallbackMethod调用类中的指定方法,如下
3:服务降级
关于服务降级的理论知识
程序运行异常,超时,服务熔断触发服务降级,线程池打满都会导致服务降级
OrderHystrixController.java
全局服务降级
@RestController
@Slf4j
@DefaultProperties(defaultFallback = "paymentGlobalFallBack")
public class OrderHystrixController {@Resourceprivate PaymentHystrixService paymentHystrixService;@GetMapping("/consumer/payment/hystrix/ok/{id}")public String ok(@PathVariable("id") Integer id) {return paymentHystrixService.paymentInfo_OK(id);}
@GetMapping("/consumer/payment/hystrix/timeout/{id}")@HystrixCommandpublic String timeout(@PathVariable("id") Integer id) {return paymentHystrixService.paymentInfo_TIMEOUT(id);}// 下面是全局fallback方法public String paymentGlobalFallBack() {return "全局异常信息处理,请稍后再试o(╥﹏╥)o";}
}
pom.xml
<!-- hystrix --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix</artifactId></dependency>
通配服务降级
PaymentFallbackService .java
@Component
public class PaymentFallbackService implements PaymentHystrixService {@Overridepublic String paymentInfo_OK(Integer id) {return "-------PaymentFallbackService fall back paymentInfo_OK, o(╥﹏╥)o";}@Overridepublic String paymentInfo_TIMEOUT(Integer id) {return "-------PaymentFallbackService fall back paymentInfo_TIMEOUT, o(╥﹏╥)o";}
}
PaymentHystrixService .interface
@Component
@FeignClient(value = "CLOUD-PROVIDER-HYSTRIX-PAYMENT", fallback = PaymentFallbackService.class)
public interface PaymentHystrixService {@GetMapping("/payment/hystrix/ok/{id}")String paymentInfo_OK(@PathVariable("id") Integer id);@GetMapping("/payment/hystrix/timeout/{id}")String paymentInfo_TIMEOUT(@PathVariable("id") Integer id);
4:服务限流
- 秒杀高并发等操作,严禁一窝蜂的过来拥挤,大家排队,一秒钟N个,有序进行
5:豪猪hystrixDashboard
- 除了隔离依赖服务的调用以外,Hystrix还提供了准实时的调用监控(Hystrix Dashboard),Hystrix会持续地记录所有通过Hystrix发起的请求的执行信息,并以统计报表和图形的形式展示给用户,包括每秒执行多少请求多少成功,多少失败等。
- Netflix通过hystrix-metrics-event-stream项目实现了对以上指标的监控。Spring Cloud也提供了Hystrix Dashboard的整合,对监控内容转化成可视化界面。
监控(Hystrix Dashboard)的创建步骤
1:创建如下工程
2:pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>com.atstudying.springclound</groupId><artifactId>microservicespringclound</artifactId><version>0.0.1-SNAPSHOT</version></parent><artifactId>microservicecloud-consumer-hystrix-dashboard</artifactId><dependencies><!-- 自己定义的api --><dependency><!-- 自己定义的api --><groupId>com.atstudying.springclound</groupId><artifactId>microserviceclound-api</artifactId><version>${project.version}</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- 修改后立即生效,热部署 --><dependency><groupId>org.springframework</groupId><artifactId>springloaded</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId></dependency><!-- Ribbon相关 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-eureka</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-ribbon</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-config</artifactId></dependency><!-- feign相关 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-feign</artifactId></dependency><!-- hystrix和 hystrix-dashboard相关 --><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></dependencies>
</project>
3:application.yml
server:port: 9001
4:DeptConsumer_DashBoard_App.java
@SpringBootApplication
@EnableHystrixDashboard
public class DeptConsumer_DashBoard_App
{public static void main(String[] args){SpringApplication.run(DeptConsumer_DashBoard_App.class, args);}
}
5:测试
熔断监控面板(Hystrix Dashboard)
总结:七色,一圈,一线
6:Hystrix 工作流程
Hystrix 工作流程
SpringClound——Hystrix断路器相关推荐
- Spring Cloud构建微服务架构:服务容错保护(Hystrix断路器)【Dalston版】
前言 在前两篇<Spring Cloud构建微服务架构:服务容错保护(Hystrix服务降级)>和<Spring Cloud构建微服务架构:服务容错保护(Hystrix依赖隔离)&g ...
- Hystrix面试 - 深入 Hystrix 断路器执行原理
Hystrix面试 - 深入 Hystrix 断路器执行原理 RequestVolumeThreshold HystrixCommandProperties.Setter().withCircuitB ...
- SpringCloud中 Feign结合Hystrix断路器开发。
Feign结合Hystrix断路器开发: 转载于:https://www.cnblogs.com/longdb/p/10468371.html
- Hystrix断路器执行原理
深入 Hystrix 断路器执行原理 Hystrix熔断机制,用于监控微服务调用情况,当失败的情况达到预定的阈值(5秒失败20次),会打开断路器,拒绝所有请求,直到服务恢复正常为止. circuitB ...
- 五、Hystrix断路器
Hystrix断路器 概述 分布式系统面临的问题 复杂分布式体系结构中的应用程序有数十个依赖关系,每一个依赖关系在某些时候将不可避免的失败. 服务雪崩 多个微服务之间调用的时候,假如微服务A调用微服务 ...
- Hystrix断路器原理及实现(服务降级、熔断、限流)
Hystrix断路器原理及实现(服务降级.熔断.限流) 分布式系统面临的问题 Hystrix重要概念(面试常考) Hystrix案例 Hystrix 服务提供者 Hystrix 服务消费者 原因与解决 ...
- Netflix Hystrix断路器简介与工作原理
一.前言? 1.Netflix Hystrix断路器是什么? Netflix Hystrix是SOA/微服务架构中提供服务隔离.熔断.降级机制的工具/框架.Netflix Hystrix是断路器的一种 ...
- 微服务——Hystrix断路器(豪猪哥)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 概述 分布式系统面临的问题 是什么 能干嘛 Hystrix重要概念 服务降级(fallback) 哪些情况会触发降级 服务熔 ...
- SpringCloud07 - Hystrix 断路器
扯淡: 服务与服务之间有业务关联就需要调用,当被调用的服务发生故障(上线后多半是由于网路原因导致连接超时),必然会波及到服务调用者.通俗讲,断路器就是在低层级的服务发生故障时将服务间的连接断开. 个人 ...
最新文章
- java xftp_IDEA使用Xshell利用Xftp部署javaweb项目
- linux 内核调试前准备(简单记录,以后补充)
- leetcode算法题--子集
- 白话Elasticsearch54-数据建模之通过【应用层join】或者【数据冗余】实现实现用户与博客的关联
- Spring Cloud Gateway 源码解析(1) —— 基础
- java holder_java.sql.SQLException: connection holder is null
- 前端学习笔记之DOM(一)
- 优雅的在终端中编写Python
- OpenGL基础53:阴影映射(下)
- 影响大数据的数据质量因素
- 侠诺虚拟服务器,简便不等于简单 侠诺PPPoE服务器功能介绍
- typeof()用法及JS基本类型
- Java 通过JDBC连接Mysql数据库
- Atitit uri url格式规范与解析器 .URIparser 理解URI和URL的区别,我们引入URN这个概念。 URI = Universal Resource Identifier 统一资
- Animate.css动画库下载、安装、使用与解析
- Rplidar A2M8屏蔽角度
- JMETER性能测试
- CKeditor配置
- 【MPI编程】矩阵向量乘法--解法二(高性能计算)
- 腾讯互娱技术总监张正:《天涯明月刀》后台技术创新
热门文章
- 仿苹果版小黄车(ofo)app主页菜单效果
- Darknet实现YoloV3(2)
- 如何实现一个React全家桶项目(附完整教程及代码)
- linux chroot绿色程序,关于 Linux 下的 chroot 的些许介绍
- 怎么样打开Win10启动文件夹
- 从 BIO、NIO 聊到 Netty,最后还要实现个 RPC 框架!
- 魅族android n彩蛋,魅族17“隐藏彩蛋”曝光!Flyme大版本更新正式解锁
- html标签Windows10无法使用,window 10 Microsoft Edge 无法使用开发者模式【F12】
- [剑指offer]JT7---Fibonacci数列(让人想起可塑性记忆,记忆化搜索很重要)
- videojs播放器插件