微服务容错框架:Hystrix实现服务熔断、降级、限流

2020-07-02 00:00:00 线程 调用 服务 熔断 熔断器

业务背景


在微服务架构体系下,服务间不可避免地会发生依赖关系,一般来说会通过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;
    }
     
    @Override
    protected Integer run() {
        return userServiceProvider.queryByUserId();
    }
     
    @Override
    protected Integer getFallback() {
        return -1;
    }

}

相关文章