1.降级
降级是客户端也就是调用方判断,即调用的方法不可用或超时,调用预制好的降级方法(降级方法由服务端即被调用方提供)
调用方代码如下
@RestController
public class DemoController {@Autowiredprivate 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 {@Autowiredprivate 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 # 线程池拒绝任务的等待队列阈值。