[Spring Cloud] Hystrix通过配置文件统一设置参数/与OpenFeign结合使用

news2024/11/26 16:47:05

✨✨个人主页:沫洺的主页

📚📚系列专栏: 📖 JavaWeb专栏📖 JavaSE专栏 📖 Java基础专栏📖vue3专栏 

                           📖MyBatis专栏📖Spring专栏📖SpringMVC专栏📖SpringBoot专栏

                           📖Docker专栏📖Reids专栏📖MQ专栏📖SpringCloud专栏     

💖💖如果文章对你有所帮助请留下三连✨✨

衔接上篇: [Spring Cloud] Hystrix三大特性--降级,熔断,隔离_沫洺的博客-CSDN博客 

🍁配置文件统一设置参数

🌿全局默认配置

#统计的时间窗口,默认为10s,一般不需要更改
hystrix.command.default.metrics.rollingStats.timeInMilliseconds=3000
#是否开启降级
hystrix.command.default.fallback.enabled=true
#是否开启断路器
hystrix.command.default.circuitBreaker.enabled=true
#失败率达到多少后跳闸,在统计窗口期中,请求数大于阈值并且失败率达到60,则触发断路,断路器开启,链路中断
hystrix.command.default.circuitBreaker.errorThresholdPercentage=60
#请求最小触发次数
hystrix.command.default.circuitBreaker.requestVolumeThreshold=3
#断路后休眠状态的时长,默认为5s,断路8s后断路器进入半开状态
hystrix.command.default.circuitBreaker.sleepWindowInMilliseconds=10000
#开启超时机制
hystrix.command.default.execution.timeout.enabled=true
#取消是否中断
hystrix.command.default.execution.isolation.thread.interruptOnFutureCancel=true
#超时是否中断
hystrix.command.default.execution.isolation.thread.interruptOnTimeout=true
#超时阈值,单位是毫秒
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=3000

通过配置文件设置参加,就不需要在@HystrixCommand注解中配置参数commandProperties

🌾私有配置

 要想针对某个方法进行配置

hystrix.command.commandKey.metrics.rollingStats.timeInMilliseconds=30000
hystrix.command.commandKey.fallback.enabled=true
hystrix.command.commandKey.circuitBreaker.enabled=true
hystrix.command.commandKey.circuitBreaker.errorThresholdPercentage=50
hystrix.command.commandKey.circuitBreaker.requestVolumeThreshold=3
hystrix.command.commandKey.circuitBreaker.sleepWindowInMilliseconds=80000
hystrix.command.commandKey.execution.isolation.thread.interruptOnFutureCancel=true
hystrix.command.commandKey.execution.isolation.thread.interruptOnTimeout=true
hystrix.command.commandKey.execution.isolation.thread.timeoutInMilliseconds=3000
hystrix.command.commandKey.execution.timeout.enabled=true

定义test2方法,指定commandKey="hello2"

@RestController
public class Test {
    @GetMapping("/test")
    //@HystrixCommand(fallbackMethod = "hello_fallback",commandProperties =
    //        {
    //                @HystrixProperty(name = "circuitBreaker.enabled",value = "true"), //开启熔断器
    //                @HystrixProperty(name = "metrics.rollingStats.timeInMilliseconds",value ="30000"), //统计时间窗
    //                @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold",value = "3"),      //统计时间窗内最小请求次数阈值
    //                @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value = "10000"), //休眠时间窗口期
    //                @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value = "30"), //时间窗内失败阈值百分比
    //                //执行隔离线程超时
    //                @HystrixProperty(name = HystrixPropertiesManager.EXECUTION_ISOLATION_THREAD_TIMEOUT_IN_MILLISECONDS,value = "3000")
    //
    //        })
    @HystrixCommand(fallbackMethod = "hello_fallback")
    public String hello(@RequestParam Integer time){
        ThreadUtil.sleep(time*1000);
        return "原方法";
    }
    @GetMapping("/test2")
    @HystrixCommand(fallbackMethod = "hello_fallback",commandKey = "hello2")
    public String hello2(@RequestParam Integer time){
        ThreadUtil.sleep(time*1000);
        return "原方法";
    }
    public String hello_fallback(Integer time){
        return "兜底方法";
    }
}

