前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Hystrix 服务降级-后备模式 实现思路

Hystrix 服务降级-后备模式 实现思路

作者头像
java404
发布2018-08-13 17:31:03
5780
发布2018-08-13 17:31:03
举报
文章被收录于专栏:java 成神之路java 成神之路

服务降级

Hystrix 提供了服务降级功能。 有些场景下当调用服务失败时,不应该产生一个Exception 异常给用户。而是采用执行备用策略。

比如:假如一个购物网站,它可以监控用户的行为,并尝试向用户推荐其它可以购买的商品。通常来说,可以调用微服务来对用户过去的行为进行分析,并返回针对特定用户的推荐列表。但是如果调用这个服务失败。则启动后备策略来检索一个更通用的偏好列表,该列表可以是热门商品的列表或基于全部用户购买记录分析的结果。

Hystrix 服务降级示例

代码语言:javascript
复制
package com.jijs.fallback.test;

import java.util.concurrent.TimeUnit;

import com.netflix.hystrix.HystrixCommand;
import com.netflix.hystrix.HystrixCommandGroupKey;
import com.netflix.hystrix.HystrixCommandProperties;

public class HystrixFallbackDemo extends HystrixCommand<String> {
    protected HystrixFallbackDemo() {
        super(Setter.withGroupKey(
                HystrixCommandGroupKey.Factory.asKey("HystrixFallback"))
                .andCommandPropertiesDefaults(
                        HystrixCommandProperties.Setter()
                        .withExecutionTimeoutInMilliseconds(1000)));
    }

    @Override
    protected String run() throws Exception {
        //执行超时
        TimeUnit.MILLISECONDS.sleep(2000);

        //执行异常
        //int i = 5 / 0;

        //主动抛出异常
        //throw new HystrixTimeoutException();
        
        return "ok";
    }

    @Override
    protected String getFallback() {
        return "fallback";
    }   

    public static void main(String[] args) {
        HystrixFallbackDemo t = new HystrixFallbackDemo();
        String result = t.execute();
        System.out.println(result);
    }
}

使用 Hystrix 实现一个后备策略,开发人员必须以下做几点。 1、继承 HystrixCommand 类。 2、在构造中定义 Hystrix 相关策略 3、重写 HystrixCommand 类的 run() 方法,写自己的核心业务。 4、重写 HystrixCommand 类的 getFallback() 方法,来实现后备策略。

使用 HystrixCommandProperties.Setter().withExecutionTimeoutInMilliseconds(1000) 设置调用执行 run() 方法的超时时间为1秒。

当执行 run() 方法时间超过1秒、执行run报错 或 抛出异常都会执行 getFallback () 方法。

自己动手实现 Hystrix 的后备策略

代码语言:javascript
复制
package com.jijs.fallback.test;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;

public class FallbackDemo {

    public static void main(String[] args) {
        ExecutorService executor = Executors.newSingleThreadExecutor();
        Task task = new Task();
        Future<String> f = executor.submit(task);

        String result;
        try {
            result = f.get(1000, TimeUnit.MILLISECONDS);    //执行超时时间1000
        } catch (Exception e) {
            //捕获所有的 Exception 异常,都执行 fallback方法。
            result = task.fallback();
        }
        System.out.println(result);

        executor.shutdown();
    }
}

class Task implements Callable<String> {

    public String call() throws Exception {
        //执行超时
        TimeUnit.MILLISECONDS.sleep(2000);

        //执行异常
        //int i = 5 / 0;

        //主动抛出异常
        //throw new HystrixTimeoutException();
        
        return "ok";
    }

    //后备方法
    public String fallback() {
        return "fallback";
    }
}

1、Hystrix 底层默认也是使用线程池来隔离不同的资源的。这里我们也模拟创建一个线程池。 2、然后将任务提交给线程池执行,因为任务实现了Callable 接口,所有我们可以使用 Future 来异步获取执行结果。 3、通过 Future.get(2000, TimeUnit.MILLISECONDS) 来指定 任务 执行的超时时间。 4、捕获异常,如果出现Exception的异常都执行 Task 的后备方法 fallback()。

从功能上来看,我们已经简单的实现了 Hystrix 的后备模式(超时、异常 等都可以执行后备方法)。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.07.29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 服务降级
  • Hystrix 服务降级示例
  • 自己动手实现 Hystrix 的后备策略
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档