首页 > 其他分享 >实现熔断,设置开启/关闭熔断器,设置半打开熔断器

实现熔断,设置开启/关闭熔断器,设置半打开熔断器

时间:2024-06-19 14:11:17浏览次数:10  
标签:降级 return String public 熔断 设置 熔断器 方法 id

1.熔断器的开启--常用的熔断器方法:defaultFallback 

 // 可以造成熔断的方法
    @GetMapping("/sleep5/{id}")
    @HystrixCommand(defaultFallback = "sleepBreaker", commandProperties = {
        @HystrixProperty(name = "circuitBreaker.enabled", value = "true"),  // 开启熔断器
        @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "10"),  // 当请求达到这个数量之后,才进行错误占比的计算。
        @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "10000"),  // 半打开休眠时间,熔断之后过了这段休眠时间,就会半打开,尝试接口是否恢复,如果恢复就完全打开熔断器。
        @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "60")  // 错误占比,当错误次数超过这个百分比,就会熔断。
    }) // commandProperties 的整个意思就是10秒中10次请求中有60%的请求出问题就熔断
    public String sleep5(@PathVariable("id") int id) throws Exception {
        if (id < 0) {
            throw new Exception("id 是负数,抛出异常!!");
        }
        return "访问正常 id:" + id + "  port:" + port;
    }
 
    // 熔断时调用的方法
    public String sleepBreaker() {
        return "接口有问题,目前被熔断了...";
    }

1)传参正常情况:

2)问题情况:(errorThresholdPercentage设置为60%)

 3)多次使用-1为参数访问,再用1做为参数再访问,也不会得到正常结果了,就是被熔断了:

