Hystrix 熔断框架基础示例

1. 业务类,其在SpringBoot 场景下,将由IOC 生成对象实例:

//模拟实际业务类,其工作会有延迟
class MyService{
    public String work(){
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {

        }
        return "工作结果:"+Math.random()+":"+Thread.currentThread().getName();
    }
}

2. 自定义Command类,在SpringCloud场景下,由注解生成实例:

//自定义的Command
class MyCommand extends HystrixCommand<String> {
    private String result;
    private MyService service;
    public MyCommand(MyService service) {//业务对象传入到
        //设定线程池的名字
        super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("Default"))
                .andThreadPoolPropertiesDefaults(
                        HystrixThreadPoolProperties.Setter()//线程池属性设定器
                        .withCoreSize(5)// 设置线程池大小
                        .withMaxQueueSize(2))// 设置最大等待队列大小,最终会有七个请求执行
                .andCommandPropertiesDefaults(HystrixCommandProperties.Setter()//命令属性设定器

                        .withExecutionTimeoutInMilliseconds(3000)));// 设置timeout时长,默认1000,一个command运行超出这个时间,就被认为是timeout

       this.service=service;
    }
    @Override
    protected String run() throws Exception {
        //在线程池中的执行业务,如果超时,则进入降级
        result = service.work();
        return result;
    }
    @Override
    protected String getFallback() {
        return "降级处理后的结果";
    }
}

3. 启动测试类:

public class HyApp {
    public static void main(String[] args) {
        final MyService myService=new MyService();
        //打开10个线程(生产环境下,此线程由tomcat线程池分配)
        for (int i = 0; i < 10; i++) {
            new Thread(){
                @Override
                public void run() {
                    MyCommand reject=new MyCommand(myService);
                    String rs=reject.execute();
                    System.out.println(Thread.currentThread().getName()+":"+rs);
                }
            }.start();

        }

    }
}

4. 完整的代码实例及运行结果:

package cn.johnyu.hystrix;

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

public class HyApp {
    public static void main(String[] args) {
        final MyService myService=new MyService();
        //打开10个线程(生产环境下,此线程由tomcat线程池分配)
        for (int i = 0; i < 10; i++) {
            new Thread(){
                @Override
                public void run() {
                    MyCommand reject=new MyCommand(myService);
                    String rs=reject.execute();
                    System.out.println(Thread.currentThread().getName()+":"+rs);
                }
            }.start();

        }

    }
}
//模拟实际业务类,其工作会有延迟
class MyService{
    public String work(){
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {

        }
        return "工作结果:"+Math.random()+":"+Thread.currentThread().getName();
    }
}
//自定义的Command
class MyCommand extends HystrixCommand<String> {
    private String result;
    private MyService service;
    public MyCommand(MyService service) {//业务对象传入到
        //设定线程池的名字
        super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("Default"))
                .andThreadPoolPropertiesDefaults(
                        HystrixThreadPoolProperties.Setter()//线程池属性设定器
                        .withCoreSize(5)// 设置线程池大小
                        .withMaxQueueSize(2))// 设置最大等待队列大小,最终会有七个请求执行
                .andCommandPropertiesDefaults(HystrixCommandProperties.Setter()//命令属性设定器

                        .withExecutionTimeoutInMilliseconds(3000)));// 设置timeout时长,默认1000,一个command运行超出这个时间,就被认为是timeout

       this.service=service;
    }
    @Override
    protected String run() throws Exception {
        //在线程池中的执行业务,如果超时,则进入降级
        result = service.work();
        return result;
    }
    @Override
    protected String getFallback() {
        return "降级处理后的结果";
    }
}

运行结果:

Thread-8:降级处理后的结果
Thread-4:降级处理后的结果
Thread-7:降级处理后的结果
Thread-9:工作结果:0.2588853436469356:hystrix-Default-5
Thread-6:工作结果:0.8096057483901064:hystrix-Default-2
Thread-2:工作结果:0.9524698952843108:hystrix-Default-1
Thread-1:工作结果:0.12272654787062287:hystrix-Default-4
Thread-0:工作结果:0.4341197447966666:hystrix-Default-3
Thread-5:工作结果:0.11165337665390496:hystrix-Default-4
Thread-3:工作结果:0.11519664052115941:hystrix-Default-3

5. 使用信号量的情况:

package cn.johnyu.hystrix;

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

public class HyApp {
    public static void main(String[] args) {
        final MyService myService=new MyService();
        //打开10个线程(生产环境下,此线程由tomcat线程池分配)
        for (int i = 0; i < 10; i++) {
            new Thread(){
                @Override
                public void run() {
                    MyCommand reject=new MyCommand(myService);
                    String rs=reject.execute();
                    System.out.println(Thread.currentThread().getName()+":"+rs);
                }
            }.start();

        }

    }
}
//模拟实际业务类,其工作会有延迟
class MyService{
    public String work(){
        try {
            Thread.sleep(900);
        } catch (InterruptedException e) {

        }
        return "工作结果:"+Math.random()+":"+Thread.currentThread().getName();
    }
}
//自定义的Command
class MyCommand extends HystrixCommand<String> {
    private String result;
    private MyService service;
    public MyCommand(MyService service) {//业务对象传入到
        //设定线程池的名字
        super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("Default"))
                .andCommandPropertiesDefaults(HystrixCommandProperties.Setter()//命令属性设定器
                        .withExecutionIsolationStrategy(HystrixCommandProperties.ExecutionIsolationStrategy.SEMAPHORE)//信号量的情况
                        .withExecutionIsolationSemaphoreMaxConcurrentRequests(5)
                        .withExecutionTimeoutInMilliseconds(1000)));// 设置timeout时长,默认1000,一个command运行超出这个时间,就被认为是timeout

        this.service=service;
    }
    @Override
    protected String run() throws Exception {
        //在线程池中的执行业务,如果超时,则进入降级
        result = service.work();
        return result;
    }
    @Override
    protected String getFallback() {
        return "降级处理后的结果";
    }
}

运行结果:

Thread-2:降级处理后的结果
Thread-0:降级处理后的结果
Thread-6:降级处理后的结果
Thread-9:降级处理后的结果
Thread-4:降级处理后的结果
Thread-8:工作结果:0.5972827654107769:Thread-8
Thread-5:工作结果:0.8957667328176903:Thread-5
Thread-1:工作结果:0.34745913383072813:Thread-1
Thread-7:工作结果:0.31546350244527444:Thread-7
Thread-3:工作结果:0.3582107684563951:Thread-3
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 目录: 1.springmvc执行流程: 2.Spring简单介绍: 3.orm框架: 4.常用orm框架:hib...
    双鱼笔记阅读 322评论 0 3
  • 一、Spring 概述 1.1 简介 Spring:春天 --> 给软件行业带来了春天; 2002,首次推出了 ...
    yjtuuige阅读 516评论 0 3
  • 摘要 Spring框架概述 轻量级开源JavaEE框架,为了减少企业中项目复杂性,两个核心组成:IOC和AOP I...
    CJ21阅读 1,282评论 0 9
  • 小马最近在执行一个spring项目源码翻译为PHP的任务。所以复盘了下JAVA知识,做下笔记并分享。笔记目前还比较...
    小马过河R阅读 2,200评论 19 20
  • JDK下载 http://java.sun.com/products/archive/[http://java.s...
    DreamLee0201阅读 402评论 0 1