简介
Netflix的 Hystrix 是一个帮助解决分布式系统交互时超时处理和容错的类库, 它同样拥有保护系统的能力.
Hystrix的3个状态:
改造user-consumer
- 依赖配置
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
- UserApplication
在启动引导类上添加 @EnableCircuitBreaker 注解, 打开熔断器
@EnableCircuitBreaker
public class UserApplication {
....
}
- UserController
1, 添加 @DefaultProperties(defaultFallback = "defaultFallback") 失败回调方法
2, 在需要熔断的方法上添加**@HystrixCommand**注解
3, 添加测试异常代码
@RestController
@RequestMapping("/user")
@DefaultProperties(defaultFallback = "defaultFallback")
public class UserController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/{id}")
@HystrixCommand
public User queryById(@PathVariable Integer id){
if (id == 1) {
throw new RuntimeException("出现异常了");
}
User user = restTemplate.getForObject("http://user-service/user/" + id, User.class);
return user;
}
public User defaultFallback(){
return new User();
}
}
- 配置文件
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 2000
circuitBreaker:
errorThresholdPercentage: 50 # 触发熔断错误比例阈值,默认值50%
sleepWindowInMilliseconds: 10000 # 熔断后休眠时长,默认值5秒
requestVolumeThreshold: 10 # 熔断触发最小请求次数,默认值是20
启动
我们访问: http://127.0.0.1:8081/user/1 会报错, http://127.0.0.1:8081/user/2 访问正常, 但是我们多次访问user/1后, 会发现第二个调用也失败了。