SpringCloud之Hystrix(服务熔断与降级)

tech2022-08-08  124

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
最新回复(0)