springcloud熔断机制
1、为什么要有熔断机制
由于网络原因或者自身服务的原因,导致服务可能会产生故障或者是不可用,如果此服务生产故障,就会导致请求此服务的线程阻塞,如果涉及大量的线程请求阻塞,就进一步导致容器产生瘫痪,也会导致其它服务不可用,就会产生“雪崩效应
”。因此需要一种机制处理,此机制就是“断路器”
2、什么雪崩效应
在微服务架构中,可能因为某一个基础服务故障,而导致多个服务之间的调用,出现阻塞,无法调用,一环扣一环,导致所有服务不可用,我们称这效应为雪崩效应。
3、什么是熔断
服务熔断就是对该服务的调用执行熔断,对应后续请求,不在继续调用该目标服务,而是直接返回,从而可以快速释放资源,或者服务出现故障,会把故障信息返回给客户端
4、触发熔断的条件
- 当请求服务失败的次数超过一定的比例(默认50%),熔断就会生效
- 熔断默认持续时间5秒,5秒之后它就会从(开路状态---》半开路状态)
- 处于半开路状态,判断下一次请求,是否成功,如果成功,则切回到闭路状态
5、降级服务
当熔断机制启动,此服务不可用,直接返回失败,它会有一个响应机制处理:调用降级服务的响应方法实现
6、熔断降级实现
熔断降级机制作用在客户端,在服务消费端实现
6.1、导入依赖
<!--支持hystrix组件-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
6.2、定义应急方法
业务层使用feign实现,不用写实现类,所以应急方法在控制器指定;如果使用RestTemplate实现,应急方法在业务层实现类指定
package com.yl.controller;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.strategy.concurrency.HystrixRequestContext;
import com.yl.bean.User;
import com.yl.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
@Autowired
private IUserService userService;
@RequestMapping("/testHyStrix01")
@HystrixCommand(fallbackMethod = "testHyStrix01FallBack")//指定应急方法
public String testHyStrix01(){
return userService.testHyStrix01();
}
String testHyStrix01FallBack(){
return "请求服务不可用了,不要再来了";
}
}
配置了熔断降级启动类上要添加@EnableHystrix注解