1.作用:当服务繁忙时,如果服务出现异常,不是粗暴的直接报错,而是返回一个友好的提示,虽然拒绝了用户的访问,但是会返回一个结果。
熔断器的三种状态:
Closed:关闭状态(断路器关闭),所有请求都正常访问。
Open:打开状态(断路器打开),所有请求都会被隆级。Hystⅸx会对请求情况计数。当一定时间内失败请求百分比达到园值,则触发熔断,断路会完全关闭。默认失败比例的园值是50%,请求次数最少不低于20次
Half Open:半开状态, Closed状态不是永久的,关闭后会进入休眠时间(默认是5s)随后断路会自动进入半开状态。此时会释放部分请求通过,若这些请求都是健康的,则会完全打开断路器,否则继续保持关闭,再次进行休睨计时
2.实现熔断器
1>引入起步坐标
首先在user-consumer中引入Hystix依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
2>用注解的放肆配置:
//配置多多少个链接进行统计 默认20个
@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "10"),
//当多次访问失败就会进入半开状态 此时在配置时间内所有的请求都会被降级 直接返回错误的提示页面
@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "10000"),
//当一定时间内失败请求百分比达到园值,则触发熔断,断路会完全打开。默认失败比例的园值是50%
@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "60")
@RestController
@RequestMapping("User")
@DefaultProperties(defaultFallback = "queryUserByIdFallback")
public class UserController {
@Autowired
private UserFeign userFeign;
@Autowired
private RestTemplate restTemplate;
@RequestMapping("{id}")
@HystrixCommand(
commandProperties = {
//没过多少次进行统计
@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "10"),
@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "10000"),
@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "60")
})
public String selectById(@PathVariable(name = "id") Integer id) {
if (id % 2 == 0) {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
String url = "http://user-service/User/" + id;
String user = restTemplate.getForObject(url, String.class);
return user;
}
public String queryUserByIdFallback() {
return "系统繁忙。。。";
}