Hystrix容错保护的简单介绍(三)

版权声明:hear https://blog.csdn.net/qq_38845362/article/details/84727356

1.依赖隔离

1 依赖隔离的实现
在开篇 Hystrix 工作原理中我已经清晰的解释了依赖隔离的原理,现在介绍用Hystrix来实现依赖隔离?其实,我们在定义服务降级的时候,已经自动的实现了依赖隔离。在上面的示例中,我们使用了@HystrixCommand 或 @FeignClient 来将某个函数包装成了Hystrix命令,这里除了定义服务降级之外,Hystrix框架就会自动的为这个函数实现调用的隔离和断路器保护。所以,断路保护、依赖隔离、服务降级在使用时候都是一体化实现的,这样利用Hystrix来实现服务容错保护在编程模型上就非常方便的,并且考虑更为全面。

2.断路器熔断与恢复

  • 介绍:断路器的实现本身是一种开关装置,用于在电路上保护线路过载,当线路中有电器发生短路时,“断路器”能够及时的切断故障电路,防止发生过载、发热、甚至起火等严重后果。
  • 作用:当某个服务单元发生故障(类似用电器发生短路)之后,通过断路器的故障监控(类似熔断保险丝),直接切断原来的主逻辑调用。
  • 参数的作用:
    快照时间窗:断路器确定是否打开需要统计一些请求和错误数据,而统计的时间范围就是快照时间窗,默认为最近的10秒。
    请求总数下限:在快照时间窗内,必须满足请求总数下限才有资格根据熔断。默认为20,意味着在10秒内,如果该hystrix命令的调用此时不足20次,即时所有的请求都超时或其他原因失败,断路器都不会打开。
    错误百分比下限:当请求总数在快照时间窗内超过了下限,比如发生了30次调用,如果在这30次调用中,有16次发生了超时异常,也就是超过50%的错误百分比,在默认设定50%下限情况下,这时候就会将断路器打开。

3.雪崩效应

在介绍雪崩效应是所使用到的项目(前两篇已经介绍过):

  • springcloud-eureka
  • springcloud-provider
  • springcloud-consumer-feign
  • springcloud-consumer-feign-hystrix
  1. 修改项目
    对于注册中心 springcloud-eureka 我们无需做任何修改
  2. 对于 springcloud-provider 我们手动把服务处理响应时间修改为三秒,修改后控制器中服务方法如下:
package com.ysd.springcloud.controller;
import java.util.ArrayList;
import java.util.List;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
@Value("${server.port}")
private String serverPort;
/**
* http://localhost:8002/getFuture
* @return
*/
@RequestMapping("/getFuture")
public List<String> getFuture() {
try {
Thread.sleep(3000);//服务提供者延迟3秒响应
} catch (InterruptedException e) {
e.printStackTrace();
}
List<String> list = new ArrayList<>();
list.add("不积跬步,无以至千里;");
list.add("不积小流,无以成江海。");
list.add("出自端口号:"+serverPort);
return list;
}
}
  1. 修改服务消费者
    对于 springcloud-consumer-feign 和 springcloud-consumer-feign-hystrix 我们做同样的修改,在项目配置文件中添加tomcat的最大并发线程量为30
server:
#项目端口号
port: 8001
#tomcat最大并发线程数
tomcat:
max-threads: 30

在控制器中添加一个服务方法

/**
* http://localhost:8001/getOtherService
* @return
*/
@RequestMapping("/getOtherService")
public String getOtherService(){
return "Consumer的其它服务";
}
  1. 断路器熔断与恢复当启动 springcloud-consumer-feign 访问 http://localhost:8001/getProviderFuture 发现provider服务的响应结果出现在3秒之后,此为正常现象,很容易理解。
    当启动 springcloud-consumer-feign-hystrix 访问 http://localhost:8001/getProviderFuture 发现provider服务并没有响应,而是出现了回退机制执行的降级服务。
    此时provider只是有3秒延迟并未拒绝服务;服务消费者只有一个服务且仅被调用一次,不可能达到依赖隔离的最大线程量或信号量;由此引发回退机制执行了降级服务的原因是断路器熔断。
  2. 修改断路器超时时间
    继续动手修改 springcloud-consumer-feign-hystrix 项目的配置文件,添加断路器超时时间设置为 50 秒
#断路器的超时时间,下级服务返回超出时间则熔断并执行回退机制
##默认=1000,太小,修改为50秒
hystrix:
command:
default:
execution:
timeout:
enabled: true
isolation:
thread:
timeoutInMilliseconds: 50000

  1. 依赖隔离
    前面我们已经把两个消费者项目最大并发负载修改为 30 ,而且都有两个服务

Jmeter设置参数如下:

在此期间我们请求 http://localhost:8001/getOtherService ,测试其响应时间

  • 当测试 springcloud-consumer-feign 时因为没有 Hystrix容错保护 /getProviderFuture
    的过载引起 /getOtherService 的性能极具下降。雪崩效应相当明显。
  • 当测试 springcloud-consumer-feign-hystrix 时 /getOtherService
    响应很快性能没有任何影响,且 /getProviderFuture 执行了服务降级。

原因如下: springcloud-consumer-feign-hystrix 因为有Hystrix容错保护的依赖隔离措施, /getProviderFuture 的过载对 /getOtherService 的性能没有任何影响。且在此时 /getProviderFuture 服务达到最大线程量时会引发依赖隔离的回退机制执行服务降级

猜你喜欢

转载自blog.csdn.net/qq_38845362/article/details/84727356