我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Spring Cloud Hystrix的基本用法大全

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Spring Cloud Hystrix的基本用法大全

本文主要讲述Hystrix,也可以称之为豪猪哥。

它是Spring Cloud中集成的一个组件,在整个生态中主要为我们提供以下功能:

  • 服务隔离

服务隔离主要包括线程池隔离以及信号量隔离。

  • 服务熔断

当请求持续失败的时候,服务进行熔断,默认熔断5S,也是就说在这5S内的请求一律拒绝。

  • 服务降级

当前请求失败的时候,返回降级的结果。

1. Hystrix的简单使用

1.1 服务降级

添加依赖

<!--        hystrix-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>
  1. 启动类添加注解
@EnableCircuitBreaker //开启熔断
  • 对应接口加上注解

注解里面相关的参数可以至HystrixCommandProperties类中查找;注解里面也可以不写相关内容。

fallbackMethod = "fallback"里面是熔断方法名。

//HystrixCommandProperties
    @HystrixCommand( commandProperties = {
            @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold",value = "10")
    },fallbackMethod = "fallback")
    @GetMapping
    public String order() {
        log.info("begin do order");
//        使用openfiegn
        String goods = goodsService.getGoodsById();
        String promotion = promotionService.getPromotionById();
        String result = orderService.createOrder(goods, promotion);
        return result;
    }

 	public String fallback(){
        return "触发降级";
    }

修改商品服务的接口,加上超时时间,使接口调用错误。

@GetMapping("/goods")
public String getGoodsById() {

    try {
        Thread.sleep(3000);
    } catch (Exception e){
        e.printStackTrace();
    }
    log.info("收到请求,端口为:{}", port);
    return "返回商品信息";
}

启动项目,调用接口,看是否可以进行服务降级。

1.2 服务熔断

熔断的触发机制

在10S内,超过20次请求,并且失败率超过50%(默认情况)- > 触发熔断

熔断后经过一段时间等待后又可以继续正常访问。

我们稍微改造下代码:

    @HystrixCommand(commandProperties = {
            @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "10"), //请求阈值
            @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "5000"),//熔断窗口持续时间
            @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "50")//错误比
    }, fallbackMethod = "fallback")
    @GetMapping("/{num}")
    public String order(@PathVariable("num") int num) {
        if (num % 2 == 0) {
            return "正常访问。";
        }

        log.info("begin do order");
        String goods = goodsService.getGoodsById();
        String promotion = promotionService.getPromotionById();
        String result = orderService.createOrder(goods, promotion);
        return result;
    }
    public String fallback(int num) {
        return "触发降级";
    }

我们来看下上述代码,首先我们给接口添加了相关一个参数,在接口中根据传参来执行不同的操作,比如参数为2那就正常返回,如果参数为1 就执行下面的代码,由于我们加了超时时间,所以会调用失败。

注意,我们给接口加了参数后,服务降级的方法也要加上相关参数,否则会错误。

触发的相关机制都是可以根据参数自己修改的,大家测试的时候可以将请求阈值设置小一点,方便测试查看效果。

2. OpenFeign集成Hystrix

以上都是我们直接在客户端调用的时候直接集成Hystrix来进行服务的保护,那在OpenFeign中我们该如何集成呢?

然后我们在service-api项目中引入相关依赖:

<!--        hystrix-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

然后我们在暴露接口的地方创建相关回调实现:

我们首先实现暴露接口的FeignClient,然后在实现的方法中编写对应的降级操作即可,这样当发生调用失败的情况,则会返回降级的信息。

这里可以使用component注解将该类交给spring管理,或者通过configuration注解进行处理。

//@Component
public class IGoodsServiceFallback implements IGoodsServiceFeignClient {

    @Override
    public String getGoodsById() {
        return "查询商品信息异常,触发降级保护机制。";
    }
}

编写完该类后,我们需要至FeignClient处进行相关配置。

@FeignClient(name = "goods-service",
        configuration = FeignClientLogConfiguration.class,
        fallback = IGoodsServiceFallback.class)
public interface IGoodsServiceFeignClient extends IGoodsService {
}

这里修改完成后,我们就可以至集成服务修改相关配置了。

首先在配置文件中开启feign的熔断保护机制。

#开启feign的熔断保护机制
feign.hystrix.enabled=true

然后需要将之前的IGoodsServiceFallback交给spring容器进行管理,我这里是使用的configuration注解进行处理的。

