SpringCloud之Hystrix(服务熔断与降级)
讲Hystrix之前我们先来了解一下降级和熔断以及服务雪崩效应
一.降级
//降级
1.抛弃非核心业务,保障核心页面的正常运行.
2.服务器忙,请稍后再试,不让客户端等待立刻返回一个友好的提示,fallback
//引发服务降级:
1>程序运行异常
2>调用超时
3>服务熔断出发服务降级
4>线程池/信号量打满也会导致服务降级
二.熔断
1.类比保险丝超过最大功率后熔断一样, 服务器达到最大访问处理量之后,拒绝再接受服务,
被拒绝的请求直接调用服务降级方法,返回友好提示
//一般熔断操作过程:
1.正常服务访问
2.遭遇异常/超时等意外情况,服务降级
3.多次请求处理无果进而熔断
//服务器会在一段时间内走降级操作,就是先访问服务,服务有问题,再走降级,
//下一个请求过来继续访问服务,发现服务有问题,再走降级,这样一段时间后,
//熔断触发,再下个请求过来,直接走降级操作,就不会去访问服务了)
4.熔断时间到,尝试恢复调用链路
//过一段时间,熔断开关会尝试关闭,当请求过来后,它会放一个请求过去,看服务器是否恢复了,如果服务恢复了,
//则其他请求也都可以到达服务器,如果没恢复,则继续断开链路,走降级服务,过一段时间再尝试打开
三.服务雪崩效应原因
服务雪崩
1.多个服务之间调用的时候,假设微服务A调用微服务B和微服务C,微服务B和微服务C又调用了其他微服务,这就是所谓的“扇出”
2.如果扇出的链路上某个微服务的调用响应时间过长或者不可用,对微服务A的调用就会占用越来越多的系统资源,
进而引起系统的崩溃, 所谓的“雪崩效应”
//在高并发的情况下,由于单个服务的延迟,可能导致所有的请求都处于延迟状态,
//甚至在几秒钟就使服务处于负载饱和的状态,资源耗尽,直到不可用,最终导致这个分布式系统都不可用,这就是“雪崩”。
四.Hystrix简介
Hystrix是一个用于处理分布式系统的延时和容错的开源库,在分布式系里,许多依赖不可避免的会调用失败,比如超时,异常等,Hystrix能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性
//Hystrix提供了熔断、隔离、Fallback、cache、监控等功能
五.实现原理
1:正常请求时,正常处理
2:在一个时间窗内(默认10s),请求处理异常超过一定比例(默认50%),执行熔断
3:再有请求调用的时候,将不会调用主逻辑,而是直接调用降级fallback,通过断路器,实现自动的发现错误,
并将主逻辑切换为降级逻辑,减少响应延迟的效果
4:原来的主逻辑如何恢复(hystrix 会自动恢复)
//当断路器打开,对主逻辑进行熔断后,hystrix会启动一个休眠时间窗,在这个时间窗内,
//降级逻辑是临时的成为主逻辑,当休眠时间窗到期, 断路器将进入半开状态,释放一次请求到原来的主逻辑上,
//如果此次请求正常返回,那么断路器将继续闭合,主逻辑恢复,如果这次请求依然有问题,
//断路器继续进行打开状态, 休眠时间窗重新计时
1.代码
//降级设置,一旦方法异常或超时,走fallbackMethod指定降级方法
@HystrixCommand(fallbackMethod = "saveFallback")
@GetMapping("/save/{userId}/{productId}")
public Order save(@PathVariable Long userId, @PathVariable Long productId) {
log.info("OrderController-save.....");
return new Order();
}
//方法签名跟映射方法一样(方法名除外)
//降级方法
public Order saveFallback(@PathVariable Long userId, @PathVariable Long productId) {
System.out.println("降级处理");
return new Order();
}
//注意使用Hystrix降级处理时,降级方法中的方法签名要和映射方法一样,如上面userId,productId参数一样
启动类
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
@EnableCircuitBreaker //或者@EnableHystrix //这2个注解可以让Hystrix生效
public class OrderMain8090 {
public static void main(String[] args) {
SpringApplication.run(OrderMain8090.class, args);
}
}
2.application.yml
server:
port: 8100
spring:
application:
name: hystrix-dashboard8100
eureka:
client:
#是否将自己注册进去eureka,false为不注册,true注册
registerWithEureka: true
#是否从eureka抓取注册信息,单点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
fetchRegistry: true
serviceUrl:
defaultZone: http://localhost:8761/eureka/
3.依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
六.Hystrix之断路器Dashboard监控仪表盘
1.Dashboard监控仪表盘是什么?
除了隔离依赖服务调用以为,Hystrix还提供了准实时的调用监控(Hystrix DashBoard) Hystrix会持续的几率所有通过Hystrix发起的请求的执行信息,并以统计报表和图形的形式展示给用户,包括每秒执行多少请求,多少是成功的,多少是失败的等, Netflix通过Hystrix-metrics-event-stream项目实现对上面指标的监控。SpringCloud也提供了Hystrix Dashboard的整合,对监控内容转化成可视化界面
//它主要用来实时监控Hystrix的各项指标信息。
//通过Hystrix Dashboard反馈的实时信息,可以帮助我们快速发现系统中存在的问题,从而及时地采取应对措施。
2.启动时的页面
//http://localhost:8100/hystrix,然后再地址栏上输入:需要监控服务的地址
//例:http://localhost:8001/actuator/hystrix.stream
3.监控单服务的页面:
4.代码
//启动类,配置这个registrationBean bean,监控在启动时的页面中填了地址的服务
@SpringBootApplication
@EnableHystrixDashboard //注意加这个注解
public class DashBoard8100 {
//请求数据获取路径
@Bean
public ServletRegistrationBean servletRegistrationBean(){
HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet();
ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet);
registrationBean.setLoadOnStartup(1);
registrationBean.addUrlMappings("/hystrix.stream");
registrationBean.setName("HystrixMetricsStreamServlet");
return registrationBean;
}
public static void main(String[] args) {
SpringApplication.run(DashBoard8100.class, args);
}
}
5.application.yml
server:
port: 8090
spring:
application:
name: order-server
eureka:
client:
#是否将自己注册进去eureka,false为不注册,true注册
registerWithEureka: true
#是否从eureka抓取注册信息,单点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
fetchRegistry: true
serviceUrl:
defaultZone: http://localhost:8761/eureka/
instance:
#eureka客户端向服务端发送心跳的时间间隔,单位为秒,默认是30
lease-renewal-interval-in-seconds: 1
#eureka服务端收到最后一次心跳等待的时间上限,单位为秒,默认是90,超时剔除
lease-expiration-duration-in-seconds: 2
#给需要监控的服务(8090)监控配置
management:
endpoints:
web:
exposure:
include: ["health","info","hystrix.stream"]
6.依赖
<!--DashBoard8100服务的依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--主要是这个-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>
<!--监控服务8090的依赖,只要用到Hystrix的仪表盘时,都需要加这个依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
七.小结
1.Hystrix提供了熔断、隔离、Fallback、cache、监控等功能
2.使用Hystrix走降级操作时,记得降级方法的参数类型,参数个数,参数顺序都要与贴了fallbackMethod注解的方法中的参数列表相同
3.Hystrix仪表盘可以用来实时监控[Hystrix]其他服务的各项指标信息的
4.使用Hystrix仪表盘需要注意yml中配置监控配置,Hystrix中的依赖(dashboard)与需要监控服务中的依赖(actuator)不同
5.并且使用Hystrix仪表盘时需要在启动类中的配置这个registrationBean bean