SpringClound——Hystrix断路器

SpringCloud学习资料汇总超级棒的
如上是我在看文章时忽然看到的一个很好的学习SpringCloud的网站

SpringClound——微服务概述——史上最烂
SpringClound——SpringClound入门概述——史上最烂
SpringCloud——Eureka——史上最基本
SpringClound——Ribbon负载均衡——史上最烂系列
SpringClound——Feign
SpringClound——Hystrix断路器

文章目录

  • 1:Hystrix断路器介绍
  • 2:服务熔断
  • 3:服务降级
  • 4:服务限流
  • 5:豪猪hystrixDashboard
  • 6:Hystrix 工作流程

1:Hystrix断路器介绍

  • Hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,比如超时、异常等Hystrix能够保证在一个依赖出问题的情况下, 不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性。
  • “断路器”本身是一种开关装置,当某个服务单元发生故障之后,通过断路器的故障监控(类似熔断保险丝),向调用方返回一个符合预期的、可处理的备选响应(FallBack) ,而不是长时间的等待或者抛出调用方无法处理的异常,这样就保证了服务调用方的线程不会被长时间、不必要地占用,从而避免了故障在分布式系统中的蔓延,乃至雪崩。

多个微服务之间调用的时候,假设微服务A调用微服务B和微服务C,微服务B和微服务C又调用其它的微服务,这就是所谓的“扇出”。如果扇出的链路上某个微服务的调用响应时间过长或者不可用,对微服务A的调用就会占用越来越多的系统资源,进而引起系统崩溃,所谓的“雪崩效应”.

对于高流量的应用来说,单一的后端依赖可能会导致所有服务器上的所有资源都在几秒钟内饱和。比失败更糟糕的是,这些应用程序还可能导致服务之间的延迟增加,备份队列,线程和其他系统资源紧张,导致整个系统发生更多的级联故障。这些都表示需要对故障和延迟进行隔离和管理,以便单个依赖关系的失败,不能取消整个应用程序或系统。

  • 可以干嘛:服务降级,服务熔断,服务限流,接近实时监控

2:服务熔断

  • 熔断机制是应对雪崩效应的一种微服务链路保护机制。
  • 过程:服务降级-》进而熔断-》恢复调用链路
  • 当扇出链路的某个微服务不可用或者响应时间太时,会进行服务的降级,进而熔断该节点微服务的调用,快速返回"错误”的响应信息。当检测到该节点微服务调用响应正常后恢复调用链路。在SpringCloud框架里熔断机制通过Hystrix实现。 Hystrix会监控微服务间调用的状况,当失败的调用到一定阈值,缺省是5秒内20次调用失败就会启动熔断机制。熔断机制的注解是@HystrixCommand.
  • 使用@HystrixCommand.,需要在pom文件中引入如下maven

		<dependency>
			<groupId>org.springframework.cloudgroupId>
			<artifactId>spring-cloud-starter-hystrixartifactId>
		dependency>
  • 熔断类型
熔断打开:
请求不再进行调用当前服务。内部设置时钟-般为MTTR (平均故障处理时间)。当打开时长达到所设时钟则进入半熔断状态
熔断关闭:
熔断关闭不会对服务进行熔断
熔断半开:
部分请求根据规则调用当的服务,如果请求成功目符合规则则认为当前服务恢复正常,关闭熔断
  • 断路器开关或者关闭条件
1:当满足一定的阀值的时候(默认10秒内超过20个请求次数)
2:当失败率达到一定的时候(默认10秒内超过50%的请求失败)
3:到达以上阀值,断路器将会开启
4:当开启的时候,所有请求都不会进行转发
5:一段时间之后(默认是5秒),这个时候断路器是半开状态,会让其中一个请求进行转发。如果成功,断路器会关闭,若失败,继续开启。
  • 断路器在什么情况起作用?

如下报错,就会调用注解@HystrixCommand,断路器就起作用了