@Configuration
public class HystrixFallbackConfiguration {

    @Bean
    public IGoodsServiceFallback goodsServiceFallback() {
        return new IGoodsServiceFallback();
    }
}

以上便是我们的全部配置,这个时候我们只需要去goods-service中的调用接口人为的制造一些异常,这样调用的时候就可以触发异常了。

比如我直接加了超时时间:

@Slf4j
@RestController
public class GoodsService implements IGoodsService  {

    @Value("${server.port}")
    private String port;

    
    @GetMapping("/goods")
    public String getGoodsById() {

        try {
            Thread.sleep(5000);
        } catch (Exception e){
            e.printStackTrace();
        }
        log.info("收到请求,端口为:{}", port);
        return "返回商品信息";
    }
}

然后我们就可以直接开始测试了:

可以看到成功获取了降级信息,代表我们集成成功。

实际上我们在调用OpenFeign接口的时候,他会判断我们的Feign接口上是否有Hustrix的一些机制,如果有的话先进行相关判断,然后在执行请求。如下图所示:

3. Hystrix熔断原理

下图为Hystrix的熔断简单工作原理,调用出现异常后,如果错误率达到一个阈值,则开始熔断。相关的阈值,时间等都是可以进行配置的。

3.1 熔断状态

  • open

触发熔断,意味着请求不会发送到服务端,而是直接调用fallback。

  • closed

熔断关闭,表示可以正常通信。

  • Half-Open

熔断的自动恢复机制。通过尝试的方式,判断服务是否正常,然后恢复到closed 状态;如果还是异常,则继续保持熔断。

3.2 熔断的工作原理

使用滑动窗口来实现数据的统计。

可能有人不太了解什么是滑动窗口。

我们首先来看下计数器的一种实现方式,类似我们在60s内只能发送一次短信。比如下图,限制一分钟之内只能接受100个请求,但是位于临界点的时候,我们可能突然收到200个请求,所以可能会导致一些问题。

滑动窗口和计算器是类似的,首先多了一个滑动的步骤,窗口会随着时间往前滑动。然后我们的窗口大小是固定的(可以自己设置),比如下图我们的窗口大小就是60S,随着时间的推进,窗口向前滑动,但是会保证大小不变。

熔断的阈值就是根据滑动窗口的请求数以及失败次数来进行计算的,从而判断出是否开启熔断。

RxJava 响应式编程(类似webflux),实现事件流的分发。

既然了解了他的大致原理,我们再将这部分带入之前的流程中来看:

我们一个请求进来后,如果该接口声明了HystrixCommand注解,首先会调用allowRequest方法去校验当前请求是否允许发生:判断当前是否位于isOpen状态,如果是则直接返回服务降级的逻辑;如果不是则判断当前时间窗口的总健康请求数量是否大于20次(阈值可自行设置),小于则正常执行,如果大于则判断当前滑动窗口内的错误请求率是否达到阈值,从而开启熔断状态。

滑动窗口的数据统计都是通过事件流来实现的,任务执行结束后,通过发布一个时间,然后将相关数据更新到当前时间窗口中,老的数据则直接丢弃。相关流程比较复杂,这里不过多阐述。

4. 代码地址

微服务案例

到此这篇关于Spring Cloud Hystrix的基本使用的文章就介绍到这了,更多相关Spring Cloud Hystrix使用内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Spring Cloud Hystrix的基本用法大全

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Spring Cloud Hystrix:熔断与降级机制,守护应用稳定的基石

Spring Cloud Hystrix,作为 Spring Cloud 生态圈中不可或缺的一部分,提供了强大的熔断与降级机制,守护微服务架构的稳定性。它通过智能监测微服务之间的依赖关系,及时识别和处理故障,防止故障蔓延,保障系统整体的健壮性。
Spring Cloud Hystrix:熔断与降级机制,守护应用稳定的基石
2024-03-07

Linux常见基本命令与用法大全

本文实例讲述了linux常见基本命令与用法。分享给大家供大家参考,具体如下: 目标 熟练使用 Linux常用的命令 1> 查看文件信息:ls ls是英文单词list的简写,其功能为列出目录的内容,是用户最常用的命令之一,它类似于DOS下的d
2022-06-04

Spring的IOC基本用法是什么

今天小编给大家分享一下Spring的IOC基本用法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1、spring_he
2023-06-28

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录