随笔 - 1357  文章 - 0  评论 - 1104  阅读 - 1941万

Hystrix参数配置

1、Hystrix参数配置文档 

2、Hystrix参数配置示例

复制代码
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

import com.mimaxueyuan.consumer.turbine.service.MyService;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
import com.netflix.hystrix.contrib.javanica.conf.HystrixPropertiesManager;

@RestController
public class HystrixController {

    @Autowired
    private MyService myService;

    /**
     * @HystrixCommand由名为“javanica”的Netflix contrib库提供 。 
     * Spring Cloud在连接到Hystrix断路器的代理中使用该注解自动包装Spring bean。
     *  断路器计算何时打开和关闭电路,以及在发生故障时应该做什么。
     *
     * @author Kevin
     * @Title: get
     * @param id
     * @return
     * @return: String
     */
    @GetMapping("/get1/{id}")
    @HystrixCommand(fallbackMethod = "getError")
    public String get1(@PathVariable String id) {
        try {
            System.out.println(Thread.currentThread().getName()+":get1 before sleep 5s....");
            Thread.sleep(1000 * 5);
            System.out.println(Thread.currentThread().getName()+":get1 after sleep 5s....");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "kevin.get1." + id;
    }
 
    /**
     * 配置Hystrix隔离策略,默认为THREAD,隔离策略分为THREAD、SEMAPHORE两种
     * 
     * execution.isolation.strategy 默认为THREAD
     * 
     * @param id
     * @return
     * @author lynch
     */
    @GetMapping("/get2/{id}")
    @HystrixCommand(fallbackMethod = "getError", commandProperties = {
            // @HystrixProperty(name=HystrixPropertiesManager.EXECUTION_ISOLATION_STRATEGY, value="THREAD")
            @HystrixProperty(name = HystrixPropertiesManager.EXECUTION_ISOLATION_STRATEGY, value = "SEMAPHORE") })
    public String get2(@PathVariable String id) {
        try {
            System.out.println(Thread.currentThread().getName()+":get2 before sleep 5s....");
            Thread.sleep(1000 * 5);
            System.out.println(Thread.currentThread().getName()+":get2 after sleep 5s....");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "kevin.get2." + id;
    }
    
    /**
     * 设置HystrixCommand的执行是否在超时发生时被中断。使用线程隔离时,是否对命令执行超时的线程调用中断(Thread.interrupt())操作
     * 
     * execution.isolation.thread.interruptOnTimeout 参数,默认为true
     * 
     * @param id
     * @return
     * @author lynch
     */
    @GetMapping("/get3/{id}")
    @HystrixCommand(fallbackMethod = "getError",commandProperties= {
            //设置超时的时候不中断线程,默认为true
            @HystrixProperty(name=HystrixPropertiesManager.EXECUTION_ISOLATION_THREAD_INTERRUPT_ON_TIMEOUT,value="false")
    })
    public String get3(@PathVariable String id) {
        try {
            System.out.println(Thread.currentThread().getName()+":get3 before sleep 5s....");
            Thread.sleep(1000 * 5);
            System.out.println(Thread.currentThread().getName()+":get3 after sleep 5s....");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "kevin.get3." + id;
    }
 
    /**
     * 设置调用线程产生的HystrixCommand.getFallback()方法的允许最大请求数目。 如果达到最大并发数目,后续请求将会被拒绝,如果没有实现回退,则抛出异常。
     * (这里需要注意一点,这个变量的命名不是很规范,它实际上对THREAD和SEMAPHORE两种隔离策略都生效)
     * 
     * fallback.isolation.semaphore.maxConcurrentRequests默认为10
     * 
     * @param id
     * @return
     * @author lynch
     */
    @GetMapping("/get4/{id}")
    @HystrixCommand(fallbackMethod = "getError",commandProperties= {
            @HystrixProperty(name = HystrixPropertiesManager.EXECUTION_ISOLATION_STRATEGY, value = "SEMAPHORE"),
            @HystrixProperty(name=HystrixPropertiesManager.EXECUTION_ISOLATION_SEMAPHORE_MAX_CONCURRENT_REQUESTS,value="1")
    })
    public String get4(@PathVariable String id) {
        try {
            System.out.println(Thread.currentThread().getName()+":get4 before sleep 5s....");
            Thread.sleep(1000 * 5);
            System.out.println(Thread.currentThread().getName()+":get4 after sleep 5s....");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "kevin.get4." + id;
    }
    
    
    /**
     * 设置HystrixCommand的执行是否有超时限制。
     * 
     * execution.timeout.enabled 默认为true, 是否超时
     *
     * @param id
     * @return
     */
    @GetMapping("/get5/{id}")
    @HystrixCommand(fallbackMethod = "getError",commandProperties= {
            @HystrixProperty(name=HystrixPropertiesManager.EXECUTION_TIMEOUT_ENABLED,value="false")
    })
    public String get5(@PathVariable String id) {
        try {
            System.out.println(Thread.currentThread().getName()+":get5 before sleep 5s....");
            Thread.sleep(1000 * 5);
            System.out.println(Thread.currentThread().getName()+":get5 after sleep 5s....");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "kevin.get5." + id;
    }

    /**
     * 设置调用者等待命令执行的超时限制,超过此时间,HystrixCommand被标记为TIMEOUT,并执行回退逻辑。
     * 注意:超时会作用在HystrixCommand.queue(),即使调用者没有调用get()去获得Future对象。
     * 
     * execution.isolation.thread.timeoutInMilliseconds 默认为1000
     * 
     * @param id
     * @return
     * @author lynch
     */
    @GetMapping("/get6/{id}")
    @HystrixCommand(fallbackMethod = "getError",commandProperties= {
            @HystrixProperty(name=HystrixPropertiesManager.EXECUTION_ISOLATION_THREAD_TIMEOUT_IN_MILLISECONDS,value="6000")
    })
    public String get6(@PathVariable String id) {
        try {
            System.out.println(Thread.currentThread().getName()+":get6 before sleep 5s....");
            Thread.sleep(1000 * 5);
            System.out.println(Thread.currentThread().getName()+":get6 after sleep 5s....");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "kevin.get6." + id;
    }
    
    public String getError(String id) {
        System.out.println(Thread.currentThread().getName()+":getError before ....");
        myService.execute();
        System.out.println(Thread.currentThread().getName()+":getError after ....");
        return "超时错误,使用断路器返回" + id;
    }
}
复制代码

 

posted on   Ruthless  阅读(2511)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
历史上的今天:
2016-12-28 MA均线组合
2011-12-28 四十七、实现调用Android手机的拍照功能
2011-12-28 四十六、android中的Bitmap
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示