Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

服务雪崩

现象:在某一时刻,微服务系统中所有微服务均不可用的这种现象,称为服务雪崩现象。

引发:在微服务之间进行服务调用是由于某一个服务故障,导致级联服务器故障的现象,称为雪崩效应。雪崩效应描述的是提供方不可用,导致消费方不可用并将不可用逐渐放大的过程。

如何解决微服务雪崩问题

服务熔断===》Hystrix

作用:就是用来在微服务中防止服务雪崩现象出现

熔断机制:所有微服务中必须引入Hystrix组件,一旦引入这个组件就具有服务熔断功能。

服务降级

服务压力剧增的时候根据当前业务情况及流量对一些服务和页面有策略的降级,以此缓解服务器的压力以保证核心任务的进行。同时保证部分甚至大部分客户得到正确的响应。

Hystrix简介

起源依旧是NetFlix,后被SpringCloud整合为springcloud-netflix-hystrix

作用:用来防止微服务系统中服务雪崩现象,实现服务熔断,熔断防止雪崩手段

Hystrix使用

老规矩,在父项目中先创建一个SpringBoot项目,然后先将对应的依赖导入

1
2
3
4
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

然后再启动类上开启Hystrix服务

1
2
3
4
5
6
7
8
9
10
11
12
/**
* @author bestrookie
* @date 2021/8/10 2:15 下午
*/
@EnableCircuitBreaker //开启Hystrix服务熔断
@SpringBootApplication
@EnableDiscoveryClient
public class HystrixApplication {
public static void main(String[] args) {
SpringApplication.run(HystrixApplication.class,args);
}
}

然后,我们需要给接口方法添加一个备选流处理(熔断之后的处理)。

image-20210811101607600

什么时候断路器打开

  • 当满足一定的阈值的时候(默认十秒超过20次请求次数失败)

  • 请求失败率达到一定的时候(默认十秒内超过50%的请求失败)

    注意:一旦断路开启之后所有到这个服务请求均不可用,只有在断路关闭之后才可用

Hystrix监控流程,触发熔断机制流程

image-20210811103358906

熔断备选流

在上面简单的demo中我们看到了一种备选流的机制,但是可以发现如果没有什么特殊的业务要求,单独的为每一个接口写一个备选流,就白白的增加的工作量了,其实还有一种全局的方式,就是默认的备选流。

image-20210811111514991

就像图片中所看到的,默认的备选流要求相对严格,返回值类型必须为String,参数为

OpenFeign调用服务过程集成hystrix实现备选流处理

具体应用场景

服务与服务之间的调用,被调用的服务宕掉之后,不能显示500的报错之类的错误信息,我们需要对这种情况进行备选流处理

1、首先导入依赖

导入OpenFeign的依赖

1
2
3
4
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

注意:openfeign组件底层已经制动依赖Hystrix依赖项目中不需要额外的引入

2、开启OpenFeign对Hystrix支持(记得在主启动类开启)

在配置文件中修改

1
2
3
feign:
hystrix:
enabled: true

3、开发Open服务调用失败默认处理的实现类

1
2
3
4
5
6
7
8
9
10
11
/**
* @author bestrookie
* @date 2021/8/11 3:40 下午
*/
@Component
public class HystrixClientFallBack implements HystrixClient {
@Override
public String demo(Integer id) {
return "当前服务不可用";
}
}

根据你创建的接口类来(下面是我的接口)

1
2
3
4
5
6
7
8
9
/**
* @author bestrookie
* @date 2021/8/11 3:07 下午
*/
@FeignClient(value = "HYSTRIX",fallback = HystrixClientFallBack.class)
public interface HystrixClient {
@GetMapping("/get")
String demo(@RequestParam Integer id);
}

4、在OpenFeign客户端接口中添加@FeignClient(value = "HYSTRIX",fallback = HystrixClientFallBack.class)

评论