当前位置:   article > 正文

SpringCloud基础篇-09-服务降级/熔断/限流-Hystrix_springcloud 降级限流

springcloud 降级限流

1. 简述

Hystrix的GitHub地址

服务器忙,请稍后重试,不让客户端等待立马返回一个友好提示,fallback

1.1 哪些情况会触发降级?

  • 1.程序运行异常
  • 2.超时
  • 3.服务熔断触发器降级
  • 4.线程池/信号量打满也会导致服务降级

2. 有哪些降级方式

2.1 服务提供方自己降级

主启动类上加:@EnableCircuitBreaker

@SpringBootApplication
@EnableEurekaClient
@MapperScan("springcloud.mapper")
@EnableCircuitBreaker
public class HystrixPay8005Application {
    public static void main(String[] args) {
        SpringApplication.run(HystrixPay8005Application.class, args);
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
@GetMapping("queryPort")
@HystrixCommand(fallbackMethod = "queryPortFallBack",commandProperties = {
        @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "3000")  //3秒钟以内就是正常的业务逻辑
})
public ResponResult<String> queryPort(
) {
    try {
        TimeUnit.SECONDS.sleep(5);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    return new ResponResult<>(ResponEnum.SUCCESS, serverPort + "\t\t" + UUID.randomUUID().toString());
}


public ResponResult<String> queryPortFallBack(){

    return new ResponResult<>(ResponEnum.SUCCESS, "服务繁忙,请稍后重试");
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

2.2 服务调用方自己降级

第一步: 主启动类上加 @EnableHystrix

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
@EnableHystrix
public class HystrixOrder80Application {
    public static void main(String[] args) {
        SpringApplication.run(HystrixOrder80Application.class, args);
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

第二步: controller层建立 兜底方法

@GetMapping("queryPort")
@HystrixCommand(fallbackMethod = "queryPortFallBack",commandProperties = {@HystrixProperty(name = "execution" +
        ".isolation.thread.timeoutInMilliseconds",value = "1500")  //1.5秒钟以内就是正常的业务逻辑
})
public ResponResult<String> queryPort(
) {
    try {
        TimeUnit.SECONDS.sleep(2);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    return orderservices.queryPort();
}


public ResponResult<String> queryPortFallBack(){

    return new ResponResult<>(ResponEnum.SUCCESS, "我是调用方我等不及了");
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

第三步,yml文件加配置


feign:
  hystrix:
    enabled: true #如果处理自身的容错就开启。开启方式与生产端不一样
  • 1
  • 2
  • 3
  • 4

2.3. 以上产生的问题

  • 代码冗余
    每个方法都需要配置一个服务降级方法

  • 逻辑混乱
    在这里插入图片描述

2.4 解决代码混乱问题

第一步: 自定义是实现类实现接口

 @Component
public class OrderServiceFallBack implements Orderservices {
    @Override
    public ResponResult<String> queryPort() {
        return new ResponResult<>(ResponEnum.SUCCESS, "┭┮﹏┭┮");
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

第二步: 在OPenfeign的接口上写回滚方法

@FeignClient(value = "cloud-hystrix-payment-service",fallback = OrderServiceFallBack.class)
public interface Orderservices {


    @GetMapping("queryPort")
    ResponResult<String> queryPort();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

第三步:主启动类开启注解

@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
@EnableHystrix
public class HystrixOrder80Application {
    public static void main(String[] args) {
        SpringApplication.run(HystrixOrder80Application.class, args);
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

第四步: yml配置

feign:
  hystrix:
    enabled: true #如果处理自身的容错就开启。开启方式与生产端不一样
  • 1
  • 2
  • 3

注意:此服务降级无法处理方法内部发生异常问题,比如
在这里插入图片描述

3. 服务熔断break

类比保险丝达到最大服务访问后,直接拒绝访问,拉闸限电,然后调用服务降级的方法返回友好提示;
服务熔断-》进而熔断-》恢复调用链路

大神的结论在这里插入图片描述
地址

//服务熔断
@HystrixCommand(fallbackMethod = "paymentCircuitBreaker_fallback",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"), //失败率达到多少后跳闸
})
public String paymentCircuitBreaker(@PathVariable("id") Integer id){
    if (id < 0){
        throw new RuntimeException("*****id 不能负数");
    }
    String serialNumber = IdUtil.simpleUUID();

    return Thread.currentThread().getName()+"\t"+"调用成功,流水号:"+serialNumber;
}
public String paymentCircuitBreaker_fallback(@PathVariable("id") Integer id){
    return "id 不能负数,请稍候再试,(┬_┬)/~~     id: " +id;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

3.1 断路器在什么情况下起作用

涉及到断路器的三个重要参数:快照时间窗请求总数阀值错误百分比阀值

  • 快照时间窗:断路器确定是否打开需要统计一些请求和错误数据,而统计的时间范围就是快照时间窗,默认为最近的10秒。
  • 请求总数阀值:在快照时间窗内,必须满足请求总数阀值才有资格熔断。默认为20,意味着在10秒内,如果该hystrix命令的调用次数不足20次,即使所有的请求都超时或其他原因失败,断路器都不会打开。
  • 错误百分比阀值:当请求总数在快照时间窗内超过了阀值,比如发生了30次调用,如果在这30次调用中,有15次发生了超时异常,也就是超过50%的错误百分比,在默认设定50%阀值情况下,这时候就会将断路器打开。

3.2 断路器开启或关闭条件

在这里插入图片描述

  • 再有请求调用的时候,将不会调用主逻辑,而是直接调用降级fallback.通过断路器,实现了自动地发现错误并将降级逻辑切换为主逻辑,减少响应延迟的效果。
  • 原来的主逻辑要如何恢复呢?
    对于这一问题,hystrix也为我们实现了自动恢复功能。
    当断路器打开,对主逻辑进行熔断之后,hystrix会启动一个休眠时间窗,在这个时间窗内,降级逻辑是临时的成为主逻辑,当休眠时间窗到期,断路器将进入半开状态,释放一次请求到原来的主逻辑上,如果此次请求正常返回,那么断路器将继续闭合,主逻辑恢复,如果这次请求依然有问题,断路器继续进入打开状态,休眠时间窗重新计时。

4.图形化界面使用

1.新建一个模块,导入依赖,注意下面两个依赖必须要有

<!--新增hystrix dashboard-->
<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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

2.主启动类上加注解

@SpringBootApplication
@EnableHystrixDashboard
public class HystrixDashBoard9001Application {
    public static void main(String[] args) {
        SpringApplication.run(HystrixDashBoard9001Application.class,args);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

3.假设该模块端口为9001 则启动项目 ,访问 localhost:9001/hystrix即可
在这里插入图片描述
4.9001为监控模块,将需要监控的服务,加入到里面去

  1. 需要监控的模块必须要有下面依赖
 <!--监控-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
  • 1
  • 2
  • 3
  • 4
  • 5

2.在主启动类上加上指定监控路径,也必须要有@EnableCircuitBreak注解开启

@SpringBootApplication
@EnableEurekaClient
@MapperScan("springcloud.mapper")
@EnableCircuitBreaker
public class HystrixPay8005Application {
    public static void main(String[] args) {
        SpringApplication.run(HystrixPay8005Application.class, args);
    }
    @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;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

3.配置监控模块对提供服务的模块的配置,并取好名字
在这里插入图片描述

4.1 图形界面解释

在这里插入图片描述
实心圆:共有两种含义。它通过颜色的变化代表了实例的健康程度,它的健康度从绿色<黄色<橙色<红色递减。

该实心圆除了颜色的变化之外,它的大小也会根据实例的请求流量发生变化,流量越大该实心圆就越大。所以通过该实心圆的展示,就可以在大量的实例中快速的发现故障实例和高压力实例。

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

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/536989
推荐阅读
相关标签
  

闽ICP备14008679号