业务背景
在微服务架构体系下,服务间不可避免地会发生依赖关系,一般来说会通过REST Api来进行通信,这里先盗一个图来举例说明一个具体的业务场景(逃):
比如一个商城系统的微服务化结构,订单、商品、库存这三个服务是紧密依赖的,在理想情况下,什么问题都不发生当然是最好的。但服务运行期间难免会出现各种问题,如网络阻塞,延迟过高(比如因为内存泄露导致的Full GC次数飙高) ,甚至服务直接挂掉(比如流量激增把服务打挂了)等情况都是很有可能发生的。倘若库存服务挂掉了,那对于所有对库存服务有依赖关系的服务都会受到很大影响,最终甚至会扩散到整个微服务体系,这种就称之为雪崩效应。
因此,在某一个服务发生故障时,我们要及时对该服务的故障进行隔离,不能让其扩散到整个微服务体系中。因为,为了搭建一个稳定且可靠的微服务系统,我们就需要给系统加上自我保护,出现故障自动隔离的能力。而**Hystrix**就能做到这一点
什么是Hystrix
Hystrix是Netflix开源的一款分布式容错框架,Netflix旗下还有Eureka,Zuul等优秀的分布式开源项目,Spring Cloud也提供了对Netflix中部门项目的支持,成为了SpringCloud下的一些子项目 。
Hystrix的功能:
阻止故障的连锁反应,实现熔断
快速失败,实现优雅降级
提供实时的监控和告警
Hystrix简单实现
public class QueryUserIdCommand extends HystrixCommand<Integer> {private final static Logger logger = LoggerFactory.getLogger(QueryUserIdCommand.class);private UserServiceProvider userServiceProvider;public QueryUserAgeCommand(UserServiceProvider userServiceProvider) {super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("userService")).andCommandKey(HystrixCommandKey.Factory.asKey("queryByUserId")).andCommandPropertiesDefaults(HystrixCommandProperties.Setter().withCircuitBreakerRequestVolumeThreshold(10)//至少有10个请求,熔断器才会开始进行错误率计算.withCircuitBreakerSleepWindowInMilliseconds(5000)//熔断器中断请求,5秒后会进入一个半打开状态,放开部分请求去进行重试.withCircuitBreakerErrorThresholdPercentage(50)//错误率达到50%就开启熔断保护.withExecutionTimeoutEnabled(true)).andThreadPoolPropertiesDefaults(HystrixThreadPoolProperties.Setter().withCoreSize(10)));this.userServiceProvider = userServiceProvider;}@Overrideprotected Integer run() {return userServiceProvider.queryByUserId();}@Overrideprotected Integer getFallback() {return -1;}}