• hystrix功能汇总


    一.什么是hystrix?

    hystrix是Netlifx开源的一款容错框架,防雪崩利器,具备降级,熔断,依赖隔离,监控(Hystrix Dashboard)等功能。
    
    
    降级:超时降级、资源不足时(线程或信号量)降级,降级后可以配合降级接口返回托底数据,做到优雅降级。
    熔断:当失败率达到阈值时自动触发降级(如因网络故障或超时造成的失败率高),熔断器触发的快速失败会进行快速恢复。
    隔离(线程池隔离和信号量隔离):限制调用分布式服务的资源使用,某一个调用的服务出现问题不会影响其他调用。
    缓存:提供了请求缓存、请求合并的实现方法。
    
    Hystrix使用场景
    1.降级:调用超时时间比你自己定义的阈值要长。
    2.熔断:在一段时间内,如果服务的错误百分比超过了一个阈值,就会触发一个断路器来停止对特定服务的所有请求,无论是手动还是自动的
    3.隔离:线程池满了,该以来应该立即拒绝请求,而不是排队
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    二、降级:功能上描述就是,调用服务接口超时,转到其他接口上去。

    @GetMapping("/user/test")
    @HystrixCommand(fallbackMethod = "fallback2")
    public String test(@RequestParam ("number")Integer number) {
        if (number == 1) {
            return "success";
        }
        RestTemplate restTemplate = new RestTemplate();
        String str = restTemplate.getForObject("http://127.0.0.1:8081/rw/user/test", String.class);
        return str;
    }
    
    private String fallback2(Integer number) {
    	return "太拥挤了,请稍后再试2";
    }
    
    
    修改超时时间,默认超时时间是1000ms,可通过以下进行设置 单位为ms
    @HystrixCommand(fallbackMethod = "fallback2",commandProperties = {@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "3000")})
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    三、熔断

    功能描述:服务接口在高并发的情况下出现线程阻塞,导致当前线程不可用,慢慢的其他线程也开始阻塞 ,导致整个服务器雪崩。
    这时直接熔断服务具体超时的接口,而不是一直等到服务接口超时。
    
    断路器
    全开:一段时间内 达到一定的次数无法调用 并且多次监测没有恢复的迹象,断路器完全打开 那么下次请求就不会请求到该服务
    半开: 短时间内, 有恢复迹象 断路器会将部分请求发给该服务,正常调用时, 断路器关闭
    关闭:当服务一直处于正常状态,能正常调用
    
    
    
    @HystrixCommand(fallbackMethod = "fallback2", commandProperties = {
            @HystrixProperty(name = "circuitBreaker.enabled", value = "true"),
            @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "10"),
            @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "10000"),
            @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "60"),
    })
    @GetMapping("/user/test")
    public String test(@RequestParam ("number")Integer number) {
        if (number == 1) {
            return "success";
        }
        RestTemplate restTemplate = new RestTemplate();
        String str = restTemplate.getForObject("http://127.0.0.1:8081/rw/user/test", String.class);
        return str;
    }
    
    
    circuitBreaker.enabled :true 打开熔断 默认开启
    circuitBreaker.requestVolumeThreshold: 当在配置时间窗口内达到此数量的失败后,进行短路。默认20个
    circuitBreaker.sleepWindowInMilliseconds:短路多久以后开始尝试是否恢复,默认5s
    circuitBreaker.errorThresholdPercentage:出错百分比阈值,当达到此阈值后,开始短路。默认50%
    
    • 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

    四、隔离

    为每一个hystrixCommand提供一个线程池,自动实现了依赖隔离,即使线程池满了也不会影响其他进程。
    
    • 1

    五、服务熔断监控

    断路器可视化:启动类添加注解@EnableHystrixDashboard

    概念描述跳转
    使用案例地址1:跳转
    使用案例地址2:跳转

    疑问

    1、什么是请求合并

    每一次的通信都需要建立和断开连接,如果微服务之间的调用非常频繁,那就会有很多的连接在建立和断开,为了减少请求连接的数量,Hystrix提出了请求合并的功能。就是对某个服务的多次请求合并成一个请求,单个请求的参数合成批量请求的参数,这就需要被调用的服务接口需要支持批量调用。

    需要用到2个注解:
    @HystrixCollapser
    @HystrixCommand

    请求合并使用的文章:跳转

    2、@EnableHystrix注解与@EnableCircuitBreaker的区别

    @EnableHystrix引用了@EnableCircuitBreaker,并对@EnableCircuitBreaker进行了简单的封装。

    地址:原文地址

    3、Hystrix源码解读

    HystrixCircuitBreakerConfiguration引入配置类,创建HystrixCommandAspect切面,
    2、切点:处理带有@HystrixCommand注解和@HystrixCollapser注解的方法。
    3、通知:创建HystrixCommand对象,所以的逻辑都在HystrixCommand的方法里面,但是方法都是通过RxJava的方式编写的可读性比较差。
    
    • 1
    • 2
    • 3

    源码地址:跳转

    Hystrix源码分析:跳转

  • 相关阅读:
    Python 实验六 文件访问
    2023-2024年云赛道模拟题库
    实践分析丨AscendCL应用编译&运行案例
    说说hashCode() 和 equals() 之间的关系?
    verilog 实现常用加法器
    CentOS下载
    贯穿设计模式第二话--开闭原则
    猿创征文 | 【Java进阶】详解抽象类及常用接口
    ElasticSearch7.3学习(三十一)----Logstash基础学习
    漏洞分析 | 漏洞调试的捷径:精简代码加速分析与利用
  • 原文地址:https://blog.csdn.net/weixin_37862824/article/details/134485251