`
maosheng
  • 浏览: 565102 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

SpringCloud Hystrix实现服务熔断和服务降级

阅读更多
一.雪崩效应

(1)微服务架构的系统通常包含多个服务层,每一个服务专注于自己的业务逻辑,并对外提供相应的接口,各服务间通过服务注册与订阅的方式互相依赖。假如有一个请求需要调用A服务,但A服务出现了问题,则这个请求就会阻塞,那么只要调用服务A的请求都会阻塞,当阻塞的请求越来越多,占用的计算机资源就越来越多。当一个服务出现问题,可能导致所有的请求都不可用,从而导致整个分布式系统都不可用,这就是“雪崩效应”。

(2)雪崩效应产生的原因:
硬件故障:比如服务器主机死机,机房断电等。
流量激增:比如异常流量、用户重试导致系统负载升高。
缓存刷新:假设A为client端,B为Server端,假设A系统请求都流向B系统,请求超出了B系统的承载能力,就会造成B系统崩溃。
程序有Bug:代码循环调用的逻辑问题,资源未释放引起的内存泄漏等问题;

服务雪崩的根本原因是:大量请求线程同步等待造成的资源耗尽

当服务调用者使用同步调用的时候,会产生大量的等待线程占用系统资源,一旦线程资源被耗尽,服务调用者提供的服务也将处于不可用状态,于是服务雪崩效应产生了!

为有效应对雪崩效应,提高关键业务的可用性,可使用熔断器原理,对部分非核心业务、低服务质量的业务进行服务降级。Netflix Hystrix借助熔断器功能,通过监控远程调用状态,统计分析远程调用数据,一旦发现服务质量较差服务或故障服务,则进行服务降级,不再直接调用远程服务,避免出现雪崩效应,有效为微服务系统提供了保护。


  1.请求熔断: 当Hystrix Command请求后端服务失败数量超过一定比例(默认50%), 断路器会切换到开路状态(Open). 这时所有请求会直接失败而不会发送到后端服务. 断路器保持在开路状态一段时间后(默认5秒), 自动切换到半开路状态(HALF-OPEN).

    这时会判断下一次请求的返回情况, 如果请求成功, 断路器切回闭路状态(CLOSED), 否则重新切换到开路状态(OPEN). Hystrix的断路器就像我们家庭电路中的保险丝, 一旦后端服务不可用, 断路器会直接切断请求链, 避免发送大量无效请求影响系统吞吐量, 并且断路器有自我检测并恢复的能力.

  2.服务降级:Fallback相当于是降级操作. 对于查询操作, 我们可以实现一个fallback方法, 当请求后端服务出现异常的时候, 可以使用fallback方法返回的值. fallback方法的返回值一般是设置的默认值或者来自缓存.告知后面的请求服务不可用了,不要再来了。

  3.依赖隔离(采用舱壁模式,Docker就是舱壁模式的一种):在Hystrix中, 主要通过线程池来实现资源隔离. 通常在使用的时候我们会根据调用的远程服务划分出多个线程池.比如说,一个服务调用两外两个服务,你如果调用两个服务都用一个线程池,那么如果一个服务卡在哪里,资源没被释放

   后面的请求又来了,导致后面的请求都卡在哪里等待,导致你依赖的A服务把你卡在哪里,耗尽了资源,也导致了你另外一个B服务也不可用了。这时如果依赖隔离,某一个服务调用A B两个服务,如果这时我有100个线程可用,我给A服务分配50个,给B服务分配50个,这样就算A服务挂了,我的B服务依然可以用。

  4.请求缓存:比如一个请求过来请求我userId=1的数据,你后面的请求也过来请求同样的数据,这时我不会继续走原来的那条请求链路了,而是把第一次请求缓存过了,把第一次的请求结果返回给后面的请求。

  5.请求合并:我依赖于某一个服务,我要调用N次,比如说查数据库的时候,我发了N条请求发了N条SQL然后拿到一堆结果,这时候我们可以把多个请求合并成一个请求,发送一个查询多条数据的SQL的请求,这样我们只需查询一次数据库,提升了效率。


二.服务熔断和服务降级

(1)服务熔断
当对于目标服务的请求和调用大量超时或失败时,应该熔断该服务的所有调用,并且对于后续调用应直接返回,从而快速释放资源,确保在目标服务不可用的这段时间内,所有对它的调用都是立即返回,不会阻塞的。在SpringCloud框架里,熔断机制通过Hystrix实现。Hystrix会监控微服务间调用的状况,当失败的调用到一定阈值,缺省是5秒内20次调用失败,就会启动熔断机制。


(2)服务降级
服务降级一般从整体负荷考虑,当服务器压力剧增的情况下,根据当前业务情况及流量对一些服务和页面有策略的降级。服务将不再被调用,这时客户端可以自己准备一个本地的fallback回调返回一个缺省值。从而释放服务器资源以保证核心业务正常运作或高效运作。

服务降级策略:

微服务使用Hystrix熔断器实现了服务的自动降级,让微服务具备自我保护的能力,提升了系统的稳定性,也较好的解决雪崩效应。其使用方式目前支持两种策略:

1、线程池隔离策略:使用一个线程池来存储当前的请求,线程池对请求作处理,设置任务返回处理超时时间,堆积的请求堆积入线程池队列。这种方式需要为每个依赖的服务申请线程池,有一定的资源消耗,好处是可以应对突发流量(流量洪峰来临时,处理不完可将数据存储到线程池队里慢慢处理)

2、信号量隔离策略:使用一个原子计数器(或信号量)来记录当前有多少个线程在运行,请求来先判断计数器的数值,若超过设置的最大线程个数则丢弃改类型的新请求,若不超过则执行计数操作请求来计数器+1,请求返回计数器-1。这种方式是严格的控制线程且立即返回模式,无法应对突发流量(流量洪峰来临时,处理的线程超过数量,其他的请求会直接返回,不继续去请求依赖的服务)

服务降级是否开启由依赖调用的错误比率决定。在服务窗口期内,服务请求量大于预设阈值,依赖调用的错误比率=请求失败数/请求总数。Hystrix中断路器打开的默认请求服务错误比率为50%,对于被熔断的服务请求,并不是永久被切断,而是被暂停一段时间(默认是5S)之后,允许部分请求通过。若请求响应正常则恢复依赖服务请求(取消熔断),如果不是健康的,则继续暂停请求服务(继续熔断)。


Hystrix流程说明:

  1:每次调用创建一个新的HystrixCommand,把依赖调用封装在run()方法中.
  2:执行execute()/queue做同步或异步调用.
  4:判断熔断器(circuit-breaker)是否打开,如果打开跳到步骤8,进行降级策略,如果关闭进入步骤5.
  5:判断线程池/队列/信号量是否跑满,如果跑满进入降级步骤8,否则继续后续步骤6.
  6:调用HystrixCommand的run方法.运行依赖逻辑
  6a:依赖逻辑调用超时,进入步骤8.
  7:判断逻辑是否调用成功
  7a:返回成功调用结果
  7b:调用出错,进入步骤8.
  8:计算熔断器状态,所有的运行状态(成功, 失败, 拒绝,超时)上报给熔断器,用于统计从而判断熔断器状态.
  9:getFallback()降级逻辑.以下四种情况将触发getFallback调用:
    (1):run()方法抛出非HystrixBadRequestException异常。
    (2):run()方法调用超时
    (3):熔断器开启拦截调用
    (4):线程池/队列/信号量是否跑满
  9a:没有实现getFallback的Command将直接抛出异常
  9b:fallback降级逻辑调用成功直接返回
  9c:降级逻辑调用失败抛出异常
  10:返回执行成功结果


三.使用SpringCloud Hystrix实现服务容错

(1)在pom.xml中添加以下依赖。

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

(2)在启动类上添加@EnableCircuitBreaker或@EnableHystrix注解。

实现思路:
1.通过HystrixCommand注解指定
2.fallbackMethod中具体实现降级逻辑

package com.example.hystrixdemo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;

@SpringBootApplication
@EnableCircuitBreaker
@EnableDiscoveryClient
public class HystrixDemoApplication {

    @Bean
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
    public static void main(String[] args) {
        SpringApplication.run(HystrixDemoApplication.class, args);
    }

}

(3)CompanyController控制器代码。

package com.example.hystrixdemo.controller;

import com.example.hystrixdemo.entity.User;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
public class CompanyController {

    @Autowired
    private RestTemplate restTemplate;

    @HystrixCommand(fallbackMethod = "getByIdFallback",commandProperties = {
            @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "1000"),
            @HystrixProperty(name = "metrics.rollingStats.thread.timeInMilliseconds", value = "5000")
            }, threadPoolProperties = {
            @HystrixProperty(name = "coreSize", value = "1")
    })
    @GetMapping("/user/{id}")
    public User getById(@PathVariable Integer id){
        return restTemplate.getForObject("http://localhost:8001/"+id,User.class);
    }

    public User getByIdFallback(@PathVariable Integer id){
        User user=new User();
        user.setId(0);
        user.setName("默认员工");
        return user;
    }
}











分享到:
评论

相关推荐

    SpringCloud Hystrix服务熔断.docx

    总之,SpringCloud Hystrix通过服务熔断和降级策略,提高了微服务架构的稳定性和容错性,是构建高可用系统的关键工具。通过理解其核心概念和使用方法,开发者可以更好地应对分布式系统中的复杂挑战,实现更加健壮的...

    SpringCloud(hystrix服务熔断)

    总之,SpringCloud中的Hystrix服务熔断是构建高可用分布式系统的关键技术之一,通过熔断、降级和监控等手段,能有效地提高系统的健壮性和容错能力,保障服务的稳定运行。在实际开发中,我们需要根据业务需求合理配置...

    spring cloud hystrix原理介绍及使用

    Spring Cloud Hystrix是一个由Netflix开源的Java框架,用于在分布式系统中提供延迟和容错功能,特别适用于对微服务架构中的远程过程调用(RPC)进行控制。其核心目标是通过添加一个延迟容忍层来隔离各个微服务之间的...

    springcloud hystrix 断路由

    在分布式系统中,服务间的调用异常处理是至关重要的,Spring Cloud Hystrix 就是为了解决这一问题而设计的。Hystrix 是 Netflix 开源的一个延迟和容错库,用于隔离服务间的调用,防止因某个服务的不稳定导致整个系统...

    springCloud_hystrix(断路由服务降级)

    Spring Cloud 集成了 Hystrix 框架,为实现服务降级提供了强大的支持。下面详细介绍如何在 Spring Cloud 应用中使用 Hystrix 进行服务降级: 1. **导入 Maven 依赖** 要使用 Hystrix,首先需要在项目的 `pom.xml`...

    spring cloud降级服务-hystrix.7z

    Spring Cloud Hystrix 是一个基于 Netflix Hystrix 实现的服务降级、断路器和熔断器框架,它被广泛应用于分布式系统中的容错管理,以提高系统的稳定性和可用性。在微服务架构中,服务间通信是常见的操作,而Spring ...

    SpringCloud10-Hystrix熔断器及服务熔断

    在Spring Cloud中,Hystrix通过以下方式实现服务熔断: 1. **隔离策略**:Hystrix使用线程池或信号量隔离技术,确保单个服务故障不会影响到整个应用。每个服务调用都被分配到一个特定的线程池,当线程池满时,新...

    spring cloud hystrix 服务容错保护例子

    这个例子展示了如何在Spring Cloud环境中集成Hystrix来实现服务熔断和降级策略。 首先,`spring-cloud-hystrix` 是Netflix开发的一个库,它是基于Hystrix设计模式的实现,用于构建容错系统。Hystrix的核心概念包括...

    SpringCloud(Hystrix服务降级)

    总的来说,Spring Cloud Hystrix 通过服务降级、断路器模式、线程隔离等策略,提高了微服务架构的容错性和稳定性。开发者可以通过配置断路器阈值、实现降级逻辑,以及利用监控工具,来精细化管理服务的健康状态,...

    Spring Cloud(Hystrix)使用.zip

    Spring Cloud是微服务架构中的一...通过深入学习和实践`microservice-hystrix-dashboard`、`microservice-client`和`microservice-springcloud`,我们可以更好地理解和掌握Spring Cloud Hystrix的使用方法和应用场景。

    springcloud熔断降级组件hystrix详解.part2.rar

    springcloud熔断降级组件hystrix详解代码练习,由于平台上传限制,所以分为了两个部分上传。此为第二部分。 第一部分为:https://download.csdn.net/download/keenstyle/12232188

    springcloud hystrix+feign

    在Spring Cloud生态系统中,`Hystrix`、`Feign`和`Eureka`是核心组件,它们在构建分布式系统和服务发现中起着至关重要的作用。`Ribbon`虽然未直接提及,但在Spring Cloud中也常常与这些组件一起使用,它是客户端负载...

    springcloud熔断降级组件hystrix详解.part1.rar

    springcloud熔断降级组件hystrix详解代码练习,由于平台上传限制,所以分为了两个部分上传。此为第一部分。 第二部分:https://download.csdn.net/download/keenstyle/12232210

    SpringCloud微服务之Hystrix组件实现服务熔断的方法

    SpringCloud微服务之Hystrix组件实现服务熔断的方法 微服务架构特点是多服务、多数据源、支撑系统应用,这样导致微服务之间存在依赖关系。如果其中一个服务故障,可能导致系统宕机,这就是所谓的雪崩效应。为了解决...

    springcloud feign整合hystrix(服务降级).doc

    在Spring Cloud微服务架构中,Feign和Hystrix是两个重要的组件,它们协同工作以实现服务间的调用和容错处理。Feign是一个声明式的Web服务客户端,它使得编写Web服务客户端变得简单,而Hystrix则是一个用于处理延迟和...

    微服务springcloud之feign和hystrix使用demo

    feign中包含了hystrix以及ribbon,即feign在不导入hystrix和ribbon的依赖下也能完成他们所能实现的功能,当然,如果想使用hystrix和ribbon自带的注解以及配置,必须导入依赖才可以,feign结合hystrix实现熔断+降级,...

    Spring Cloud实战 _springcloud实战_springcloud_

    Hystrix是Spring Cloud提供的容错管理工具,它通过隔离请求、降级策略、超时控制等机制,确保在高并发、网络延迟或服务故障时,系统仍然能够稳定运行。Hystrix的断路器模式是其核心特性,能够防止服务雪崩效应,提高...

    spring-cloud-netflix-hystrix应用

    其中,Spring Cloud Netflix Hystrix是一款至关重要的组件,它为企业级应用提供了强大的容错保护,实现了服务间的熔断和降级策略,极大地提升了系统的稳定性和可靠性。 Hystrix的核心概念包括: 1. **熔断器模式**...

    SpringCloud项目源码下载.docx

    4. **熔断器**:通过Hystrix实现服务间的熔断、容错和降级。 5. **消息总线**:通过Spring Cloud Bus实现消息的广播机制,可以用于实时更新配置。 6. **API Gateway**:通过Zuul实现服务路由。 7. **分布式跟踪**:...

Global site tag (gtag.js) - Google Analytics