目录
hystrix:处理分布式系统的延迟和容错的开源库
服务降级:(fallback)
服务发生故障,需要向客户端立刻返回一个友好的提示
导致服务降级:程序异常、超时、服务熔断、线程池/信号量打满
使用JMeter测试高并发会发现两个测试都会转圈圈
针对服务提供者
1、pom引入
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
2、主启动类上激活
@EnableCircuitBreaker//激活
3、添加注解,写兜底方法
//服务降级
@HystrixCommand(fallbackMethod = "payment_timeout_fallback",commandProperties = {
@HystrixProperty(
name = "execution.isolation.thread.timeoutInMilliseconds",value = "2000"//超时时长
)
})
public String payment_timeout(){
//超时异常
long timeNum=5;
// Thread.sleep(timeNum);
try {
TimeUnit.SECONDS.sleep(timeNum);
} catch (InterruptedException e) {
e.printStackTrace();
}
return Thread.currentThread().getName()+"睡眠时长:"+timeNum;
//运行异常
// int i=10/0;
// return String.valueOf(i);
}
//兜底方法
public String payment_timeout_fallback(){
return Thread.currentThread().getName()+"服务器响应超时或发生错误,请稍后再试!!!";
}
针对消费者
1、pom引入
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
2、修改yml
#开启 feign: hystrix: enabled: true
3、主启动
@EnableHystrix
4、添加注解,写兜底方法
@GetMapping("/consumer/payment/hystrix/timeout")
@HystrixCommand(fallbackMethod = "payment_timeout_fallback",commandProperties = {
@HystrixProperty(
name = "execution.isolation.thread.timeoutInMilliseconds",value = "1000"//超时时长
)
})
public String payment_err(){
return paymentHystrixService.payment_err();
}
//兜底方法
public String payment_timeout_fallback(){
return "对方支付系统繁忙,请稍后再试!!!";
}
存在问题
上述方法存在问题,代码膨胀,耦合度高,业务逻辑混乱
解决问题
使用注解@DefaultProperties+@HystrixCommand解决代码膨胀问题
@RestController
@Slf4j
@DefaultProperties(defaultFallback = "payment_global_fallback")
public class OrderHystrixController {
@Resource
private PaymentHystrixService paymentHystrixService;
@GetMapping("/consumer/payment/hystrix/ok/{id}")
@HystrixCommand
public String payment_ok(@PathVariable("id") Integer id){
int i=10/0;
return paymentHystrixService.payment_ok(id);
}
@GetMapping("/consumer/payment/hystrix/timeout")
@HystrixCommand(fallbackMethod = "payment_timeout_fallback",commandProperties = {
@HystrixProperty(
name = "execution.isolation.thread.timeoutInMilliseconds",value = "1000"//超时时长
)
})
public String payment_err(){
return paymentHystrixService.payment_err();
}
//兜底方法
public String payment_timeout_fallback(){
return "对方支付系统繁忙,请稍后再试!!!";
}
public String payment_global_fallback(){
return "这是全局处理";
}
实现接口+fallback解耦
@Component
public class PaymentHystrixFallbackService implements PaymentHystrixService{
@Override
public String payment_ok(Integer id) {
return "this is PaymentHystrixFallbackService=====》payment_ok";
}
@Override
public String payment_err() {
return "this is PaymentHystrixFallbackService=====》payment_err";
}
}
@Component
@FeignClient(value = "CLOUD-PROVIDER-HSYTRIX-PAYMENT8001",fallback = PaymentHystrixFallbackService.class)
public interface PaymentHystrixService {
@GetMapping("/payment/hystrix/ok/{id}")
public String payment_ok(@PathVariable("id") Integer id);
@GetMapping("/payment/hystrix/timeout")
public String payment_err();
}