单个服务发生故障,占用过多的系统资源,从而导致级联故障的情况称为服务雪崩。
在分布式环境中,许多服务依赖项中的一些必然会失败。(服务挂了) Hystrix是一个库,通过添加延迟容忍和容错逻辑,控制这些分布式服务之间的交互。 Hystrix通过隔离服务之间的访问点、停止级联失败和提供回退选项来实现这一点,所有这些都可以提高系统的整体弹性。
容错:允许犯错,在微服务开放中主要体现在服务故障。
简言之,Hystrix是一个实现容错机制的组件。【也是实现高可用的目的】
什么是断路器模式?
家用空开就是一种断路器模式,前身是保险丝。假设某个电器负载过大而损坏,空开会跳闸,而保险丝会熔断。
假设没有空开或者保险丝呢?引起更大的电路故障,甚至导致火灾,再扩张可能会烧到邻居家的房子。
对于微服务来说同样如此,当某一个服务出现问题时,使用断路器关停服务,不会导致由于持续访问导致的资源占有从而引起其他服务的正常运行。
服务熔断指的是当网络请求达到某一个阈值(可设置)时,为了防止服务过载,占用系统资源,暂停该服务的调用,使服务降级。【服务没挂,但是担心挂了,就让服务暂时休息一下】
服务降级涉及的范围更大,
如何理解服务熔断和服务降级的差异?
服务熔断的场景是请求次数过多而设计的一种保护策略。而服务降级是着眼于整个系统的各种问题(超时,故障等等)。服务熔断会引起服务降级。换句话说,熔断是降级的一部分。
默认开启线程池隔离,服务熔断,服务降级
接着上次的工程做些修改:【和feign结合使用】
https://github.com/HCJ-shadow/Feign
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.7.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.SR2</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<!-- Eureka客户端启动需要依赖web模块-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>
<!-- <dependency>-->
<!-- <groupId>org.springframework.cloud</groupId>-->
<!-- <artifactId>spring-cloud-starter-openfeign</artifactId>-->
<!-- </dependency>-->
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
server:
port: 80
eureka:
client:
service-url:
defaultZone: http://eureka6001.com:6001/eureka/,http://eureka6002.com:6002/eureka/,http://eureka6003.com:6003/eureka/
spring:
application:
name: hystrix-consumer
package zkrun.top;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
@SpringBootApplication
@EnableFeignClients
@EnableEurekaClient
@EnableCircuitBreaker
public class App_Consumer_Hystrix_Feign_80
{
public static void main(String[] args)
{
SpringApplication.run(App_Consumer_Hystrix_Feign_80.class, args);
}
}
使用Jmeter
http://jmeter.apache.org/download_jmeter.cgi
解压后双击bin下面的jmeter.bat即可
设置线程数为100
设置相关信息
执行测试,查看结果树
额嗯,完全抗的住啊!!!
设置线程数为500:
出现熔断情况。
设置故障降级,把5001关停
调用降级方法,重复几次之后,将不再访问5001。【Ribbon的RetryRule策略】
假设重启服务,
即可正常访问。
代码参考:https://github.com/HCJ-shadow/Hystrix