Hystrix熔断器

简介:Hystix 是 Netflix 开源的一个延迟和容错库,用于隔离访问远程服务、第三方库,防止出现级联失败(雪崩)。

Hystix 主要功能

•隔离

     1、线程池隔离

      2、信号量隔离

•降级

•熔断

•限流

一、隔离

(1)线程池隔离

不进行隔离时,当服务请求A,线程池进行调用,调用完需要归还给线程池。假如C无响应,则线程池100个线程全给到C,则其他线程不够用。

而Hystrix自动进行线程池隔离,对请求会进行分配,一个服务失败,只会把分配给它的线程使用完,不会占用其他线程。

(2)信号量隔离

   如:限制对其中一个服务的访问次数,访问人数

二、熔断

假如某服务一直错,把所有服务全熔断。还有恢复机制,等服务恢复时,让整个服务恢复。

三、降级

Hystix 降级:当服务发生异常或调用超时,返回默认数据。

降级思路:

(1)Hystrix 降级 – 服务提供方

       1.在服务提供方,引入 hystrix 依赖

        2.定义降级方法

        3.使用 @HystrixCommand 注解配置降级方法

        4.在启动类上开启Hystrix功能:@EnableCircuitBreaker

(2)Hystrix 降级 – 服务消费方

        1.feign 组件已经集成了 hystrix 组件。

        2.定义feign 调用接口实现类,复写方法,即 降级方法

        3.在 @FeignClient 注解中使用 fallback 属性设置降级处理类。

        4.配置开启 feign.hystrix.enabled = true

代码举例:

 Goods Controller 服务提供方Hystrix降级:

@RestController

@RequestMapping("/goods")

public class GoodsController {

    @Autowired

    private GoodsService goodsService;

    @Value("${server.port}")

    private int port;

    /**

    * 降级:

    *  1. 出现异常

    *  2. 服务调用超时

    *      * 默认1s超时

    *

    *  @HystrixCommand(fallbackMethod = "findOne_fallback")

    *      fallbackMethod:指定降级后调用的方法名称

    */

    @GetMapping("/findOne/{id}")

    @HystrixCommand(fallbackMethod = "findOne_fallback",commandProperties = {

            //设置Hystrix的超时时间,默认1s

            @HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value = "3000")

    })

    public Goods findOne(@PathVariable("id") int id){

        //1.造个异常

        // int i = 3/0;

        try {

            //2. 休眠2秒

            Thread.sleep(2000);

        } catch (InterruptedException e) {

            e.printStackTrace();

        }

        Goods goods = goodsService.findOne(id);

        goods.setTitle(goods.getTitle() + ":" + port);//将端口号,设置到了 商品标题上

        return goods;

    }

    /**

    * 定义降级方法:

    *  1. 方法的返回值需要和原方法一样

    *  2. 方法的参数需要和原方法一样

    */

    public Goods findOne_fallback(int id){

        Goods goods = new Goods();

        goods.setTitle("降级了~~~");

        return goods;

    }

}

消费者端 调用服务的降级:

GoodsFeignClient.java:

@FeignClient(value = "HYSTRIX-PROVIDER",fallback = GoodsFeignClientFallback.class)

public interface GoodsFeignClient {

    @GetMapping("/goods/findOne/{id}")

    public Goods findGoodsById(@PathVariable("id") int id);

}

GoodsFeignClientFallback.java:

/**

* Feign 客户端的降级处理类

* 1. 定义类 实现 Feign 客户端接口

* 2. 使用@Component注解将该类的Bean加入SpringIOC容器

*/

@Component

public class GoodsFeignClientFallback implements GoodsFeignClient {

    @Override

    public Goods findGoodsById(int id) {

        Goods goods = new Goods();

        goods.setTitle("又被降级了~~~");

        return goods;

    }

}

四、熔断

可修改默认参数,修改熔断监控时间和次数:

@GetMapping("/findOne/{id}")

    @HystrixCommand(fallbackMethod = "findOne_fallback",commandProperties = {

            //设置Hystrix的超时时间,默认1s

            @HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds",value = "3000"),

            //监控时间 默认5000 毫秒

            @HystrixProperty(name="circuitBreaker.sleepWindowInMilliseconds",value = "5000"),

            //失败次数。默认20次

            @HystrixProperty(name="circuitBreaker.requestVolumeThreshold",value = "20"),

            //失败率 默认50%

            @HystrixProperty(name="circuitBreaker.errorThresholdPercentage",value = "50")

    })

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容