将配置中的commandKey替换成hello2,如下

hystrix.command.hello2.metrics.rollingStats.timeInMilliseconds=30000
hystrix.command.hello2.fallback.enabled=true
hystrix.command.hello2.circuitBreaker.enabled=true
hystrix.command.hello2.circuitBreaker.errorThresholdPercentage=30
hystrix.command.hello2.circuitBreaker.requestVolumeThreshold=3
hystrix.command.hello2.circuitBreaker.sleepWindowInMilliseconds=10000
hystrix.command.hello2.execution.isolation.thread.interruptOnFutureCancel=true
hystrix.command.hello2.execution.isolation.thread.interruptOnTimeout=true
hystrix.command.hello2.execution.isolation.thread.timeoutInMilliseconds=3000
hystrix.command.hello2.execution.timeout.enabled=true

🍂Hystrix与OpenFeign结合使用

Feign内部是支持Hystrix的

模拟hystrix-app服务调用nacos-a服务

子模块spring-cloud-hystrix添加依赖

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <!--<version>2.2.1.RELEASE</version>-->
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
        </dependency>

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.moming</groupId>
        <artifactId>spring-cloud-root</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <relativePath>../pom.xml</relativePath>
    </parent>

    <artifactId>spring-cloud-hystrix</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <!--<version>2.2.1.RELEASE</version>-->
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
        </dependency>


        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>com.moming</groupId>
            <artifactId>user-api</artifactId>
            <version>0.0.1-SNAPSHOT</version>
            <scope>compile</scope>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

相关配置信息

#nacos相关配置
spring.application.name=hystrix-app
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
#新版SpringBoot已不再需要@EnableDiscoveryClient,只需要在pom文件中加入服务发现实现类的maven坐标即可。
#默认true,开启服务自动发现
spring.cloud.discovery.enabled=true

#配置feign开启hystrix所有功能
feign.hystrix.enabled=true

#Ribbon相关配置
##建立连接的超时时间
ribbon.ConnectionTimeout=5000
##连接成功后,读取资源数据时的超时配置
ribbon.ReadTimeout = 3000

启动类添加注解

@SpringBootApplication
@EnableHystrix
//@EnableDiscoveryClient
@EnableFeignClients
public class HystrixApp {
    public static void main(String[] args) {
        SpringApplication.run(HystrixApp.class, args);
    }
}

创建Feign客户端调用a服务,当调用失败时,降级回退到AServerClientFallBack兜底类,执行兜底方法

@FeignClient指定参数fallback=AServerClientFallBack.class

@FeignClient(name = "nacos-a",fallback = AServerClientFallBack.class)
public interface AServerClient extends IUserService {
//##特殊配置key规则为:<FeignClientName>#<methodName>(<arg1ClassName>,<arg2ClassName>...)
    //AServerClient#getSleep(Integer)
    //public String getSleep(Integer time) ;
}

全局熔断配置同上

对回退兜底类的某个方法设置熔断配置

配置key规则为:

<FeignClientName>#<methodName>(<arg1ClassName>,<arg2ClassName>...)

#OpenFeign自定义配置
hystrix.command.AServerClient#getSleep(Integer).metrics.rollingStats.timeInMilliseconds=30000
hystrix.command.AServerClient#getSleep(Integer).fallback.enabled=true
hystrix.command.AServerClient#getSleep(Integer).circuitBreaker.enabled=true
hystrix.command.AServerClient#getSleep(Integer).circuitBreaker.errorThresholdPercentage=50
hystrix.command.AServerClient#getSleep(Integer).circuitBreaker.requestVolumeThreshold=3
hystrix.command.AServerClient#getSleep(Integer).circuitBreaker.sleepWindowInMilliseconds=10000
hystrix.command.AServerClient#getSleep(Integer).execution.isolation.thread.interruptOnFutureCancel=true
hystrix.command.AServerClient#getSleep(Integer).execution.isolation.thread.interruptOnTimeout=true
hystrix.command.AServerClient#getSleep(Integer).execution.isolation.thread.timeoutInMilliseconds=3000
hystrix.command.AServerClient#getSleep(Integer).execution.timeout.enabled=true

AServerClientFallBack

@Component
public class AServerClientFallBack implements AServerClient{
    @Override
    public String getName(Integer id) {
        return null;
    }