涉及到断路器的三个重要参数:快照时间窗、请求总数阀值、错误百分比阀值。
1:快照时间窗(sleepWindowInMilliseconds):断路器确定是否打开需要统计-些请求和错误数据,而统计的时间范围就是快照时间窗,默认为最近的10秒。
2:请求总数阀值(requestVolumeThreshold):在快照时间窗内,必须满足请求总数阀值才有资格熔断。默认为20,意味着在10秒内,如果该hystrix命令的调用次数不足20次,即使所有的请求都超时或其他原因失败,断路器都不会打开。
3:错误百分比阀值(errorThresholdPercentage):当请求总数在快照时间窗内超过了阀值,比如发生了30次调用,如果在这30次调用中,有15次发生了超时异常,也就是超过50%的错误百分比,在默认设定50%阀值情况下,这时候就会将断路器打开。
// ================= 服务熔断 ==================
    @HystrixCommand(fallbackMethod = "paymentCircuitBreaker_fallback", commandProperties = {
            @HystrixProperty(name = "circuitBreaker.enabled", value = "true"), // 是否开启断路器
            @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "10"), // 请求次数
            @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "10000"), // 时间窗口期
            @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "60") // 失败率达到多少后跳闸
    })
     public String paymentCircuitBreaker(Integer id) {
        if (id < 0) {
            throw new RuntimeException("******** id 不能为负数 *********");
        }
        String simpleUUID = IdUtil.simpleUUID();
        return Thread.currentThread().getName() + "\t" + "调用成功, 流水号: " + simpleUUID;
    }
    public String paymentCircuitBreaker_fallback(Integer id) {
        return "******** id 不能为负数 请稍后再试 o(╥﹏╥)o *********";
    }

DeptController.java

@RestController
public class DeptController
{
	@Autowired
	private DeptService service;
	@Autowired
	private DiscoveryClient client;

	@RequestMapping(value = "/dept/get/{id}", method = RequestMethod.GET)
	//一旦调用服务方法失败并抛出了错误信息后,会自动调用@HystrixCommand标注好的fallbackMethod调用类中的指定方法
	@HystrixCommand(fallbackMethod = "processHystrix_Get")
	public Dept get(@PathVariable("id") Long id)
	{
		Dept dept = this.service.get(id);
		if (null == dept) {
			throw new RuntimeException("该ID:" + id + "没有没有对应的信息");
		}
		
		return dept;
	}

	public Dept processHystrix_Get(@PathVariable("id") Long id)
	{
		return new Dept().setDeptno(id).setDname("该ID:" + id + "没有没有对应的信息,null--@HystrixCommand")
				.setDb_source("no this database in MySQL");		
	}

当输入地址查询的时候,如果传进来的id,找不到,就会抛出异常,然后会自动调用@HystrixCommand标注好的fallbackMethod调用类中的指定方法,如下

在这里插入图片描述

3:服务降级

关于服务降级的理论知识
程序运行异常,超时,服务熔断触发服务降级,线程池打满都会导致服务降级
OrderHystrixController.java

全局服务降级

@RestController
@Slf4j
@DefaultProperties(defaultFallback = "paymentGlobalFallBack")
public class OrderHystrixController {
    @Resource
    private PaymentHystrixService paymentHystrixService;

    @GetMapping("/consumer/payment/hystrix/ok/{id}")
    public String ok(@PathVariable("id") Integer id) {
        return paymentHystrixService.paymentInfo_OK(id);
    }
@GetMapping("/consumer/payment/hystrix/timeout/{id}")
    @HystrixCommand
    public String timeout(@PathVariable("id") Integer id) {
        return paymentHystrixService.paymentInfo_TIMEOUT(id);
    }

    // 下面是全局fallback方法
    public String paymentGlobalFallBack() {
        return "全局异常信息处理,请稍后再试o(╥﹏╥)o";
    }
}

pom.xml

  
        <dependency>
            <groupId>org.springframework.cloudgroupId>
            <artifactId>spring-cloud-starter-netflix-hystrixartifactId>
        dependency>

通配服务降级
PaymentFallbackService .java

@Component
public class PaymentFallbackService implements PaymentHystrixService {
    @Override
    public String paymentInfo_OK(Integer id) {
        return "-------PaymentFallbackService fall back paymentInfo_OK, o(╥﹏╥)o";
    }

