8001先从自身找问题
设置自身调用超时时间的峰值, 峰值内可以正常运行, 超过了需要有兜底的方法处理, 做服务降级fallback
8001fallback
业务类启动注解
一旦调用服务方法失败并抛出了错误信息后,会自动调用@HystrixCommand标注好的fallbckMethod调用类中的指定方法
// 正常访问
public String paymentInfo_OK(Integer id) {
return "线程池:" + Thread.currentThread().getName() + " paymentInfo_OK(),id:" + id;
}
// 超时访问
// 3秒以内走正常逻辑代码 超过走错误逻辑代码
@HystrixCommand(fallbackMethod = "paymentInfo_TimeOutHandler", commandProperties = {
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "3000")
})
public String paymentInfo_TimeOut(Integer id) {
int timeNumber = 5;
try { TimeUnit.SECONDS.sleep(timeNumber); } catch (InterruptedException e) { e.printStackTrace(); }
return "线程池:" + Thread.currentThread().getName() + " paymentInfo_TimeOut(),id:" + id + " 耗时(秒)" + timeNumber;
}
public String paymentInfo_TimeOutHandler(Integer id) {
return "线程池:" + Thread.currentThread().getName() + " 8001系统繁忙,请稍后再试,id:" + id + " o(╥﹏╥)o";
}
开启断路器注解
@SpringBootApplication
@EnableEurekaClient
@EnableCircuitBreaker // 启动断路器
public class PaymentHystrixMain8001 {
public static void main(String[] args) {
SpringApplication.run(PaymentHystrixMain8001.class, args);
}
}
80fallback
pom
<!--hystrix-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
YML
server:
port: 80
eureka:
client:
register-with-eureka: false
fetch-registry: true
service-url:
defaultZone: http://eureka7001.com:7001/eureka
# defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
# 开启断路器
feign:
hystrix:
enabled: true
启动类
@EnableHystrix
controller
// 超时访问
@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) {
// 80自己要求1.5秒内 而8001需要3秒处理逻辑 则超时,80自己降级
// 80出异常,也自己降级
// int age = 10/0;
String result = paymentHystrixService.paymentInfo_TimeOut(id);
return result;
}
public String paymentTimeOutFallbackMethod(@PathVariable("id") Integer id) {
return "我是消费者80,对方支付系统繁忙请10秒种后再试或者自己运行出错请检查自己,o(╥﹏╥)o";
}
降级存在问题
每个业务方法对应一个兜底的方法,代码膨胀
应该统一和自定义的分开
解决存在问题
每个方法配置一个fallback,导致膨胀
全局降级
@DefaultProperties(defaultFallback="")
使用@DefaultProperties 并在方法上加@HystrixCommand 就会走全局异常降级处理
@DefaultProperties(defaultFallback = "payment_Global_FallbackMethod")
public class OrderHyrixController {
@HystrixCommand
public String paymentInfo_TimeOut(@PathVariable("id") Integer id) {
String result = paymentHystrixService.paymentInfo_TimeOut(id);
return result;
}
// 全局fallback方法
public String payment_Global_FallbackMethod(){
return "全局异常处理信息,请稍后再试";
}
}
和业务逻辑混在一起,有点混乱。
用通配服务降级
PaymentFallbackService类实现PaymentFeginService接口
@Component
public class PaymentFallbackService implements PaymentHystrixService {
@Override
public String paymentInfo_OK(Integer id) {
return "-------PaymentFailbackService.paymentInfo_OK() fallback";
}
@Override
public String paymentInfo_TimeOut(Integer id) {
return "-------PaymentFailbackService.paymentInfo_TimeOut() fallback";
}
}
yml
# 用于服务降级 在注解@FeignClient中添加fallbackFactory属性值
feign:
hystrix:
enabled: true
PaymentFeignClientService接口
标注@FeignClient的fallback需要制定的降级实现类
@Component
@FeignClient(value = "CLOUD-PROVIDER-HYSTRIX-PAYMENT",fallback = PaymentFallbackService.class)
public interface PaymentHystrixService {
// 正常访问
@GetMapping("/payment/hystrix/ok/{id}")
String paymentInfo_OK(@PathVariable("id") Integer id);
// 超时访问
@GetMapping("/payment/hystrix/timeout/{id}")
String paymentInfo_TimeOut(@PathVariable("id") Integer id);
}
测试
先启动eureka7001
PaymentHystrixMain8001启动
正常访问测试:http://localhost/consumer/payment/hystrix/ok/32
故意关闭微服务8001
客户端自己调用降级提示
此时服务端provider已经down了 ,但是我们做了服务降级处理,让客户端在服务端不可用时也会获得提示信息而不会挂起耗死服务器