• SpringCloud之Hystrix


    Hystrix理解

    熔断器本身是一种开关装置,用于在电路上保护线路过载。当线路中有电器发生短路时,熔断器能够及时切断故障电路,防止发生过载、发热甚至起火等严重后果。这种保护机制被借鉴到分布式系统的设计中,形成了类似Hystrix中的熔断器功能。熔断器在分布式系统中的作用主要是快速失败并返回错误,避免因为某个服务的故障导致整个系统的崩溃。

    一、服务熔断

    解决的问题
    解决服务雪崩效应

    1、导入hystrix依赖

    
     
     <dependency>
         <groupId>org.springframework.cloudgroupId>
         <artifactId>spring-cloud-starter-netflix-hystrixartifactId>
     dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2、使用服务熔断机制

    在服务提供者基础上添加服务熔断机制,提供者=>这里!!!

    3、控制层部分代码

    
    @RestController
    public class DeptController {
        @Autowired
        private DeptService deptService;
        @GetMapping("/dept/get/{id}")
        // 使用@HystrixCommand注解标记get方法,并指定fallback方法
        @HystrixCommand(fallbackMethod = "hystrixGet")
        public Dept get(@PathVariable("id") Long id){
            Dept dept = deptService.queryById(id);
            if( dept == null ){
                throw  new RuntimeException("id=>"+id+",不存在该用户信息,或信息无法找到");
            }
            return dept;
        }
    
        // 备选方案
        public Dept hystrixGet(@PathVariable("id") Long id){
            Dept dept = new Dept();
            dept.setDeptno(id)
                    .setDname("id=>"+id+",不存在该用户信息")
                    .setDb_source("no this database in MySQL");
            return dept;
        }
    }
    
    • 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

    4、Hystrix服务提供者启动类

    @EnableCircuitBreaker 开启熔断服务

    @SpringBootApplication
    @EnableEurekaClient  // 自动在服务启动后自动注册到Eureka中
    @EnableCircuitBreaker // 熔断支持
    public class SpringBootProviderHystrixApplication_8001 {
        public static void main(String[] args) {
            SpringApplication.run(SpringBootProviderHystrixApplication_8001.class,args);
        }
        // 下面的代码是固定的 配合监控使用
        @Bean
        public ServletRegistrationBean hystrixMetricsStreamServlet(){
            ServletRegistrationBean registration = new ServletRegistrationBean(new HystrixMetricsStreamServlet());
            registration.addUrlMappings("/actuator/hystrix.stream");
            return registration;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    5、测试结果

    启动3个eureka服务、3个提供者服务、1个消费者服务,只是参考也可以不启动这么多服务,也可以使用单机版。

    在这里插入图片描述

    启动服务

    客户端请求访问一个数据库不存在的信息http://localhost/consumer/dept/get/11,使用的是集群服务,其中只有一个服务实现了熔断机制,总有一次会显示提示信息。其它两次提供者服务没有使用熔断机制是不会返回信息的。
    在这里插入图片描述

    二、服务降级

    和客户端有关,服务端提供降级信息。

    使用场景

    使用Hystrix服务降级使用场景,当故障服务调用失败或超时时,Hystrix会快速返回这个备选响应,而不是让调用方长时间等待或抛出异常。这样,即使部分服务出现问题,整个系统依然能够正常运行,用户也能够得到及时的反馈,而不是无休止的等待。

    在这里插入图片描述

    创建降级处理工厂类

    1、实现FallbackFactory 降级处理工厂类

    // 服务降级
    @Component
    public class DeptClientServiceFallbackFactory implements FallbackFactory {
        // 也就是放回整个类
        @Override
        public DeptClientService create(Throwable throwable) {
            return new DeptClientService() {
                @Override
                public Dept get(Long id) {
                    return new Dept().setDeptno(id)
                            .setDname("id=>"+id+"没有找到该信息 ,这是客户端提供的降级信息,这个服务现在已经被关闭")
                            .setDb_source("没有可获得的数据");
                }
    
                // 下面的方法也需要返回结果,懒没有实现
                @Override
                public List<Dept> getAll() {
                    return null;
                }
    
                @Override
                public boolean add(Dept dept) {
                    return false;
                }
            };
        }
    }
    
    
    • 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

    2、使用Feign来调用Http请求

    @FeignClient注解添加 fallbackFactory 参数返回之前创建的DeptClientServiceFallbackFactory类

    // fallbackFactory 放回工厂,降级操作
    @FeignClient(name = "SPRINGCLOUD-PROVIDER-DEPT",fallbackFactory = DeptClientServiceFallbackFactory.class)
    public interface DeptClientService {
    
        @GetMapping("/dept/get/{id}")
        public Dept get(@PathVariable("id") Long id);
    
        @GetMapping("/dept/list")
        public List<Dept> getAll();
    
        @PostMapping("/dept/add")
        public boolean add(Dept dept);
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    3、消费者客户端application.yml

    # 核心配置展示
    
    # feign 配置 在客户端
    feign:
      hystrix:
        enabled: true # feign 开启服务降级
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    4、Feign客户端启动类

    @SpringBootApplication
    @EnableEurekaClient
    @EnableFeignClients(basePackages = {"com.jyl.springcloud"}) // 扫描到springcloud-api中的sercie包下的DeptClientService接口
    public class DeptConsumer_Feign_80 {
        public static void main(String[] args) {
            SpringApplication.run(DeptConsumer_Feign_80.class,args);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    5、测试结果

    当将所有的提供者服务关闭之后。

    在这里插入图片描述

    服务端提供者关闭

    客户端访问http://localhost/consumer/dept/get/1 ,依旧可以返回内容,不会服务崩掉。

    在这里插入图片描述

    三、监控页面

    项目名称:springcloud-consumer-hystrix-dashboard

    1、导入依赖

     
     
     <dependency>
         <groupId>org.springframework.cloudgroupId>
         <artifactId>spring-cloud-starter-netflix-hystrixartifactId>
     dependency>
    
     
     <dependency>
         <groupId>org.springframework.cloudgroupId>
         <artifactId>spring-cloud-starter-hystrix-dashboardartifactId>
         <version>1.4.6.RELEASEversion>
     dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    服务端提供者必须导入下面依赖:

     
     <dependency>
         <groupId>org.springframework.bootgroupId>
         <artifactId>spring-boot-starter-actuatorartifactId>
     dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2、application.yml

    修改端口号,避免端口冲突

    server:
      port: 9001
    
    • 1
    • 2

    3、客户端启动类

    @EnableHystrixDashboard开启监控

    @SpringBootApplication
    @EnableHystrixDashboard // 开启监控
    public class DeptConsumerDashboard_9001 {
        public static void main(String[] args) {
            SpringApplication.run(DeptConsumerDashboard_9001.class,args);
        }
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    4、服务端提供者启动类

    需要在服务端启动类中添加ServletRegistrationBean

    @SpringBootApplication
    @EnableEurekaClient  // 自动在服务启动后自动注册到Eureka中
    @EnableDiscoveryClient // 服务发现
    @EnableCircuitBreaker // 熔断支持
    public class SpringBootProviderHystrixApplication_8001 {
        public static void main(String[] args) {
            SpringApplication.run(SpringBootProviderHystrixApplication_8001.class,args);
        }
        // 下面的代码是固定的
        @Bean
        public ServletRegistrationBean hystrixMetricsStreamServlet(){
            ServletRegistrationBean registration = new ServletRegistrationBean(new HystrixMetricsStreamServlet());
            registration.addUrlMappings("/actuator/hystrix.stream");
            return registration;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    5、测试结果

    访问http://localhost:9001/hystrix

    在这里插入图片描述

    hystrix监控界面

    点击Monitor Stream按钮实时监控服务端提供者localhost:8001
    监控请求信息
    在这里插入图片描述

    hystrix监控面板

    七色一圈一线

    • 七色
      在这里插入图片描述

    • 一圈
      实心圆:公有两种含义,他通过颜色的变化代表了实例的健康程度它的健康程度从绿色<黄色<橙色<红色递减
      该实心圆除了颜色的变化之外,它的大小也会根据实例的请求流量发生变化,流量越大,该实心圆就越大,所以通过该实心圆的展示,就可以在大量的实例中快速发现故障实例和高压力实例。

    • 一线
      曲线:用来记录2分钟内流量的相对变化,可以通过它来观察到流量的上升和下降趋势! I

    如果不清楚请看B站大佬视频=>狂神说

  • 相关阅读:
    Java版企业电子招标采购系统源码—企业战略布局下的采购寻源
    接口测试框架基于模板自动生成测试用例!
    英语中的提问方式(问法)(bug提问、bug描述)
    C语言数组
    10月17日,每日信息差
    Linux:环境变量
    工具及方法 - 在线流程图描画
    Power BI 自定义门户----大成
    C语言快速入门之内存函数的使用和模拟实现
    代码随想录二刷 | 链表 | 翻转链表
  • 原文地址:https://blog.csdn.net/weixin_46171048/article/details/138196053