一.雪崩效应
(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通过服务熔断和降级策略,提高了微服务架构的稳定性和容错性,是构建高可用系统的关键工具。通过理解其核心概念和使用方法,开发者可以更好地应对分布式系统中的复杂挑战,实现更加健壮的...
总之,SpringCloud中的Hystrix服务熔断是构建高可用分布式系统的关键技术之一,通过熔断、降级和监控等手段,能有效地提高系统的健壮性和容错能力,保障服务的稳定运行。在实际开发中,我们需要根据业务需求合理配置...
Spring Cloud Hystrix是一个由Netflix开源的Java框架,用于在分布式系统中提供延迟和容错功能,特别适用于对微服务架构中的远程过程调用(RPC)进行控制。其核心目标是通过添加一个延迟容忍层来隔离各个微服务之间的...
在分布式系统中,服务间的调用异常处理是至关重要的,Spring Cloud Hystrix 就是为了解决这一问题而设计的。Hystrix 是 Netflix 开源的一个延迟和容错库,用于隔离服务间的调用,防止因某个服务的不稳定导致整个系统...
Spring Cloud 集成了 Hystrix 框架,为实现服务降级提供了强大的支持。下面详细介绍如何在 Spring Cloud 应用中使用 Hystrix 进行服务降级: 1. **导入 Maven 依赖** 要使用 Hystrix,首先需要在项目的 `pom.xml`...
Spring Cloud Hystrix 是一个基于 Netflix Hystrix 实现的服务降级、断路器和熔断器框架,它被广泛应用于分布式系统中的容错管理,以提高系统的稳定性和可用性。在微服务架构中,服务间通信是常见的操作,而Spring ...
在Spring Cloud中,Hystrix通过以下方式实现服务熔断: 1. **隔离策略**:Hystrix使用线程池或信号量隔离技术,确保单个服务故障不会影响到整个应用。每个服务调用都被分配到一个特定的线程池,当线程池满时,新...
这个例子展示了如何在Spring Cloud环境中集成Hystrix来实现服务熔断和降级策略。 首先,`spring-cloud-hystrix` 是Netflix开发的一个库,它是基于Hystrix设计模式的实现,用于构建容错系统。Hystrix的核心概念包括...
总的来说,Spring Cloud Hystrix 通过服务降级、断路器模式、线程隔离等策略,提高了微服务架构的容错性和稳定性。开发者可以通过配置断路器阈值、实现降级逻辑,以及利用监控工具,来精细化管理服务的健康状态,...
Spring Cloud是微服务架构中的一...通过深入学习和实践`microservice-hystrix-dashboard`、`microservice-client`和`microservice-springcloud`,我们可以更好地理解和掌握Spring Cloud Hystrix的使用方法和应用场景。
springcloud熔断降级组件hystrix详解代码练习,由于平台上传限制,所以分为了两个部分上传。此为第二部分。 第一部分为:https://download.csdn.net/download/keenstyle/12232188
在Spring Cloud生态系统中,`Hystrix`、`Feign`和`Eureka`是核心组件,它们在构建分布式系统和服务发现中起着至关重要的作用。`Ribbon`虽然未直接提及,但在Spring Cloud中也常常与这些组件一起使用,它是客户端负载...
springcloud熔断降级组件hystrix详解代码练习,由于平台上传限制,所以分为了两个部分上传。此为第一部分。 第二部分:https://download.csdn.net/download/keenstyle/12232210
SpringCloud微服务之Hystrix组件实现服务熔断的方法 微服务架构特点是多服务、多数据源、支撑系统应用,这样导致微服务之间存在依赖关系。如果其中一个服务故障,可能导致系统宕机,这就是所谓的雪崩效应。为了解决...
在Spring Cloud微服务架构中,Feign和Hystrix是两个重要的组件,它们协同工作以实现服务间的调用和容错处理。Feign是一个声明式的Web服务客户端,它使得编写Web服务客户端变得简单,而Hystrix则是一个用于处理延迟和...
feign中包含了hystrix以及ribbon,即feign在不导入hystrix和ribbon的依赖下也能完成他们所能实现的功能,当然,如果想使用hystrix和ribbon自带的注解以及配置,必须导入依赖才可以,feign结合hystrix实现熔断+降级,...
Hystrix是Spring Cloud提供的容错管理工具,它通过隔离请求、降级策略、超时控制等机制,确保在高并发、网络延迟或服务故障时,系统仍然能够稳定运行。Hystrix的断路器模式是其核心特性,能够防止服务雪崩效应,提高...
其中,Spring Cloud Netflix Hystrix是一款至关重要的组件,它为企业级应用提供了强大的容错保护,实现了服务间的熔断和降级策略,极大地提升了系统的稳定性和可靠性。 Hystrix的核心概念包括: 1. **熔断器模式**...
4. **熔断器**:通过Hystrix实现服务间的熔断、容错和降级。 5. **消息总线**:通过Spring Cloud Bus实现消息的广播机制,可以用于实时更新配置。 6. **API Gateway**:通过Zuul实现服务路由。 7. **分布式跟踪**:...