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

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值