SpringCloud之服务降级(总体第四篇)

前面相关文章已经学习到了服务注册中心,服务调用,的Ribbon,LoadBalancer,Feign和OpenFeign,Consul,Zookeeper等相关内容。接下来学习服务降级。

一、Hystrix

首先说明一点,它差不多已经不用了,但是为什么要说呢,因为它太牛逼了,后面很多东西都是借鉴它来的,所以必须来了解一下。

1、什么是Hystrix

(1)系统分开开发后,存在了很多问题

在这里插入图片描述
在这里插入图片描述

(2)是什么

在这里插入图片描述

(3)能干嘛

在这里插入图片描述

(4)停更原因

在这里插入图片描述
在这里插入图片描述

2、Hystrix重要概念

Hystrix的服务降级熔断限流概念

(1)服务降级

  • 反正就是你要给我保底的
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 什么情况会触发呢
    在这里插入图片描述

(2)服务熔断

在这里插入图片描述
在这里插入图片描述

(3)服务限流

在这里插入图片描述

3、支付案例

(1)构建项目

  • 建model
    在这里插入图片描述
  • 导依赖
<dependencies>
        <!--hystrix-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>
        <!--eureka client-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <!--web-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency><!-- 引入自己定义的api通用包,可以使用Payment支付Entity -->
            <groupId>cn.mldn</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
  • 写yml
server:
  port: 8001

spring:
  application:
    name: cloud-provider-hystrix-payment

eureka:
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      #defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
      defaultZone: http://eureka7001.com:7001/eureka
  • 主启动
    在这里插入图片描述
  • 写业务逻辑
    在这里插入图片描述
    这里是模拟来,所以就没有那么标准,现在启动测试没事问题,后面个error虽然是停顿了,但是到结束都还是没啥问题。

(2)正常到错误

  • 这里要模拟多线程去使用:先安装这

  • 模拟
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 启动测试
    在这里插入图片描述
    再次发送这个都发现满了很多
    在这里插入图片描述
    之前把资源分配均匀,但是现在大量的去访问error的方法,此时就会变慢,OK访问也变慢了,此时就需要接下来的Hystrix来容错和限流来处理了

(3)订单微服务调用支付服务卡顿

  • 建项目
    在这里插入图片描述
  • 改pom
 <dependencies>
        <!--openfeign-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <!--hystrix-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>
        <!--eureka client-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <!-- 引入自己定义的api通用包,可以使用Payment支付Entity -->
        <dependency>
            <groupId>cn.mldn</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <!--web-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!--一般基础通用配置-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
  • 写yml
server:
  port: 80

eureka:
  client:
    register-with-eureka: false
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka/
  • 主启动
    在这里插入图片描述

  • 业务类
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 启动测试
    在这里插入图片描述
    测试error就直接报错
    在这里插入图片描述

4、根据上面项目问题处理降级容错

在这里插入图片描述

1)服务降级

在这里插入图片描述

(1)降级的配置

可以实现注解@HystrixCommand进行处理

(2)8001先从自己找问题(fallback)

在这里插入图片描述

  • 主启动类上配置
    在这里插入图片描述
  • 业务类写
    在这里插入图片描述
    在这里插入图片描述
    或者如下写
    在这里插入图片描述
    在这里插入图片描述

(3)从消费者端80去fallback

  • 再次回顾
    在这里插入图片描述
    在这里插入图片描述

  • 80实现【比如我们8001说是五秒都是正常的,但是你消费者端不想等,那你就自己处理】
    在这里插入图片描述
    一般是放在客户端

  • yml修改
    在这里插入图片描述

  • 写启动类
    在这里插入图片描述

  • 写业务类
    在这里插入图片描述

  • 此时启动测试,发现一秒五就报错。
    在这里插入图片描述

(4)看一下现在存在的问题

在这里插入图片描述
每一个方法都要去写一个兜底的方法的话,会发现我们的代码膨胀,要是以后的代码量出现几万,几万时候都去配置发现会很拉胯。【所以肯定要配置通用的+一些部分自己特定配置的方式处理】

(5)DefaultProperties(解决上面问题)

  • 看一下原因
    在这里插入图片描述
  • 配置方式
    在这里插入图片描述
    在这里插入图片描述
  • 自己配置
    在这里插入图片描述
    上面这样配置报错了’
    在这里插入图片描述
  • 如下配置就OK了
    在这里插入图片描述
    在这里插入图片描述

