SpringCloud(H版&alibaba)框架开发教程之Hystrix——附源码(4)

参考博客:https://www.cnblogs.com/cjsblog/p/9391819.html
https://blog.csdn.net/tongtong_use/article/details/78611225

Hystrix介绍

在微服务场景中,通常会有很多层的服务调用。如果一个底层服务出现问题,故障会被向上传播给用户。我们需要一种机制,当底层服务不可用时,可以阻断故障的传播。这就是断路器的作用。他是系统服务稳定性的最后一重保障。

在springcloud中断路器组件就是Hystrix。Hystrix也是Netflix套件的一部分。他的功能是,当对某个服务的调用在一定的时间内(默认10s),有超过一定次数(默认20次)并且失败率超过一定值(默认50%),该服务的断路器会打开。返回一个由开发者设定的fallback。

fallback可以是另一个由Hystrix保护的服务调用,也可以是固定的值。fallback也可以设计成链式调用,先执行某些逻辑,再返回fallback。

Hystrix的作用

对通过第三方客户端库访问的依赖项(通常是通过网络)的延迟和故障进行保护和控制。

在复杂的分布式系统中阻止级联故障。

快速失败,快速恢复。

回退,尽可能优雅地降级。

启用近实时监控、警报和操作控制。

服务降级

三种情况:

访问超时

运行错误

宕机

演示,

使用一下四个服务

SpringCloud(H版&alibaba)框架开发教程之Hystrix——附源码(4)_第1张图片
服务启动后
访问:localhost:80/consumer/payment/hystrix/ok/1

SpringCloud(H版&alibaba)框架开发教程之Hystrix——附源码(4)_第2张图片
我们先考虑一下,

服务调用者降级
SpringCloud(H版&alibaba)框架开发教程之Hystrix——附源码(4)_第3张图片

SpringCloud(H版&alibaba)框架开发教程之Hystrix——附源码(4)_第4张图片
上述降级有哪些问题,要是有100个接口,要写100个降级方法吗?

优化

类上加上注解:

@RestController
@RequestMapping("/consumer")
@DefaultProperties(defaultFallback = "payment_Global_FallbackMethod")
public class OrderHystrixController {
/**
 * 全局fallback方法
 *
 * @return
 */
private String payment_Global_FallbackMethod() {
    return "Global异常处理信息,请稍后再试。";
}

@HystrixCommand//不加属性代表使用默认的全局处理方法。

    @HystrixCommand
    public String paymentInfo_TimeOut(@PathVariable("id") Integer id)
    {
        int age = 10/0;
        String result = paymentHystrixService.paymentInfo_TimeOut(id);
        return result;
    }

测试

SpringCloud(H版&alibaba)框架开发教程之Hystrix——附源码(4)_第5张图片

第三种方式

修改cloud-consumer-feign-hystrix-order80
根据cloud-consumer-feign-hystrix-order80已经有的PaymentHystrixService接口,重新新建一个类(PaymentFallbackService)实现该接口,统一为接口里面的方法进行异常处理

@Component
public class PaymentFallbackService implements PaymentHystrixService
{
    @Override
    public String paymentInfo_OK(Integer id)
    {
        return "-----PaymentFallbackService fall back-paymentInfo_OK ,o(╥﹏╥)o";
    }

    @Override
    public String paymentInfo_TimeOut(Integer id)
    {
        return "-----PaymentFallbackService fall back-paymentInfo_TimeOut ,o(╥﹏╥)o";
    }
}

注解里加上新加的
SpringCloud(H版&alibaba)框架开发教程之Hystrix——附源码(4)_第6张图片

方法熔断的注解都不使用
SpringCloud(H版&alibaba)框架开发教程之Hystrix——附源码(4)_第7张图片
效果
SpringCloud(H版&alibaba)框架开发教程之Hystrix——附源码(4)_第8张图片

服务提供者降级

写一个兜底方法

SpringCloud(H版&alibaba)框架开发教程之Hystrix——附源码(4)_第9张图片
直接访问,不通过其他服务调用,看结果
SpringCloud(H版&alibaba)框架开发教程之Hystrix——附源码(4)_第10张图片

服务熔断

SpringCloud(H版&alibaba)框架开发教程之Hystrix——附源码(4)_第11张图片

正数是正常的
SpringCloud(H版&alibaba)框架开发教程之Hystrix——附源码(4)_第12张图片

负数

SpringCloud(H版&alibaba)框架开发教程之Hystrix——附源码(4)_第13张图片

Hystrix断路器使用时最常用的三个重要指标参数

在微服务中使用Hystrix 作为断路器时,通常涉及到以下三个重要的指标参数(这里是写在@HystrixProperties注解中,当然实际项目中可以全局配置在yml或properties中)

1、circuitBreaker.sleepWindowInMilliseconds

断路器的快照时间窗,也叫做窗口期。可以理解为一个触发断路器的周期时间值,默认为10秒(10000)。

2、circuitBreaker.requestVolumeThreshold

断路器的窗口期内触发断路的请求阈值,默认为20。换句话说,假如某个窗口期内的请求总数都不到该配置值,那么断路器连发生的资格都没有。断路器在该窗口期内将不会被打开。

3、circuitBreaker.errorThresholdPercentage

断路器的窗口期内能够容忍的错误百分比阈值,默认为50(也就是说默认容忍50%的错误率)。打个比方,假如一个窗口期内,发生了100次服务请求,其中50次出现了错误。在这样的情况下,断路器将会被打开。在该窗口期结束之前,即使第51次请求没有发生异常,也将被执行fallback逻辑。

综上所述,在以上三个参数缺省的情况下,Hystrix断路器触发的默认策略为:

在10秒内,发生20次以上的请求时,假如错误率达到50%以上,则断路器将被打开。(当一个窗口期过去的时候,断路器将变成半开(HALF-OPEN)状态,如果这时候发生的请求正常,则关闭,否则又打开)

Hystrix控制面板

SpringCloud(H版&alibaba)框架开发教程之Hystrix——附源码(4)_第14张图片
http://127.0.0.1:9001/hystrix

SpringCloud(H版&alibaba)框架开发教程之Hystrix——附源码(4)_第15张图片

最长的输入框输入以下内容后,显示到了监控页面

http://localhost:8001/hystrix.stream

SpringCloud(H版&alibaba)框架开发教程之Hystrix——附源码(4)_第16张图片

我们多点几次接口:localhost:8001/payment/circuit/-1,然后看效果

SpringCloud(H版&alibaba)框架开发教程之Hystrix——附源码(4)_第17张图片
下篇讲zull网关

zull网关学习转到这里
https://blog.csdn.net/A598853607/article/details/125545802
https://blog.csdn.net/weixin_43888891/article/details/126445571
由于zull停止维护,现使用gateway代替

gateway网关

你可能感兴趣的:(spring,cloud,hystrix,java)