1.什么是hystrix?

hystrix是Netlifx开源的一款容错框架,防雪崩利器,具备服务降级服务熔断依赖隔离监控(Hystrix Dashboard)等功能.

2、hystrix能做什么?

        Hystrix 负责监控服务之间的调用情况,连续多次失败的情况进行熔断保护。保护的方法就是使用 Fallback,当调用的服务出现故障时,就可以使用 Fallback 方法的返回值;Hystrix 间隔时间会再次检查故障的服务,如果故障服务恢复,将继续使用服务。

通过hystrix可以解决雪崩效应问题,它提供了资源隔离、降级机制、熔断、缓存等功能。

资源隔离:包括线程池隔离和信号量隔离,限制调用分布式服务的资源使用,某一个调用的服务出现问题不会影响其他服务调用。

降级机制:超时降级、资源不足时(线程或信号量)降级,降级后可以配合降级接口返回托底数据。

熔断:当失败率达到阀值自动触发降级(如因网络故障/超时造成的失败率高),熔断器触发的快速失败会进行快速恢复。

缓存:返回结果缓存,后续请求可以直接走缓存。

请求合并:可以实现将一段时间内的请求(一般是对同一个接口的请求)合并,然后只对服务提供者发送一次请求。

3、功能点详解

3.1、服务降级

       服务降级的目的保证上游服务的稳定性,当整体资源快不够了,将某些服务先关掉,待渡过难关,再开启回来。

使用场景:
     比如双十一买东西,出现“哎哟喂,被挤爆了”。

     app秒杀某个商品提示 “网络开小差,请稍后再试”。

使用 Hystrix 服务降级:

设置自身调用超时时间的峰值,峰值内可以正常运行,超过了需要有兜底的方法处理,作服务降级fallback。

服务降级 fallback 既可以放在服务端,也可以放在客户端,但是我们一般放在客户端,这里两种都演示一下。

3.1.1、服务提供者服务降级

@RestController
public class ProductController {

    @RequestMapping("/getProduct")
    @HystrixCommand(fallbackMethod = "getProductFailed",
            commandProperties = {
                    //设置这个线程的超时时间是3s,3s内是正常的业务逻辑,超过3s调用fallbackMethod指定的方法进行处理
                    @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "3000")
            }
    )
    public Product getProduct() {

        int timeNumber = 5;
        //int age = 10/0;
        try {
            TimeUnit.SECONDS.sleep(timeNumber);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        Product product = new Product();
        return product;
    }

    /**
     * 该方法是对接口调用异常的处理方法
     */
    public Product getProductFailed() {
        Product product = new Product();
        product.setName("getProduct服务异常");

        return product;
    }

}
@SpringBootApplication
@EnableEurekaClient //开启Eureka客户端
@EnableHystrix // 启用hystrix ,@EnableHystrix继承了@EnableCircuitBreaker
public class SpringcloudStudyProductApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringcloudStudyProductApplication.class, args);
    }
}

启动测试,没有报错,而是执行了fallbackMethod指定的方法

{
    "name": "getProduct服务异常",
    "age": 12,
    "add": "北京市历史互通",
    "email": "6666.qq.com"
}

如果我们故意制造两个异常:

int age = 10/0; 运行时异常
我们能接受3秒钟,它运行5秒钟,超时异常。
当前服务不可用了,做服务降级,兜底的方案都是getProductFailed。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