基于springcloud搭建项目-Hystrix篇(五)
1、概述
(1)、首先要知道分布式系统面临的问题
复杂分布式体系结构中应用程序有数十个依赖关系,每个依赖关系在某些时候将不可避免的失败
(2)、服务雪崩
多个服务之间相互调用的时候,假设微服务A调用微服务B和微服务C,微服务B和微服务C又调用其他的微服务,这既是所谓的“扇出”。如果扇出的链路上某个微服务的调用响应时间过长或者不可用,对微服务A的嗲用就会占用原来越多的系统资源,今儿引起系统崩溃,所谓的“雪崩效应”。
(3)、对于高流量的应用来说,单一的后端依赖可能会导致所有服务器上的所有资源都在几秒钟内饱和。比失败更糟糕的是,这些应用程序还可能导致服务之间的延迟增加,备份队列,线程和其他系统资源紧张,导致整个系统发生更多的级联故障。这些都表示需要对故障和延迟进行隔离和管理,以便单个依赖关系的失败,不能取消整个应用程序或系统。
●是什么
Hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调试失败,比如超时、异常等,Hystrix能够保证在一个依赖出现问题的情况下,不会导致整个服务失败,避免级联故障,以提高分布式系统的弹性。
“断路器”本身是一种开关装置,当某个服务开关发生故障之后,通过断路器的故障监控(类似熔断保险丝),向调用方返回一个符合预期的、可处理的备选响应(fallback),而不是长时间的等待或者抛出调用方无法处理的异常,这样就保证了服务调用县城不会被长时间,不必要得占用,从而避免了故障在分布式系统中的蔓延,乃至雪崩
●能干嘛
(1)、服务限流
(2)、服务降级、
整个资源快不够了,忍痛将某些服务先关掉,待度过难关,再开启回来。
(3)、服务熔断
熔断机制是应对雪崩效应的一种微服务链路保护机制
当扇出链路的某个微服务不可用或者响应时间太长时,会进行服务的降级,进而熔断该节点微服务的调用,快速返回“错误”的响应信息。当检测到该节点微服务调用响应正常后恢复调用链路。在SpringCloud框架里熔断机制通过Hystrix实现。Hystrix会监控微服务调用的状况,当失败的调用到一定的阈值,缺省是5秒内20次调用失败就会启动熔断机制。熔断机制的注解是@HystrixCommand
(4)、接近实时的监控
除了隔离依赖服务的调用以外,Hystrix还提供了准实时的调用监控(Hystrix Dashboard),Hystrix会持续的记录所有通过Hystrix发起的请求的执行信息,并以统计报表和图形的形式展示给用户,包括每秒执行多少请求多少成功,多少失败等。Netfilx通过hystrix-metrics-event-stream项目实现了对以上指标的监控。Spring Cloud也提供了Hystrix Dashboard的整合,对监控内容转化成可视化界面。
●怎么用
接上篇的项目,还是三个服务 注册中心study-eureka(8001),服务提供者study-ms(8003),服务消费者study-web(8002)
第一、在Ribbon消费者中使用
(1)、在消费者pom.xml中添加依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency>
(2)、在方法上添加注解@HystrixCommand(fallbackMethod = "XXXX")
study-web的方法如下:
@HystrixCommand(fallbackMethod = "testError") @GetMapping("test") public String getHello() { return restTemplate.getForObject("http://STUDY-MS/user/test", String.class); } public String testError() { return "hi Hystrix : sorry error!"; }
(3)、在study-web的启动类上添加注解@EnableCircuitBreaker
(4)、分别启动注册中心study-eureka,stusy-ms,study-web,访问http://http://localhost:8002/test
结果显示:
(5)、断开服务者study-ms,访问http://localhost:8002/test
第二、在Feign中使用
Feign是自带断路器的,@EnableFeignClients中已经默认打开了断路器功能,所以这里的启动类上不需要再加@EnableCircuitBreaker注解
只需要在@FeignClient中为fallback参数指定fallback方法。但是,在D版本的Spring Cloud之后,它没有默认打开
(1)、添加配置feign.hystrix.enabled=true
(2)、在Feign接口注解@FeignClient上添加fallback,此注解是接口实现类
(3)实现类上添加熔断实现
(3)、分别启动注册中心study-eureka,stusy-ms,study-web,访问http://localhost:8002/queryUser
(4)、关掉study-ms服务,继续访问http://localhost:8002/queryUser
结果证明断路器起到了作用