• 【面试题 - springcloud】 Hystrix


    0. 服务雪崩

    多个微服务之间调用的时候,假设微服务A调用微服务B和微服务C,微服务B和微服务C又调用其他的微服务,这就是所谓的“扇出”,如果扇出的链路上某个微服务的调用响应时间过长,或者不可用,对微服务A的调用就会占用越来越多的系统资源,进而引起系统崩溃,所谓的“雪崩效应”。
    在这里插入图片描述

    1. 熔断(服务提供方处理)

    “断路器”本身是一种开关装置,当某个服务单元发生故障之后,通过断路器的故障监控 (类似熔断保险丝) ,向调用方返回一个服务预期的,可处理的备选响应 (FallBack) ,而不是长时间的等待或者抛出调用方法无法处理的异常,这样就可以保证了服务调用方的线程不会被长时间,不必要的占用,从而避免了故障在分布式系统中的蔓延,乃至雪崩。

    在SpringCloud框架里熔断机制通过Hystrix实现。Hystrix会监控微服务间调用的状况,当失败的调用到一定阀值缺省是5秒内20次调用失败,就会启动熔断机制。熔断机制的注解是:@HystrixCommand。

    1.1 服务熔断解决如下问题

    当所依赖的对象不稳定时,能够起到快速失败的目的;
    快速失败后,能够根据一定的算法动态试探所依赖对象是否恢复。

    1.2 使用

    1.2.1 导入hystrix依赖

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-hystrix</artifactId>
        <version>1.4.6.RELEASE</version>
    </dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    1.2.2 修改controller

    @RestController
    public class DeptController {
        @Autowired
        private DeptService deptService;
       
        @HystrixCommand(fallbackMethod = "hystrixGet")
        @RequestMapping("/dept/get/{id}")//根据id查询
        public Dept get(@PathVariable("id") Long id){
            Dept dept = deptService.queryById(id);
            if (dept==null){throw new RuntimeException("这个id=>"+id+",不存在该用户,或信息无法找到~");}
            return dept;
        }
        
        /**
         * 根据id查询备选方案(熔断)
         * @param id
         * @return
         */
        public Dept hystrixGet(@PathVariable("id") Long id){
            return new Dept().setDeptno(id).setDname("这个id=>"+id+",没有对应的信息,null---@Hystrix~").setDb_source("在MySQL中没有这个数据库");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    1.2.3 @EnableCircuitBreaker

    为主启动类添加对熔断的支持注解
    @EnableCircuitBreaker //启用断路器

    1.3 服务熔断原理

    1.3.1 Hystrix中熔断的常用配置

    circuitBreaker.requestVolumeThreshold
    默认值20.意思是至少有20个请求才进行errorThresholdPercentage错误百分比计算。比如一段时间(10s)内有19个请求全部失败了。错误百分比是100%,但熔断器不会打开,因为requestVolumeThreshold的值是20. 这个参数非常重要,

    circuitBreaker.sleepWindowInMilliseconds
    过多长时间,熔断器再次检测是否开启,默认为5000,即5s钟

    circuitBreaker.errorThresholdPercentage
    设定错误百分比,默认值50%,例如一段时间(10s)内有100个请求,其中有55个超时或者异常返回了,那么这段时间内的错误百分比是55%,大于了默认值50%,这种情况下触发熔断器-打开。

    按照以上配置的熔断器如下:
    每当20个请求中,有50%失败时,熔断器就会打开,此时再调用此服务,将会直接返回失败,不再调远程服务。直到5s钟之后,重新检测该触发条件,判断是否把熔断器关闭,或者继续打开

    1.3.2 过程

    最开始处于closed状态,一旦检测到错误到达一定阈值,便转为open状态;
    这时候会有个 reset timeout,到了这个时间了,会转移到half open状态,尝试放行一部分请求到后端,一旦检测成功便回归到closed状态,即恢复服务;
    在这里插入图片描述

    2. 降级(消费端处理)

    2.1 demo

    2.1.1 配置 开启降级feign.hystrix

    # 开启降级feign.hystrix
    feign:
      hystrix:
        enabled: true
    
    • 1
    • 2
    • 3
    • 4

    2.1.2

    @Component    //必须被spring 托管
    public class IProductClientServiceFallbackFactory implements FallbackFactory<IProductClientService> {
        @Override
        public IProductClientService create(Throwable throwable) {
            //这里提供请求方法出问题时回退处理机制
            return new IProductClientService(){
    
                @Override
                public Product getProduct(long id) {
                    Product p=new Product();
                    p.setProductId(999999999L);
                    p.setProductDesc("error");
                    return p;
                }
            };
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    2.1.3

    @FeignClient(name="MICROSERVICE-PROVIDER-PRODUCT",
            configuration = FeignClientConfig.class,
            fallbackFactory = IProductClientServiceFallbackFactory.class)  // 配置要按自定义的类FeignClientConfig
    public interface IProductClientService {
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    3. Hystrix原理

    参考:https://www.kuangstudy.com/bbs/1374942542566551554

  • 相关阅读:
    PS之ICO插件ICOFormat
    js单行代码-----dom
    c++11浅析
    Redis-----SSM整合redis及redis的注解式开发以及redis的击穿,穿透,雪崩三种解决方案
    复盘今年寒气逼人的秋招
    C++从0吃透string类
    Swift团队逼走创始人?本人回应表示团队“有毒”
    netfilter&iptables探讨(2)——netfilter原理与实现
    中秋征文“好文尝鲜奖”榜单公布,快来领取你的定制礼盒!
    java 版本企业招标投标管理系统源码+多个行业+tbms+及时准确+全程电子化
  • 原文地址:https://blog.csdn.net/yzx3105/article/details/126893260