是因为(sleepWindowInMilliseconds", value = "10000"), 半打开休眠时间10s,熔断之后过了这段休眠时间,就会半打开,尝试接口是否恢复,如果恢复就完全打开熔断器。

 

 2.另一种熔断器方法:fallbackMethod

注解@HystrixCommand除了defaultFallback这个参数可以调默认降级方法外,还有一个fallbackMethod可以调用一个与原方法对应的参数相同的方法,用于提供更明确的提示。
// 感觉这个说法还算靠谱点
    // fallbackMethod: 设置HystrixCommand服务降级所使用的方法名称,注意该方法需要与原方法定义在同一个类中,并且方法签名也要一致
    // defaultFallback: 设置HystrixCommand默认的服务降级处理方法,如果同时设定了fallbackMethod,会优先使用fallbackMethod所指定的方法,需要注意的是defaultFallback该属性所指定的方法没有参数,需要注意返回值与原方法返回值的兼容性
    @GetMapping("/sleep/{id}")
    @HystrixCommand(fallbackMethod = "sleepFallbackMethod", defaultFallback = "sleepFallback") // 使用指定的降级方法
    public String sleep(@PathVariable("id") int id) {
        int a = 10 / 0; // 触发抛出异常
        return productApi.sleep() + port + " id: " + id;
    }
    
    // 参数签名必须与原方法相同
    public String sleepFallbackMethod(int id) {
        return "sleep 方法被 控制器中指定的方法sleepFallbackMethod 降级,参数是:" + id;
    }
 
    // 无参数
    public String sleepFallback() {
        return "sleepFallback 控制器中方法降级..." + port;
    }

 

三. 给多个方法指定默认的降级方法

有可能多个方法降级的提示只需要返回相同的内容,这时可以给控制器类增加注解:@DefaultProperties(defaultFallback = "通用的降级方法名")

@DefaultProperties(defaultFallback = "sleepFallbackDefault")

控制器内添加4个方法:需要有降级的方法只需添加注解@HystrixCommand,不需要指定降级方法名,会使用类上指定的默认降级方法。不添加注解的不会做降级处理。

 @GetMapping("/sleep2")
    @HystrixCommand // 使用默认的降级方法
    public String sleep2() {
        return productApi.sleep() + port;
    }
 
    @GetMapping("/sleep3")
    @HystrixCommand // 使用默认的降级方法
    public String sleep3() {
        return productApi.sleep() + port;
    }
 
    // 不做降级处理,会出异常:java.net.SocketTimeoutException: Read timed out
    @GetMapping("/sleep4")
    public String sleep4() {
        return productApi.sleep() + port;
    }
    
    // 无参数
    public String sleepFallbackDefault() {
        return "sleepFallbackDefault 控制器中方法降级,默认的降级方法..." + port;
    }

 

 

 

 

可以看到sleep4方法没有指定注解,方法没有降级。为了防止出现这种情况出现,可以为Feign定义的接口(ProductApi)提供一个实现类,来定义接口中各方法的降级方法。

为Feign的接口实现一个类

步骤:

  1. 修改application.yml 启用 Feign 对 Hystrix的支持。
  2. 实现接口 ProductApi 的一个实现类。
  3. 为接口ProductApi的注解@FeignClient增加参数fallback

 

feign:
  hystrix:
      
    # 开启 Feign对Hystrix的支持
    enabled: true

添加 ProductApi 接口的实现类 ProductApiHystrix.java,并注入容器

 

package com.example.api.hystrix;
 
import com.example.api.ProductApi;
import org.springframework.stereotype.Component;
 
@Component // 注入容器
public class ProductApiHystrix implements ProductApi{
 
    @Override
    public String index() {
        return "ProductApiHystrix.index 降级方法...";
    }
 
    @Override
    public String sleep() {
        return "ProductApiHystrix.sleep 降级方法...";
    }
    
}
 

 为接口ProductApi的注解@FeignClient增加参数fallback

   
@FeignClient(value = "PRODUCT-SERVICE", fallback = ProductApiHystrix.class)

重启并访问,可以看到控制器的方法没有做改变的情况下,达到了降级的目的:

 

 

测试:

 

 到此,降级已经完成。

标签:降级,return,String,public,熔断,设置,熔断器,方法,id
From: https://www.cnblogs.com/pingguomang/p/18256123

相关文章

  • [转帖]深入理解JDBC的超时设置
     https://www.cnblogs.com/Chary/articles/14958848.html 这是最近读到的讲关于JDBC的超时问题最透彻的文章,原文是http://www.cubrid.org/blog/understanding-jdbc-internals-and-timeout-configuration ,网上现有的翻译感觉磕磕绊绊的,很多上下文信息丢失了,这里用我......
  • 技嘉BIOS超频设置操作路径
    关闭超线程频率电压控制>进阶处理器设置>Hyper_THreading关小核心频率电压控制>GIGABYTEPerfDrive>EcoreDisable防掉压等级频率电压控制>高级电压设定>处理器/VRM设置>CPUVcoreLoadline校正建议turbo温度墙频率电压控制>进阶处理器设置>......
  • [Soulmask] 教你使用灵魂面甲服务器设置管理员教程[Soulmask]
    使用莱卡云服务器先连接游戏连接游戏后按键盘左上角ESC下方的波浪键(~)使用控制台管理员密码在服务器启动项可自行修改(修改后需要重启服务器才可生效)输入gm+空格+key+空格+管理员密码示例:gmkey123456回车就会出现以下图中所示......
  • 如何删除 iPhone 上的所有内容和设置
    在出售或转让您的iPhone之前,彻底删除所有内容和设置是一项必要的步骤。这是因为iPhone上存储了大量个人数据,包括消息、视频、联系人、照片、登录信息等。本文将向您展示如何安全地删除iPhone上的所有数据,并确保这些数据不可恢复。 第1部分:如何删除iPhone上的所有......
  • 设置yum源
    在CentOS系统中,将阿里云设置为镜像源是一种常见的优化软件包管理的方式,特别是当你位于中国大陆或者需要更快的下载速度时。以下是将阿里云设置为CentOS的YUM软件源的步骤1011:备份原始的YUM源配置:打开终端,首先备份原始的YUM源配置文件,以防止配置错误时能够恢复:cd/etc/yum.rep......
  • bresenham_3d绘制3维直线,可设置直线粗细
    1importmatplotlib.pyplotasplt2frommpl_toolkits.mplot3dimportAxes3D3importnumpyasnp4importnibabelasnib56defbresenham_3d(p0,p1,thickness):7'''8Bresenham'sLineAlgorithmin3Dwithad......
  • RecyclerView设置默认焦点跟多页面焦点抢占
    场景:多个tab切换,显示不同的Fragment,其中一个Fragment布局是两个RecyclerView,分别位于左右两侧需求:首次从tabView切换到改tab页时,焦点从tabView首次往下移动时,需要落焦在右侧的第一个item上面如果按照系统原生逻辑,从tabView下移,可能默认位置不会在右侧,此时需要确保,每次往下移动,......
  • C# 通过Win32API设置客户端系统时间
    在日常工作中,有时可能会需要获取或修改客户端电脑的系统时间,比如软件设置了Licence有效期,预计2024-06-0100:00:00到期,如果客户手动修改了客户端电脑时间,往前调整了一年,则软件就可以继续使用一年,如此循环往复,则Licence将形同虚设。所以有时候需要校验客户端电脑时间和服务器端时间......
  • 【实际应用-第六篇 centos 安装nacos 并设置开机自启 】
    文章目录关联文章概要1、下载2、挪到服务器、解压3、启动、验证4、配置系统服务5、刷新服务、启动、查看状态、设置开机自启6、重启验证完结撒花......
  • PCIe BAR空间的值是谁设置的?谁分配的,什么时间分配的?
    Linux系统下PCIe总线、设备的枚举,资源的分配到底是哪里进行的?一直没搞太清楚,安装参考中的方法构建文件系统,编译内核,利用Qemu调试分析这个问题如下:内核代码是5.15.0-107-generic,工作环境是ubuntu22.04serverOS。Qemu虚拟机中的PCIe相关打印和对应函数如下[1.510805]P......