    @Override
    public String paymentInfo_TIMEOUT(Integer id) {
        return "-------PaymentFallbackService fall back paymentInfo_TIMEOUT, o(╥﹏╥)o";
    }
}

PaymentHystrixService .interface

@Component
@FeignClient(value = "CLOUD-PROVIDER-HYSTRIX-PAYMENT", fallback = PaymentFallbackService.class)
public interface PaymentHystrixService {
    @GetMapping("/payment/hystrix/ok/{id}")
    String paymentInfo_OK(@PathVariable("id") Integer id);

    @GetMapping("/payment/hystrix/timeout/{id}")
    String paymentInfo_TIMEOUT(@PathVariable("id") Integer id);

4:服务限流

  • 秒杀高并发等操作,严禁一窝蜂的过来拥挤,大家排队,一秒钟N个,有序进行

5:豪猪hystrixDashboard

  • 除了隔离依赖服务的调用以外,Hystrix还提供了准实时的调用监控(Hystrix Dashboard),Hystrix会持续地记录所有通过Hystrix发起的请求的执行信息,并以统计报表和图形的形式展示给用户,包括每秒执行多少请求多少成功,多少失败等。
  • Netflix通过hystrix-metrics-event-stream项目实现了对以上指标的监控。Spring Cloud也提供了Hystrix Dashboard的整合,对监控内容转化成可视化界面。

监控(Hystrix Dashboard)的创建步骤
1:创建如下工程
SpringClound——Hystrix断路器_第1张图片
2:pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0modelVersion>
  <parent>
    <groupId>com.atstudying.springcloundgroupId>
    <artifactId>microservicespringcloundartifactId>
    <version>0.0.1-SNAPSHOTversion>
  parent>
  <artifactId>microservicecloud-consumer-hystrix-dashboardartifactId>
  
  <dependencies>
		
		<dependency>
			<groupId>com.atstudying.springcloundgroupId>
			<artifactId>microserviceclound-apiartifactId>
			<version>${project.version}version>
		dependency>
		
		<dependency>
			<groupId>org.springframework.bootgroupId>
			<artifactId>spring-boot-starter-webartifactId>
		dependency>
		
		<dependency>
			<groupId>org.springframeworkgroupId>
			<artifactId>springloadedartifactId>
		dependency>
		<dependency>
			<groupId>org.springframework.bootgroupId>
			<artifactId>spring-boot-devtoolsartifactId>
		dependency>
		
		<dependency>
			<groupId>org.springframework.cloudgroupId>
			<artifactId>spring-cloud-starter-eurekaartifactId>
		dependency>
		<dependency>
			<groupId>org.springframework.cloudgroupId>
			<artifactId>spring-cloud-starter-ribbonartifactId>
		dependency>
		<dependency>
			<groupId>org.springframework.cloudgroupId>
			<artifactId>spring-cloud-starter-configartifactId>
		dependency>
		
		
		<dependency>
			<groupId>org.springframework.cloudgroupId>
			<artifactId>spring-cloud-starter-feignartifactId>
		dependency>
		
		
		<dependency>
			<groupId>org.springframework.cloudgroupId>
			<artifactId>spring-cloud-starter-hystrixartifactId>
		dependency>
		<dependency>
			<groupId>org.springframework.cloudgroupId>
			<artifactId>spring-cloud-starter-hystrix-dashboardartifactId>
		dependency>
		
		
	dependencies>
project>

3:application.yml

server:
  port: 9001

4:DeptConsumer_DashBoard_App.java

@SpringBootApplication
@EnableHystrixDashboard
public class DeptConsumer_DashBoard_App
{
	public static void main(String[] args)
	{
		SpringApplication.run(DeptConsumer_DashBoard_App.class, args);
	}
}

5:测试
SpringClound——Hystrix断路器_第2张图片
熔断监控面板(Hystrix Dashboard)
总结:七色,一圈,一线
SpringClound——Hystrix断路器_第3张图片
在这里插入图片描述
SpringClound——Hystrix断路器_第4张图片

6:Hystrix 工作流程

Hystrix 工作流程

你可能感兴趣的:(微服务)