Hystrix重要概念
服务降级: 服务器忙请稍后再试,不让客户端等待并立即返回一个友好提示 fallback
导致服务降级的原因:程序运行异常、超时、服务熔断触发降级 线程池信号打满也会导致信号降级
服务熔断: 当达到最大服务访问后,直接拒绝访问,拉闸限电,然后调用降级方法返回提示有序进行。break
服务限流: 秒杀高并发等操作,严禁一窝蜂来拥挤,要排队 flow limit
服务降级方案:
一、payment降级方案
1.建module加入pom依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
2.yml原班人马
server:
port: 8001
spring:
application:
name: cloud-provider-hystrix-payment #服务名
eureka:
client:
#表示是否将自己注册进EurekaServer默认设为true
register-with-eureka: true
#是否从EurekaServer抓取已有的注册信息,默认为true。单节点无所谓,集群必须设为true才能配合ribbon使用负载均衡
fetchRegistry: true
service-url:
#defaultZone: http://localhost:7001/eureka #单机版
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka #集群版
3.主启动
要在SpringCloud中使用断路器,需要加上@EnableCircuitBreaker注解:
@SpringBootApplication
@EnableEurekaClient
@EnableCircuitBreaker
public class PaymentHystrixMain8001 {
public static void main(String[] args) {
SpringApplication.run(PaymentHystrixMain8001.class,args);
}
}
4.service加入@HystrixCommand注解 fallbackMethod 为程序出错后调用的方法 HystrixProperty为允许当前线程时间(此次为5000毫秒) value为时间单位
表示如果在规定时间5秒内没有执行完毕将调用fallbackMethod中的paymentInfo_TimeOutHandler异常处理方法进行异常处理
@Service
public class PaymentService {
public String paymentInfo_OK(Integer id){
return "线程池: "+Thread.currentThread().getName()+" paymentInfo_OK,id: "+id+"\t"+"O(∩_∩)O哈哈";
}
@HystrixCommand(fallbackMethod = "paymentInfo_TimeOutHandler",commandProperties = {
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "5000")
})
public String paymentInfo_TimeOut(Integer id){
int timenumbe=3000;
// int age=10/0;
try {
TimeUnit.MILLISECONDS.sleep(timenumbe);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "线程池: "+Thread.currentThread().getName()+" paymentInfo_TimeOut,id: "+id+"\t"+"O(∩_∩)O哈哈"+"耗时(毫秒 ): "+timenumbe;
}
public String paymentInfo_TimeOutHandler(Integer id){
return "线程池: "+Thread.currentThread().getName()+" 8001系统忙,请稍后再试,id: "+id+"\t"+"┭┮﹏┭┮";
}
}
以上为hystrix在payment的应用 ,hystrix在payment和consumers都可以配置 一般用在consumers
以下为hystrix在consumers中的配置方法
1.建module 添加hystrix的pom依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
2.改yml增加feign对hystrix的支持
3.主启动添加@EnableHystrix注解表示支持Hystrix断路器
@SpringBootApplication
@EnableFeignClients
@EnableHystrix
public class OrderHystrixMain80 {
public static void main(String[] args) {
SpringApplication.run(OrderHystrixMain80.class,args);
}
}
4、service
@Component
@FeignClient(value = "CLOUD-PROVIDER-HYSTRIX-PAYMENT")
public interface PaymentHystrixService {
@GetMapping("/payment/hystrix/ok/{id}")
public String paymentInfo_OK(@PathVariable("id") Integer id);
@GetMapping("/payment/hystrix/timeout/{id}")
public String paymentInfo_timeOut(@PathVariable("id") Integer id);
}
controller
@RestController
@Slf4j
public class OrderHystirxController {
@Resource
private PaymentHystrixService paymentHystrixService;
@GetMapping("/consumer/payment/hystrix/ok/{id}")
public String paymentInfo_OK(@PathVariable("id") Integer id){
String result=paymentHystrixService.paymentInfo_OK(id);
return result;
}
@GetMapping("/consumer/payment/hystrix/timeout/{id}")
@HystrixCommand(fallbackMethod = "paymentTimeOutFallbackMethod",commandProperties = {
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "1500")
})
public String paymentInfo_timeOut(@PathVariable("id") Integer id){
String result=paymentHystrixService.paymentInfo_timeOut(id);
return result;
}
public String paymentTimeOutFallbackMethod(@PathVariable("id")Integer id){
return "我是消费者80,对方支付系统繁忙请10秒钟后重试或者自己运行出错请检查自己,┭┮﹏┭┮";
}
}
如果paymentInfo_timeOut在1500毫秒没有得到返回结果调用服务降级方法paymentTimeOutFallbackMethod
三、通用的异常处理方法
如果在开发中一个方法写一个服务降级方法无疑代码将非常膨胀所以我们再此进行全局的服务降级配置方法,如果某个方法配置了单独的服务降级方法将执行单独的服务降级方法,如果没有将执行全局的服务降级配置方法。
加入@DefaultProperties注解如果方法异常将执行defaultFallback中的payment_Global_FallbackMethod方法做服务降级处理
@RestController
@Slf4j
@DefaultProperties(defaultFallback = "payment_Global_FallbackMethod") //通用的异常处理方法
public class OrderHystirxController {
@Resource
private PaymentHystrixService paymentHystrixService;
@GetMapping("/consumer/payment/hystrix/ok/{id}")
public String paymentInfo_OK(@PathVariable("id") Integer id){
String result=paymentHystrixService.paymentInfo_OK(id);
return result;
}
@GetMapping("/consumer/payment/hystrix/timeout/{id}")
// @HystrixCommand(fallbackMethod = "paymentTimeOutFallbackMethod",commandProperties = {
// @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "1500")
// })
@HystrixCommand
public String paymentInfo_timeOut(@PathVariable("id") Integer id){
String result=paymentHystrixService.paymentInfo_timeOut(id);
return result;
}
public String paymentTimeOutFallbackMethod(@PathVariable("id")Integer id){
return "我是消费者80,对方支付系统繁忙请10秒钟后重试或者自己运行出错请检查自己,┭┮﹏┭┮";
}
//下面是全局fallback方法
public String payment_Global_FallbackMethod(){
return "Global异常处理信息,请稍后重试,┭┮﹏┭┮";
}
}
四、服务降级的异常处理方法和业务代码混合 解决
1、建PaymentFallbackService类继承于PaymentHystrixService方法重写PaymentHystrixService中的方法
@Component
public class PaymentFallbackService implements PaymentHystrixService{
@Override
public String paymentInfo_OK(Integer id) {
return "--------PaymentHystrixService fall back-paymentInfo_ok,┭┮﹏┭┮";
}
@Override
public String paymentInfo_timeOut(Integer id) {
return "--------PaymentHystrixService fall back-paymentInfo_TimeOut,┭┮﹏┭┮";
}
}
2、给PaymentHystrixService中的@FeignClient加入指定的异常处理类
@FeignClient(value = “CLOUD-PROVIDER-HYSTRIX-PAYMENT”,fallback = PaymentFallbackService.class)
@Component
@FeignClient(value = "CLOUD-PROVIDER-HYSTRIX-PAYMENT",fallback = PaymentFallbackService.class)
public interface PaymentHystrixService {
@GetMapping("/payment/hystrix/ok/{id}")
public String paymentInfo_OK(@PathVariable("id") Integer id);
@GetMapping("/payment/hystrix/timeout/{id}")
public String paymentInfo_timeOut(@PathVariable("id") Integer id);
}