(6)全局配置的降级

  • 首先想一下我们既然可以调佣这微服务可以调用成功,那我们是否可以在这里全局做了降级【在如下的位置配置就可以达到解耦的作用】
    在这里插入图片描述
  • 分析一下如下【之前也见过了运行和超时异常,这里就模拟宕机异常】
    在这里插入图片描述
  • 修改cloud-consumer-feign-Hystrix-order80
    • 根据cloud-consumer-feign-Hystrix-order80已经有的paymentHystrixService接口,重新建一个类(PaymentFallbackService)实现该接口,统一为接口里面的方法进行异常处理。
      在这里插入图片描述

    • paymentFallback类实现paymentFeignClientService接口

    • YML配置
      在这里插入图片描述

    • PaymentFeignClientService接口
      在这里插入图片描述

    • 测试
      在这里插入图片描述
      把你的8001挂掉
      在这里插入图片描述
      如果你之前的没有关掉就访问如下
      在这里插入图片描述

2)服务熔断

(1)熔断概念

在这里插入图片描述
这个之前就说到过,这里就不细入讲解了。其实它也是降级的特别版。

  • 段路器:理解为家里面的保险丝
  • 熔断概念
    在这里插入图片描述
  • 看一下图
    在这里插入图片描述

(2)案例演示

修改cloud-provider-Hystrix-payment8001

  • 首先介绍一下聚哈的含义:String serialNumber = IdUtil.simpleUUID();它是生成唯一id好 【是由如下的一个组织更新的】在这里插入图片描述
    在这里插入图片描述

  • 修改配置8001的PaymentService
    在这里插入图片描述
    //circuitBreaker.enabled是,是否开启断路器
    @HystrixProperty(name = “circuitBreaker.enabled”,value = “true”),
    //circuitBreaker.requestVolumeThreshold,请求次数【它和失败率是挂钩的,就是在10次以内失败率达到60就熔断】
    @HystrixProperty(name = “circuitBreaker.requestVolumeThreshold”,value = “10”),
    //circuitBreaker.sleepWindowInMilliseconds,时间窗口期
    @HystrixProperty(name = “circuitBreaker.sleepWindowInMilliseconds”,value = “10000”),
    //circuitBreaker.errorThresholdPercentage,失败率达到多少后跳闸
    @HystrixProperty(name = “circuitBreaker.errorThresholdPercentage”,value = “60”)
    在这里插入图片描述
    在这里插入图片描述
    你配置了就按你的,没配置就是它默认的。

  • 再修改controller
    在这里插入图片描述

  • 测试

    • 正确测试
      在这里插入图片描述
    • 测试不正常情况【不正确使用会在过过一段时间后恢复正常】
      在这里插入图片描述
      当我们使劲点,超过很多次之后,输入正常的也不行
      在这里插入图片描述
      过一段时间测试又恢复正常

(3)熔断小总结

在这里插入图片描述

  • 断路器在上面情况起作用呢
    在这里插入图片描述

  • 断路器开启或关闭的流程
    在这里插入图片描述

  • 断路器打开之后
    在这里插入图片描述

  • 所有的配置
    在这里插入图片描述
    在这里插入图片描述

3)服务限流

这个是基本淘汰了,这个比较重要,在SpringCloudAlibaba进行详细讲解

5、Hystrix工作流程

  • 工作流程图
    在这里插入图片描述

6、Hystrix图形化Dashboard

  • 就是服务监控HystrixDashboard
    在这里插入图片描述

1)搭建环境

(1)建model

在这里插入图片描述

(2)写pom

<dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

(3)写yml

在这里插入图片描述

(4)主启动

在这里插入图片描述

这里多提一嘴,监控信息必须导入如下依赖

 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

(5)启动测试

启动访问如下地址
在这里插入图片描述

2)监控实战

(1)配置8001

在这里插入图片描述

/**
     *此配置是为了服务监控而配置,与服务容错本身无关,springcloud升级后的坑
     *ServletRegistrationBean因为springboot的默认路径不是"/hystrix.stream",
     *只要在自己的项目里配置上下面的servlet就可以了
     */
    @Bean
    public ServletRegistrationBean getServlet() {
        HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet();
        ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet);
        registrationBean.setLoadOnStartup(1);
        registrationBean.addUrlMappings("/hystrix.stream");
        registrationBean.setName("HystrixMetricsStreamServlet");
        return registrationBean;
    }

(2)启动测试

在这里插入图片描述

  • 配置地址
    ![在这里插

多点几下这里进入正确的测试
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

多点几下错误测试
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二、sentinel和resilience4j

这两个都在后续的笔记再总结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值