Spring Cloud Hystrix的基本用法大全

目录
  • 1. Hystrix的简单使用
    • 1.1 服务降级
    • 1.2 服务熔断
  • 2. OpenFeign集成Hystrix
  • 3. Hystrix熔断原理
    • 3.1 熔断状态
    • 3.2 熔断的工作原理
  • 4. 代码地址

本文主要讲述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;

    /**
     * 根据ID查询商品信息
     *
     * @return
     */
    @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使用内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • springcloud 熔断器Hystrix的具体使用

    说起springcloud熔断让我想起了去年股市中的熔断,多次痛的领悟,随意实施的熔断对整个系统的影响是灾难性的,好了接下来我们还是说正事. 熔断器 雪崩效应 在微服务架构中通常会有多个服务层调用,基础服务的故障可能会导致级联故障,进而造成整个系统不可用的情况,这种现象被称为服务雪崩效应.服务雪崩效应是一种因"服务提供者"的不可用导致"服务消费者"的不可用,并将不可用逐渐放大的过程. 如果下图所示:A作为服务提供者,B为A的服务消费者,C和D是B的服务消费者.A不可

  • spring cloud hystrix 超时时间使用方式详解

    我们在使用后台微服务的时候,各个服务之前会有很多请求和交叉业务.这里会引起雪崩.超时等异常处理.SpringCloud Hystrix服务降级.容错机治理使 hystrix 有很好的支持,引入后实现断路器功能. 1:pom 引入jar包 <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</a

  • springcloud使用Hystrix进行微服务降级管理

    前言:目前我们的项目是微服务架构,基于dubbo框架,服务之间的调用是通过rpc调用的.刚开始没有任何问题,项目运行健康.良好.可是过了一段时间,线上总有人反应查询订单失败,等过了一段时间才能查到.这是怎么回事呢?打开后台的日志一看出现了一些RpcException和TimeOutException,原来是远程调用超时了,可能某个服务在请求的高发期访问数据库异常,IO阻塞,返回接口异常了.后来这个问题越来越频繁,如何解决这个棘手的问题呢? 一:Hystrix是什么? 1.1:基本解释 Hystr

  • SpringCloud Hystrix的使用

    简介 在分布式系统中,服务与服务之间依赖错综复杂,一种不可避免的情况就是某些服务将会出现失败.Hystrix是一个库,它提供了服务与服务之间的容错功能,主要体现在延迟容错和容错,从而做到控制分布式系统中的联动故障.Hystrix通过隔离服务的访问点,阻止联动故障,并提供故障的解决方案,从而提高了这个分布式系统的弹性. 面对的问题: 一个应用一般会依赖多个服务,每个服务由于网络不可靠,机房的不可靠等等不稳定的因素,总会导致服务的故障,如果我们不对这些故障做处理,就会进而导致整个系统的不可用. 服务

  • SpringCloud之Hystrix的详细使用

    目录 ***一.服务降级*** 2.不使用Hystrix的项目 3. 使用Hystrix 4. 全局的Hystrix配置 ***二.服务熔断*** 1.熔断机制概述 2.项目中使用 1.概念 服务降级:服务器繁忙,请稍后再试,不让客户端等待,并立即返回一个友好的提示(一般发生在 程序异常,超时,服务熔断触发服务降级,线程池.信号量 打满也会导致服务降级)服务熔断 : 达到最大服务访问后,直接拒绝访问,然后调用服务降级的方法并返回友好提示(如保险丝一样)服务限流 : 秒杀等高并发操作,严禁一窝蜂的

  • SpringCloud Zuul在何种情况下使用Hystrix及问题小结

    首先,引入spring-cloud-starter-zuul之后会间接引入: hystrix依赖已经引入,那么何种情况下使用hystrix呢? 在Zuul的自动配置类ZuulServerAutoConfiguration和ZuulProxyAutoConfiguration中总共会向Spring容器注入3个Zuul的RouteFilter,分别是 •SimpleHostRoutingFilter 简单路由,通过HttpClient向预定的URL发送请求 生效条件: RequestContext.

  • Spring Cloud Hystrix的基本用法大全

    目录 1. Hystrix的简单使用 1.1 服务降级 1.2 服务熔断 2. OpenFeign集成Hystrix 3. Hystrix熔断原理 3.1 熔断状态 3.2 熔断的工作原理 4. 代码地址 本文主要讲述Hystrix,也可以称之为豪猪哥. 它是Spring Cloud中集成的一个组件,在整个生态中主要为我们提供以下功能: 服务隔离 服务隔离主要包括线程池隔离以及信号量隔离. 服务熔断 当请求持续失败的时候,服务进行熔断,默认熔断5S,也是就说在这5S内的请求一律拒绝. 服务降级

  • Spring Cloud Hystrix入门和Hystrix命令原理分析

    断路由器模式 在分布式架构中,当某个服务单元发生故障之后,通过断路由器的故障监控(类似熔断保险丝),向调用方返回一个错误响应,而不是长时间的等待.这样就不会使得线程因调用故障服务被长时间占用不释放,避免了故障在分布式系统中的蔓延. Spring Cloud Hystrix针对上述问题实现了断路由器.线程隔离等一系列服务保护功能.它是基于Netflix Hystrix实现,该框架的目标在于通过控制那些访问远程系统.服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力. Hystrix具备服务

  • Spring Cloud Hystrix 服务容错保护的原理实现

    一.Hystrix 是什么 ​ 在微服务架构中,我们将系统拆分成了若干弱小的单元,单元与单元之间通过HTTP或者TCP等方式相互访问,各单元的应用间通过服务注册与订阅的方式相互依赖.由于每个单元都在不同的进程中运行,依赖 远程调用 的方式执行,这样就可能引起因为网速变慢或者网络故障导致请求变慢或超时,若此时调用方的请求在不断增加,最后就会因等待出现故障的依赖方响应形成任务积压,最终导致自身服务的瘫痪. ​ Hystrix 是Netflix 中的一个组件库,它隔离了服务之间的访问点,阻止了故障节点

  • Spring Cloud Hystrix异常处理方法详解

    这篇文章主要介绍了Spring Cloud Hystrix异常处理方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 在调用服务执行HsytrixCommand实现的run()方法抛出异常时,除HystrixBadRequestException之外,其他异常都会认为是Hystrix命令执行失败并触发服务降级处理逻辑. 异常处理 当Hystrix命令因为异常(除了HystrixBadRequestException异常)进入服务降级逻辑之后

  • 详解Spring Cloud Hystrix断路器实现容错和降级

    简介 Spring cloud提供了Hystrix容错库用以在服务不可用时,对配置了断路器的方法实行降级策略,临时调用备用方法.这篇文章将创建一个产品微服务,注册到eureka服务注册中心,然后我们使用web客户端访问/products API来获取产品列表,当产品服务故障时,则调用本地备用方法,以降级但正常提供服务. 基础环境 JDK 1.8 Maven 3.3.9 IntelliJ 2018.1 Git:项目源码 添加产品服务 在intelliJ中创建一个新的maven项目,使用如下配置 g

  • spring cloud Hystrix断路器的使用(熔断器)

    1.Hystrix客户端 Netflix已经创建了一个名为Hystrix的库,实现了断路器的模式.在microservice架构通常有多个层的服务调用. 低水平的服务的服务失败会导致级联故障一直给到用户.当调用一个特定的服务达到一定阈值(默认5秒失败20次),打开断路器.在错误的情况下和一个开启的断路回滚应可以由开发人员提供. 有一个断路器阻止级联失败并且允许关闭服务一段时间进行愈合.回滚会被其他hystrix保护调用,静态数据或健全的空值. 代码如下: @SpringBootApplicati

  • Spring Cloud Hystrix 线程池队列配置(踩坑)

    背景: 有一次在生产环境,突然出现了很多笔还款单被挂起,后来排查原因,发现是内部系统调用时出现了Hystrix调用异常.在开发过程中,因为核心线程数设置的比较大,没有出现这种异常.放到了测试环境,偶尔有出现这种情况,后来在网上查找解决方案,网上的方案是调整maxQueueSize属性就好了,当时调整了一下,确实有所改善.可没想到在生产环境跑了一段时间后却又出现这种了情况,此时我第一想法就是去查看maxQueueSize属性,可是maxQueueSize属性是设置值了.当时就比较纳闷了,为什么ma

  • 详解spring cloud hystrix缓存功能的使用

    hystrix缓存的作用是 - 1.减少重复的请求数,降低依赖服务的返回数据始终保持一致. - 2.==在同一个用户请求的上下文中,相同依赖服务的返回数据始终保持一致==. - 3.请求缓存在run()和construct()执行之前生效,所以可以有效减少不必要的线程开销. 1 通过HystrixCommand类实现 1.1 开启缓存功能 继承HystrixCommand或HystrixObservableCommand,覆盖getCacheKey()方法,指定缓存的key,开启缓存配置. im

  • 详解spring cloud hystrix请求缓存(request cache)

    hystrix支持将一个请求结果缓存起来,下一个具有相同key的请求将直接从缓存中取出结果,减少请求开销.要使用该功能必须管理HystrixRequestContext,如果请求B要用到请求A的结果缓存,A和B必须同处一个context.通过HystrixRequestContext.initializeContext()和context.shutdown()可以构建一个context,这两条语句间的所有请求都处于同一个context,当然这个管理过程可以通过自定义的filter来实现,参考上一

随机推荐