9.hystrix服务降级、熔断
1.简介
hystrix有三个主要功能:降级,熔断,限流
2.降级使用场景
一般在客户端使用
3.降级分为3类
a.单个方法降级
b.控制器中所有方法降级
c.所有控制器中方法降级
4.单个方法降级
以客户端为例,在控制器中
/**
* 测试单一服务降级方法
* @param id
* @return
*/
@HystrixCommand(fallbackMethod = "paymentErrorStandby",commandProperties = {
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "3000")
})
@GetMapping("/timeout/{id}")
public Object error(@PathVariable("id") Integer id){
try{
TimeUnit.SECONDS.sleep(5);
}catch (Exception e){
e.printStackTrace();
}
return paymentService.error(id);
// 程序异常
// return 10/0;
}
public String paymentErrorStandby(Integer id) {
return "8080端口返回:兜底方法";
}
5.单个控制器中方法降级
@RestController
@Slf4j
@RequestMapping("consumer")
//@DefaultProperties(defaultFallback = "globalFallbackMethod")
public class OrderController {
/**
* 测试(控制器中服务降级)默认全局统一降级服务处理方法
* @HystrixCommand 如果不指定备用方法,会调用默认备用方法globalFallbackMethod
* @return
*/
@GetMapping("/test")
@HystrixCommand
public Object test(){
return 10/0;
}
/**
* 全局统一降级服务处理方法
* @return
*/
public String globalFallbackMethod(){
return "兜底方法";
}
}
6.所有控制器中方法降级
此处使用的是feign
写一个全局降级方法实现该接口,在上图中加入fallback指定的这个实现类
7.yml
server:
port: 8080
spring:
application:
name: cloud-consumer-hystrix-order8080
eureka:
client:
register-with-eureka: true #表示向注册中心注册自己
fetch-registry: true # 获得注册表
service-url: # 请求注册服务的地址
defaultZone: http://eureka7001:7001/eureka/
feign:
hystrix:
enabled: true
8.启动类
@SpringBootApplication
@EnableFeignClients
// 感觉下面那个加不加都行
@EnableHystrix
public class OrderMain80 {
public static void main(String[] args) {
SpringApplication.run(OrderMain80.class, args);
}
}
9.pom
org.springframework.cloud spring-cloud-starter-netflix-hystrix
10.个人总结
c方法中:客户端请求服务端,才会服务降级,自己请求接口内部报错,降级是有问题的。
11.hytrix熔断
与降级一样的注解,只是注解内容有点区别,在controller层中
public String globalFallbackMethod(Integer id){ return "全局统一降级服务处理方法"; } /**
*
* 熔断流程 * 1.统计时间为10秒,10秒内请求次数达到请求次数阈值10次,开启断路器 * 2.10秒内假设请求10次,如果有6次及以上请求失败,断路器开始熔断;否则,达不到条件不会熔断 * 3.熔断初始期间,无论请求是否正确,都做降级处理;中期阶段,正确请求次数达到一定次数,则半开接口,否则继续熔断;熔断后期,正确请求次数达到一定次数,则完全恢复接口,否则继续熔断 * @param number * @return */ @GetMapping("test2/{number}") @HystrixCommand(fallbackMethod = "globalFallbackMethod",commandProperties = { @HystrixProperty(name = "circuitBreaker.enabled",value = "true"), // 开启断路器 @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold",value = "10"), // 请求次数阈值 @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value = "10000"),// 跳闸持续时间 @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value = "60")// 失败阈值占比 }) public String test2(@PathVariable("number") Integer number){ if (number < 0){ throw new RuntimeException("number小于0"); } return UUID.randomUUID().toString(); }