    @Override
    public Integer getAmount(Integer id) {
        return null;
    }

    @Override
    public String getSleep(Integer time) {
        return "sleep兜底方法";
    }
}

创建测试接口

@RestController
public class FeignController {
    @Autowired
    private AServerClient aServerClient;

    @GetMapping("/feign/test")
    public String test(@RequestParam Integer time){
        return aServerClient.getSleep(time);
    }
}

访问,模拟熔断

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/27459.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网站favion.ico图标

Favicon.ico一般用于作为缩略的网站标志&#xff0c;它显示在浏览器的地址栏或者标签上。 目前主要的浏览器都支持favicon.ico图标 一 制作favicon图标 1 把品优购图标切成png图片 2 把png图片转换为ico图标&#xff0c;这需要借助第三方转换网站&#xff0c;例如&#xff1…

刷题经验分享(一)

文章目录删除公共字符&#xff1a;组队竞赛&#xff1a;删除公共字符&#xff1a; 第一题&#xff1a;删除公共字符 方法一&#xff1a; 思路&#xff1a; 1.将第二个字符串的字符都映射到一个hashtable数组中&#xff0c;用来判断一个字符在这个字符串。 2. 判断一个字符在第…

140.深度学习分布式计算框架-3

140.1 Horovod Horovod是 Uber 开源的又一个深度学习工具&#xff0c;它的发展吸取了 Facebook「一小时训练 ImageNet 论文」与百度 Ring Allreduce 的优点&#xff0c;可为用户实现分布式训练提供帮助。Horovod 支持通过用于高性能并行计算的低层次接口 – 消息传递接口 (MPI…

Vue脚手架环境中简单使用MarkDown(只入门)

目录 入门 高级使用 入门 1 所在终端输入 npm install vue-meditor 2 复制以下代码 先新建一个组件 <template><div><MavonEditor v-model"myMarkDownData"/><button click"submit">提交</button></div> </te…

vue配置

首先安装node.js 在cmd node -v查看 然后 cmd命令行执行 : npm install -g vue/cli // 加-g是安装到全局 安装vue cli 安装vue cli 1 看一下 这是在cmd输入的内容,参考第一条链接 在vscode中怎么配置他? 文件-打开文件夹,选择一个文件夹 这里是firstvue 在下面新建文件夹…

可变长子网划分

目录 IP地址 子网划分 可变长子网划分 IP地址 在学习子网划分之前应该先清楚什么是IP地址和IP地址的类型 IP 地址的格式0网络地址主机地址10网络地址 主机地址 110网络地址主机地址1110组播地址11110保留 A 1.0.0.0~127.255.255.255 B 128.0.0.0~191.255.255…

C++编程进阶

目录 new运算符 new关键字的使用案例 C的引用 C中引用案例 引用的注意事项 引用做函数参数 引用做函数的返回值 前言&#xff1a; 具体案例 引用的本质 常量引用 常量引用原理 经典案例 函数的提高 函数的默认参数 注意&#xff1a; 具体案例 函数的占位参数…

已解决:树莓派外接硬盘 usb 或者sata 导致wifi无法链接 无线网卡无法使用问题

我的环境是树莓派4b 买了一个有硬盘的盒子 看上图的连接方式&#xff0c;是占用了树莓派的一个usb3.1进行了sata的转接&#xff0c;实现挂载硬盘。 但是我发现&#xff0c;安装系统开机之后&#xff0c;可以看到有硬盘接入&#xff0c;但是无法连wifi&#xff0c;如果拔掉硬盘…

G. SlavicG‘s Favorite Problem(树的遍历DFS,BFS均可)

Problem - G - Codeforces 给你一棵有n个顶点的加权树。回顾一下&#xff0c;树是一个没有任何循环的连接图。加权树是一棵树&#xff0c;其中每条边都有一定的权重。这棵树是无定向的&#xff0c;它没有根。 由于树让你感到厌烦&#xff0c;你决定挑战自己&#xff0c;在给定…

java--Lambda (3)变量的访问与修改

文章目录0 写在前面1 可以直接在 Lambda 表达式中访问外层的局部变量2 在 Lambda 表达式当中被引用的变量的值不可以被更改3 在 Lambda 表达式当中不允许声明一个与局部变量同名的参数或者局部变量4 写在最后0 写在前面 学习使用在Lambda表达式&#xff0c;有些地方访问一些变…

