1.降级
降级是客户端也就是调用方判断,即调用的方法不可用或超时,调用预制好的降级方法(降级方法由服务端即被调用方提供)
调用方代码如下
@RestController
public class DemoController {
@Autowired
private RestTemplate restTemplate;
@RequestMapping("/hello")
@HystrixCommand(fallbackMethod = "fallback")
public String hello() {
String result = restTemplate.getForObject("http://demo-service/hello", String.class);
return result;
}
// 指定降级逻辑
public String fallback() {
return "Service Unavailable";
}
}
被调用方代码
@RestController
public class DemoController {
@RequestMapping("/hello")
public String hello() {
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "Hello World";
}
// 添加降级逻辑
@RequestMapping("/fallback")
public String fallback() {
return "Service Unavailable";
}
}
2.熔断
熔断是服务端判断的,个人认为难点在于判断熔断的指标配置,当达到熔断阈值,则会直接调用熔断方法
@RestController
public class DemoController {
@Autowired
private RestTemplate restTemplate;
@RequestMapping("/hello")
@HystrixCommand(fallbackMethod = "helloFallback")
public String hello() {
String result = restTemplate.getForObject("http://demo-service/hello", String.class);
return result;
}
public String helloFallback() {
return "Service Unavailable";
}
}
最后,我们还可以配置Hystrix的熔断器参数,比如熔断的阈值、窗口时间等等。在Spring Boot配置文件中添加下面的配置项即可。
yaml
hystrix.command.default.circuitBreaker.requestVolumeThreshold: 10
hystrix.command.default.circuitBreaker.sleepWindowInMilliseconds: 60000
上述代码表示当/hello接口收到连续10个请求,且其中50%以上失败时,Hystrix熔断器会启动,将所有请求转到fallbackHello方法。同时,Hystrix会在60秒后尝试关闭熔断器,重新恢复对/hello接口的代理。
通常情况下,我们会针对每个微服务方法独立地进行熔断限流降级的配置,以免某个服务出现问题时,影响到其他服务的正常使用。这样做的好处是,可以针对不同的业务场景,对不同的方法进行不同的熔断限流降级策略,也方便对不同的性能指标进行细粒度评估和监控。
但是,对于一些公共的方法,例如系统的登录、注册等方法,在进行熔断限流降级的时候,可以统一地对所有调用该方法的服务进行熔断限流降级配置,以保证系统的稳定性和可靠性。
总之,Hystrix 支持对单个方法或多个方法进行熔断限流降级的配置,具体的配置策略需要根据业务场景和要求进行权衡和选择。
3.限流
Hystrix提供了多种限流的策略,比如信号量隔离、线程池隔离以及动态配置等。下面以线程池隔离为例
@RestController
public class DemoController {
@RequestMapping("/hello")
@HystrixCommand(fallbackMethod = "fallback", threadPoolKey = "helloThreadPool")
public String hello() throws InterruptedException {
Thread.sleep(500);
return "Hello World!";
}
// 服务降级处理方法
public String fallback() {
return "Service Busy!";
}
}
配置线程池的相关参数。可以在application.properties文件中添加如下配置:
hystrix.threadpool.default.coreSize=2 # 线程池核心线程数
hystrix.threadpool.default.maxQueueSize=10 # 线程池等待队列大小
hystrix.threadpool.default.queueSizeRejectionThreshold=20 # 线程池拒绝任务的等待队列阈值。