hystrix 熔断限流降级示例区别

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 # 线程池拒绝任务的等待队列阈值。

你可能感兴趣的:(hystrix,java,微服务)