Spring Cloud 之前使用的断路器是 Netfilx 开源的 Hystrix 。被很多微服务开发者作为默认的断路器来使用。2018年11月,当 Netflix 宣布将这个项目置于维护模式时(不再开发新特性,只进行例行维护),Spring Cloud 官方也不得不跟进了 Netfix ,在 SpringOne 2019中,Spring 宣布将从 Spring Cloud 3.1 版本中删除 Hystrix 仪表板。要不了多长时间 Spring Cloud Netfix 将结束生命周期。
2. Spring Cloud Circuit Breaker为了填补 Spring Cloud Netfix 留下的空白, Spring Cloud Circuit Breaker 项目应运而生。这并不是一个实际的断路器,而是一个断路器的抽象层。它提供了一套规范API,开发人员可以根据实际选择符合需求的断路器实现。目前提供四种断路器实现:
Netfix HystrixResilience4JSentinelSpring RetryHystrix 已经快成为过去式了。 而 Spring Retry 我个人认为并不是为了微服务而生。推荐在新项目中使用 Resilience4J 或者 Sentinel。
2.1 Resilience4JResilience4j 是受 Hystrix 启发的轻量级容错库,专为 Java 8 和函数式编程而设计。而且该库仅仅依赖一个 Java 函数式编程增强库 Vavr 而没有其它依赖。它提供了高阶函数,断路器,速率限制器,重试或舱壁隔离功能来对功能接口进行增强,另外还有度量标准模块对运行指标进行跟踪。
优点:功能比较全,相比 Hystrix 支持流量控制,轻量级,而且都是模块化的,支持函数式编程。缺点:监控目前只提供度量API,需要自己整合,但是我觉得这个不是问题,毕竟 micrometer 也非常简单。2.2 Sentinel阿里巴巴中间件团队出品,现在是 Spring Cloud Alibaba 生态的一部分。功能和 Resilience4J 类似,亮点在于有流量塑形功能,对随机不规则、不受控的流量进行规则化处理;另外一个亮点在于有监控的 dashboard ,不像 Resilience4j 需要自己开发。而且 也是 Spring Cloud Alibaba 体系的一部分。
3. 总结其实经过 Spring Cloud Circuit Breaker 的整合后使用都不会特别的困难,难点在于自定义,功能上 Sentinel 更加全面一些,但是有时候业务并不是需要什么都有。 Resilience4j 大部分场景都能够满足,函数编程也更加优雅。这两个选择没有太多的高下之分。多说一句 Vavr 函数库非常不错,有兴趣可以去体验一下。只是 Hystrix 新项目还是不要再用了,虽然是一个非常好的断路器组件,但是它的历史使命差不多已经完成了。