• SpringCloud 10 Hystrix 服务降级


    10.1 Hystrix 服务降级


    服务降级:当我们 有大量的请求 都 去访问 A 时,其它的 服务 就可以暂时 关闭,让其他服务 不占用资源。这就叫服务降级。等度过难关之后,我们在开启其它服务就可以了。服务降级 是在客户端做的,而服务熔断 是在服务端做的。

    服务降级:一般是 停止 一整个 服务!所以 用 feign 会比较好一些!而且 feign 是自带 hystrix 的! 大白话就是:如果你关闭了 整个 服务,是不是得 提示我们一些信息呀。所以我们主要做的就是这个!!!

    1. springcloud-consumer-dept-feignapplication.yaml 中 开启 服务降级 feign.hystrix 并且 我们 还要导入 hystrix 的依赖
    server:
      port: 80
    
    # 开启降级 fenign.hystrix
    feign:
      circuitbreaker:
        enabled: true
    
    # Eureka 配置
    eureka:
      client:
        register-with-eureka: false # 消费者应该不需要注册自己
        service-url:
          defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka,http://eureka7003.com:7003/eureka
        fetch-registry: true # 拉取服务,默认为true
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    在这里插入图片描述

    
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <parent>
            <artifactId>springcloudartifactId>
            <groupId>top.muquanyugroupId>
            <version>1.0-SNAPSHOTversion>
        parent>
        <modelVersion>4.0.0modelVersion>
    
        <artifactId>springcloud-consumer-dept-feignartifactId>
    
        <properties>
            <maven.compiler.source>8maven.compiler.source>
            <maven.compiler.target>8maven.compiler.target>
        properties>
    
        <dependencies>
            <dependency>
                <groupId>top.muquanyugroupId>
                <artifactId>springcloud-apiartifactId>
                <version>1.0-SNAPSHOTversion>
            dependency>
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starter-webartifactId>
            dependency>
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-devtoolsartifactId>
            dependency>
            <dependency>
                <groupId>org.springframework.cloudgroupId>
                <artifactId>spring-cloud-starter-eurekaartifactId>
                <version>1.4.7.RELEASEversion>
            dependency>
    
    
            <dependency>
                <groupId>org.springframework.cloudgroupId>
                <artifactId>spring-cloud-starter-feignartifactId>
                <version>1.4.7.RELEASEversion>
            dependency>
    
            
            <dependency>
                <groupId>org.springframework.cloudgroupId>
                <artifactId>spring-cloud-starter-netflix-hystrixartifactId>
                <version>2.2.10.RELEASEversion>
            dependency>
    
        dependencies>
    project>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54

    在这里插入图片描述

    1. 既然 要 提示 整个服务 都被 干掉了,那么我们 就要 写 整个服务 对应的 消息反馈方法可以在 springcloud-api 写一个 fallbackFactory 工厂

    在这里插入图片描述

    package top.muquanyu.springcloud.service;
    
    import org.springframework.cloud.openfeign.FallbackFactory;
    import org.springframework.stereotype.Component;
    import top.muquanyu.springcloud.pojo.Dept;
    
    import java.util.List;
    
    // 降级的服务 信息返回方法
    @Component
    public class DeptCilentServiceFallbackFactory implements FallbackFactory {
        @Override
        public DeptClientService create(Throwable throwable) {
            return new DeptClientService() {
                @Override
                public boolean addDept(Dept dept) {
                    return false;
                }
    
                @Override
                public Dept queryByID(Long id) {
                    return new Dept().setDeptno(id).setDname("id => "+ id + " 没有对应的信息,客户端提供了降级的信息,这个服务已经关闭 --@Hystrix").setDb_source("no this database in MySQL");
                }
    
                @Override
                public List<Dept> queryAll() {
                    return null;
                }
            };
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    我们发现 正常服务启动的时候,一切正常。

    在这里插入图片描述

    好,现在 关闭 服务

    在这里插入图片描述

    再次 去访问 一下 这个 服务,你会发现 服务降级生效了。它 提示 了 服务关闭后 该 提示的消息。

    在这里插入图片描述

    • 服务熔断:服务端~ 某个 服务超时或者异常,引起熔断~ , 保险丝~
    • 服务降级:客户端~ 从整体网站请求的负载考虑~,当某个服务熔断或者关闭之后,服务 将不再被调用~ 此时在客户端,我们可以准备 一个 FallbackFactory,返回一个 默认的值(缺省值),但是整体的服务水平肯定下降了,但是好歹能用呀,比崩掉,挂掉要好一万倍!
  • 相关阅读:
    [pytorch] 2D + 3D EfficientNet代码 实现,改写
    职场CPU反着用!爽呆了!
    js 代理事件理解及应用场景
    数字档案室建设评价
    SVN客户端使用详细
    冰冰学习笔记:哈希表与无序容器
    FPGA面试笔试一些基础概念题目
    Java的abstract应用和代理模式应用
    关于ASO优化的分步入门指南1
    深度学习技巧总结
  • 原文地址:https://blog.csdn.net/qq_52606908/article/details/126252180