首先我们了解到,当服务的并发量过大的时候,接口处理的事件会被延长,因此我们消费端调用这样的接口的时候,难免会超时等,为了不返回500这样的错误,我们需要引入hystrix来避免这种级联故障
hystrix实现三种功能
- 服务降级
- 服务熔断
- 服务限流
- 降级配置
服务端 降级
引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
启动类 @EnableCircuitBreaker //开启熔断器
service 逻辑层
@Service("paymentService")
public class PaymentServiceImpl implements PaymentService {
public String paymentInfo_ok() {
return "线程池: " + Thread.currentThread().getName() + " paymentInfo_ok";
}
//处理报错 或者 超时 则走fallbackMethod 方法
@HystrixCommand(fallbackMethod = "paymentInfo_TimeoutHandler", commandProperties = {
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "3000")
})
public String paymentInfo_Timeout() {
try {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "线程池: " + Thread.currentThread().getName() + " paymentInfo_Timeout";
}
public String paymentInfo_TimeoutHandler() {
return "线程池: " + Thread.currentThread().getName() + " paymentInfo_TimeoutHandler " + "请求超时o(╥﹏╥)o";
}
}
@HystrixProperty 的name 可以去HystrixCommandProperties 类中找
- 消费端服务降级
启动类 加@EnableHystrix (暂时不清楚两个注解有什么区别)
controller 层中进行服务降级
@RestController
@RequestMapping("/consumer")
@Slf4j
@DefaultProperties(defaultFallback = "paymentInfo_default_TimeoutHandler") //全局 的服务降级
public class OrderController {
@Autowired
PaymentService paymentService;
@GetMapping("/ok")
public String info_ok(){
return paymentService.info_ok();
}
@GetMapping("/timeout")
@HystrixCommand(fallbackMethod = "paymentInfo_TimeoutHandler", commandProperties = {
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "1500")
}) //特殊方法指定 服务降级
public String info_timeout(){
return paymentService.info_timeout();
}
@GetMapping("/global")
@HystrixCommand //允许方法 进行服务降级
public String global(){
int i = 10 / 0;
return "global";
}
public String paymentInfo_TimeoutHandler() {
return "wo是消费端 线程池: " + Thread.currentThread().getName() + " paymentInfo_TimeoutHandler " + "请求超时o(╥﹏╥)o";
}
public String paymentInfo_default_TimeoutHandler() {
return "全局的 服务降级";
}
}