SpringCloud 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>

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

SpringCloud Hystrix怎么使用

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

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

//@Componentpublic 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注解进行处理的。

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

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

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

@Slf4j@RestControllerpublic class GoodsService implements IGoodsService  {    @Value("${server.port}")    private String port;    /**     * 根据ID查询商品信息     *     * @return     */    @GetMapping("/goods")    public String getGoodsById() {        try {            Thread.sleep(5000);        } catch (Exception e){            e.printStackTrace();        }        log.info("收到请求,端口为:{}", port);        return "返回商品信息";    }}

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

SpringCloud Hystrix怎么使用

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

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

SpringCloud Hystrix怎么使用

3. Hystrix熔断原理

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

SpringCloud Hystrix怎么使用

3.1 熔断状态

  • open

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

  • closed

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

  • Half-Open

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

SpringCloud Hystrix怎么使用

3.2 熔断的工作原理

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

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

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

SpringCloud Hystrix怎么使用

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

SpringCloud Hystrix怎么使用

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

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

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

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

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

SpringCloud Hystrix怎么使用

关于“SpringCloud Hystrix怎么使用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注亿速云行业资讯频道,小编每天都会为大家更新不同的知识点。

文章标题:SpringCloud Hystrix怎么使用,发布者:亿速云,转载请注明出处:https://worktile.com/kb/p/23185

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
亿速云的头像亿速云认证作者
上一篇 2022年9月6日 上午12:15
下一篇 2022年9月6日 上午12:16

相关推荐

  • MySQL死锁是什么及怎么掌握

    1、什么是死锁? 死锁指的是在两个或两个以上不同的进程或线程中,由于存在共同资源的竞争或进程(或线程)间的通讯而导致各个线程间相互挂起等待,如果没有外力作用,最终会引发整个系统崩溃。 2、Mysql出现死锁的必要条件 资源独占条件 指多个事务在竞争同一个资源时存在互斥性,即在一段时间内某资源只由一个…

    2022年9月1日
    47500
  • JavaScript事件循环同步任务与异步任务怎么实现

    执行栈与任务队列 执行栈 姑且先不说执行栈是什么,先说栈是什么吧。栈就好似一个桶,最先放入的东西肯定是最后拿出来的,就是大家常说的先进后出。 那么执行栈就是把图中的内容块变成代码任务,光说肯定说不明白,还是得上代码: function fn (count) { if (count <= 0) …

    2022年9月1日
    54400
  • node强缓存和协商缓存怎么实现

    什么是浏览器缓存 浏览器缓存(http 缓存) 是指浏览器在本地磁盘对用户最近请求过的文档进行存储,当访问者再次访问同一页面时,浏览器就可以直接从本地磁盘加载文档。 优点 减少了冗余的数据传输,节省带宽,减少服务器压力 加快了客户端加载速度,提升用户体验。 强缓存 强缓存不会向服务器发送请求,而是直…

    2022年9月21日
    79000
  • 如何进行XiaoBa勒索病毒变种分析

    概述 XiaoBa勒索病毒,是一种新型电脑病毒,是一款国产化水平极高的勒索病毒,主要以邮件,程序木马,网页挂马的形式进行传播。这种病毒利用各种加密算法对文件进行加密,被感染者一般无法解密,必须拿到解密的私钥才有可能破解。倒计时200秒还不缴赎金,被加密的文件就会被全部销毁。 以上说明摘自百度百科,但…

    2022年9月21日
    64800
  • MySQL存储过程的参数如何使用

    MySQL存储过程的参数 MySQL存储过程的参数共有三种: IN OUT INOUT 输入参数 输入参数(IN):在调用存储过程中传递数据给存储过程的参数(在调用的存储过程必须具有实际值的变量 或者 字面值) 细节注意:下面的存储过程创建会报错,他的类型以及类型长度需要和创建表字段的类型和类型长度…

    2022年8月31日
    49400
  • Vue中slot插槽作用与原理是什么

    1、作用 父组件向子组件传递内容 扩展、复用、定制组件 2、插槽内心 2.1、默认插槽 把父组件中的数组,显示在子组件中,子组件通过一个slot插槽标签显示父组件中的数据。 子组件 <template> <div class=”slotChild”> <h5>{{…

    2022年9月22日
    88400
  • Python如何多线程并发下载图片

    最终效果 这就是我们最终要构建的效果。 安装依赖项 让我们安装每个人最喜欢的 requests 库。 pip install requests 现在,我们将看到一些用于下载单个 URL 并尝试自动查找图像名称以及如何使用重试的基本代码。 import requestsres = requests.g…

    2022年9月22日
    69000
  • SQL窗口函数之排名窗口函数怎么使用

    取值窗口函数可以用于返回窗口内指定位置的数据行。常见的取值窗口函数如下: LAG函数可以返回窗口内当前行之前的第N行数据。LEAD函数可以返回窗口内当前行之后的第N行数据。FIRST_VALUE函数可以返回窗口内名列前茅行数据。LAST_VALUE函数可以返回窗口内最后一行数据。NTH_VALUE函…

    2022年9月10日
    60400
  • 如何利用SAP ASE安全漏洞入侵数据库服务器

    SAP公司的Sybase数据库软件中存在一系列新的严重漏洞,没有权限的攻击者可利用这些漏洞完全控制目标数据库,在某些场景中,甚至可完全控制底层操作系统。 网络安全公司Trustware发现的这六个安全漏洞存在于Sybase Adaptive Server Enterprise(ASE)中,Sybas…

    2022年9月16日
    49000
  • windows罗技驱动常见问题怎么解决

    罗技驱动怎么用 1、首先我们百度搜索罗技驱动,进入罗技的网站。 2、进入后在上方选中“支持”,进入“软件下载” 3、然后点击下载下方的“下载与应用程序” 4、接着在软件下方找到并进入“罗技G HUB” 5、在上方可以选择我们的系统版本。 6、选择完成后点击下方的“download now” 7、然后…

    2022年9月20日
    1.1K00
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部