VM系列振弦读数模块采集测量数据的一般步骤

VM 模块是通用型单振弦式传感器测量模块&#xff0c;主要功能是测量频率的传感器内置的温度传感器&#xff0c;使用默认工作参数即可自动测读绝大多数振弦传感器。 但由于传感器类型、结构、厂家、钢弦材料、线圈等影响因素不同&#xff0c;导致使用 VM 模块测量某些传感器时需…

【408专项篇】C语言笔记-第六章(指针)

文章目录第一节&#xff1a;指针的本质1. 指针的定义2. 取地址操作符与取值操作符第二节&#xff1a;指针的传递1. 指针的传递第三节&#xff1a;指针的偏移1. 指针的偏移2. 指针与一维数组第四节&#xff1a;动态指针与内存申请1. 指针与动态内存申请2. 堆空间和栈空间的差异第…

电脑无线网卡连接的无线信号不好的,经常丢包,掉线断网如何优化解决

环境&#xff1a; 电脑&#xff1a;HP480G7 系统:Win10 专业版 无线网卡&#xff1a;水星ud6s 、TP-LINK等 AP&#xff1a;锐捷RAP2200(E) 组网模式&#xff1a;AP代管AP模式 问题描述&#xff1a; 电脑无线网卡连接的无线信号不好的&#xff0c;经常断网&#xff0c;因…

docker logs命令详解

docker 命令官档如下&#xff1a; https://docs.docker.com/engine/reference/commandline/docker/ docker logs官档如下 https://docs.docker.com/engine/reference/commandline/logs/#retrieve-logs-until-a-specific-point-in-time 一、常用命令 1. 可以查看命令用法 doc…

英国访问学者|签证申请详细步骤简述

英国访问学者签证流程是怎么样的&#xff1f;下面就随知识人网老师一起来看一看英国访问学者签证申请详细步骤简述。 第1步&#xff1a;英国签证申请中心只接受在线填写的申请表&#xff0c;不接受手写表格。请访问官网完整填写申请表。(必须使用英文大写填写) 第2步&#xff…

数据库系统 整体结构化 的理解

数据库系统实现整体数据的结构化&#xff0c;这是数据库的主要特征之一&#xff0c;也是数据库系统与文件系统的本质区别。 在文件系统中&#xff0c;文件中的记录内部具有结构&#xff0c;但是记录的结构和记录之间的联系被固化在程序中&#xff0c;需要由程序员加以维…

jenkins配置maven+git自动构建jar包

进入页面 安装maven插件 需要使用maven插件构建项目,所以安装maven插件 步骤如下图&#xff1a; 点击安装后跳转至安装页面&#xff0c;等待在线安装完成即可 安装完成配置当前服务器中安装的maven 下滑到最下面点击新增maven 配置完成点击应用完成 配置当前服务器中安装的gi…

ADB 命令结合 Monkey 的使用

1、什么是monkey Monkey 是Android SDK提供的一个命令行工具&#xff0c;可以简单方便的发送伪随机的用户事件流&#xff0c;对Android APP做压力&#xff08;稳定性&#xff09;测试。主要是为了测试app是否存在无响应和崩溃的情况。 2、adb结合 monkey 的常用命令 adb shel…

如何选择跨平台桌面应用开发框架

受益于开源技术的发展&#xff0c;以及响应快速开发的实际业务需求&#xff0c;跨平台开发不仅限于移动端跨平台&#xff0c;桌面端虽然在市场应用方面场景不像移动端那么丰富&#xff0c;但也有市场的需求。 相对于个人开发者而言&#xff0c;跨平台框架的使用&#xff0c;主…

干货!一次伪静态页面的SQL注入!白帽黑客实战 。

涉及技能点 SQL注入基础原理 盲注常用函数及思路 burpsuite基础知识 过程记录 1.发现 在翻阅一EDU站点时&#xff0c;发现路径中带有明显的数字参数 好像与我们平时习惯的xxx.php?id不同呃 2.尝试注入 按照以往习惯&#xff0c;先用order by探探底&#xff0c;结果翻车了…