熔断降级 请求合并 请求缓存 线程池隔离 信号量隔离 openfeign整合Hystrix

〇、Hystrix的解决策略和预防措施:

        熔断降级是解决远程调用已经出现问题的解决方案。

        请求合并 请求缓存 线程池隔离 信号量隔离都是预防性措施

        使用Hystrix启动类上需要添加注解开启注解支持:

        @EnableHystrix@EnableCircuitBreaker

        测试Hystrix需要的依赖坐标如下:

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.12.RELEASE</version></parent><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Hoxton.SR12</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.22</version> <!-- 请使用最新的版本号 --><scope>provided</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!-- 容灾处理依赖。 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId></dependency></dependencies>

一、熔断降级 

                熔断是在远程调用的服务器出现问题后,访问不会再进行远程调用甚至调用方法get()。

                降级是访问不会再进行远程调用,而是转而调用getDownGrade()方法返回托底数据。

//  熔断 熔断熔断熔断熔断熔断熔断熔断     熔断      熔断   熔断@HystrixCommand(fallbackMethod = "getDownGrade",commandProperties = {@HystrixProperty(name = HystrixPropertiesManager.EXECUTION_ISOLATION_THREAD_TIMEOUT_IN_MILLISECONDS,value = "5000"), // 统计周期,默认10秒@HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_ENABLED,value = "true"), // 是否开启熔断,默认true@HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_REQUEST_VOLUME_THRESHOLD,value = "2"), // 统计周期内,错误几次,开启熔断, 默认20@HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_ERROR_THRESHOLD_PERCENTAGE,value = "50"), // 统计周期内,错误百分比达到多少,开启熔断, 默认50@HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_SLEEP_WINDOW_IN_MILLISECONDS,value = "3000"), // 开启熔断后,多少毫秒不访问远程服务,默认5000毫秒@HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_FORCE_OPEN,value = "false"), // 是否强制开启熔断器, 默认false@HystrixProperty(name = HystrixPropertiesManager.CIRCUIT_BREAKER_FORCE_CLOSED,value = "false") // 是否强制关闭熔断器, 默认false})public String get(){String forObject = restTemplate.getForObject("http://application-service/getNoParams", String.class);return forObject;}public String getDownGrade(){return "服务器繁忙";}


二、请求合并 

        远程调用的服务器端c2有两个方法。一个是针对单个id的,还有一个是针对多个id的相同操作的合并

        多个根据id查询user的请求发送至要进行 远程调用的服务器端c1,这时开启请求处理的多个线程阻塞,并将多个id合并为一个List发送一个请求到c2.然后返回的值放在相应线程的FutureTask中。

//请求合并 请求合并 请求合并 请求合并请求合并 请求合并请求合并 请求合并请求合并 请求合并请求合并 请求合并请求合并 请求合并@HystrixCollapser(batchMethod = "getUserByIds",scope = com.netflix.hystrix.HystrixCollapser.Scope.GLOBAL,collapserProperties = {@HystrixProperty(name =HystrixPropertiesManager.MAX_REQUESTS_IN_BATCH,value = "2"), // 最多合并多少个请求@HystrixProperty(name =HystrixPropertiesManager.TIMER_DELAY_IN_MILLISECONDS,value = "2000") // 最多等待多少毫秒})public Future<User> getUserById(Integer id){System.out.println("正常请求,无请求合并:id="+id);restTemplate.postForObject("http://application-service/getUserById", id, User.class);return null;}@HystrixCommandpublic List<User> getUserByIds(List<Integer>ids) throws JsonProcessingException {List<LinkedHashMap> list = restTemplate.postForObject("http://application-service/getUserByIds", ids, List.class);System.out.println("执行合并方法");List<User> list1 = new ArrayList<>();for (LinkedHashMap linkedHashMap : list) {ObjectMapper objectMapper = new ObjectMapper();String s = objectMapper.writeValueAsString(linkedHashMap);User user = objectMapper.readValue(s, User.class);list1.add(user);}return list1;}


三、请求缓存

         这里使用spring cache技术连接redis数据库,在配置文件中配置redis的地址。

        @Cacheable()注解自动将方法的返回值存储redis中。

        启动类上添加@EnableCaching  开启相关注解支持

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId>
</dependency>
//请求缓存 请求缓存       请求缓存请求缓存请求缓存请求缓存@Cacheable(cacheNames = "getForObject",key = "#id")public String cache(Integer id){System.out.println("cache方法执行");String forObject = restTemplate.getForObject("http://application-service/getNoParams", String.class);return forObject;}


四、线程池隔离

                和船体底部的小船舱一样,底部破了仍然有隔板挡着。

                线程池是事先针对远程调用准备的多个线程。

                如果不准备线程池,一个远程调用崩了,导致线程阻塞不能释放最终会导致整个服务崩掉。

  //线程池隔离   线程切换  线程池隔离   线程切换 线程池隔离   线程切换线程池隔离   线程切换@HystrixCommand(groupKey = "TbItem",commandKey = "selectItemService",threadPoolKey = "pool-name",threadPoolProperties = {@HystrixProperty(name = HystrixPropertiesManager.CORE_SIZE,value = "3"), // 线程池容量@HystrixProperty(name = HystrixPropertiesManager.KEEP_ALIVE_TIME_MINUTES,value = "5"), // 线程空闲时,最大存活时间是多少分钟@HystrixProperty(name = HystrixPropertiesManager.MAX_QUEUE_SIZE,value = "5"), // 线程池占满时,最多由多少个请求阻塞等待@HystrixProperty(name = HystrixPropertiesManager.QUEUE_SIZE_REJECTION_THRESHOLD,value = "5") // 当阻塞队列MAX_QUEUE_SIZE占满时,可以由多少个// 请求同时阻塞等待后续处理。})public String selectItemService() {System.out.println("selectItemService---"+Thread.currentThread().getName());String forObject = restTemplate.getForObject("http://application-service/getNoParams", String.class);return forObject;}


五、信号量隔离

        在一定时间内只允许有限个线程远程调用,其他线程降级。

        进行远程调用的线程会拿到许可证,线程结束释放许可证。

//信号量隔离  信号量隔离信号量隔离信号量隔离//在一定时间内只允许2个线程远程调用,其他线程降级@HystrixCommand(fallbackMethod = "getDownLoad",commandProperties = {@HystrixProperty(name = HystrixPropertiesManager.EXECUTION_ISOLATION_STRATEGY,value = "SEMAPHORE"), // 隔离方案。默认线程池隔离。 THREAD | SEMAPHORE@HystrixProperty(name = HystrixPropertiesManager.EXECUTION_ISOLATION_SEMAPHORE_MAX_CONCURRENT_REQUESTS,value = "1"), // 最大信号量@HystrixProperty(name = HystrixPropertiesManager.EXECUTION_ISOLATION_THREAD_TIMEOUT_IN_MILLISECONDS, value = "5000") // 超时时间。信号量隔离中无效,线程池隔离中有效。默认1秒})public String sign(){String forObject = restTemplate.getForObject("http://application-service/getNoParams", String.class);return forObject;}public String getDownLoad(){return "服务器繁忙";}


六、openfeign整合Hystrix

       1)openfeign中使用Hystrix很简单,只需要修改配置文件即可,因为内置好了Hystrix的基础功能容灾处理。

                可以看到如果需要Hystrix的其他预防措施还是需要引入Hystrix依赖坐标

        2)修改配置文件:

feign:hystrix:enabled: true
hystrix: # hystrix 容灾配置command: # hystrix 命令配置,就是具体的容灾方案default: # 默认环境,相当于全局范围,后续的配置,参考HystrixPropertiesManager中的常量配置circuitBreaker: # 熔断配置, 常用。 其他配置不常用。enabled: truerequestVolumeThreshold: 2sleepWindowInMilliseconds: 2000errorThresholdPercentage: 50

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

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

相关文章

DAY81服务攻防-开发框架安全SpringBootStruts2LaravelThinkPHPCVE 复现

知识点&#xff1a; 1、PHP-框架安全-Thinkphp&Laravel 2、J2EE-框架安全-SpringBoot&Struts2 常见语言开发框架&#xff1a; PHP&#xff1a;Thinkphp Laravel YII CodeIgniter CakePHP Zend等 JAVA&#xff1a;Spring MyBatis Hibernate Struts2 Springboot等 P…

安宝特案例 | 某知名日系汽车制造厂,借助AR实现智慧化转型

案例介绍 在全球制造业加速数字化的背景下&#xff0c;工厂的生产管理与设备维护效率愈发重要。 某知名日系汽车制造厂当前面临着设备的实时监控、故障维护&#xff0c;以及跨地域的管理协作等挑战&#xff0c;由于场地分散和突发状况的不可预知性&#xff0c;传统方式已无法…

服务器数据恢复—存储映射到服务器上的卷无法挂载的数据恢复案例

服务器存储数据恢复环境&故障&#xff1a; 一台存储上有一组由16块FC硬盘组建了一组raid。存储前面板上的对应10号和13号硬盘的故障灯亮起&#xff0c;存储映射到redhat linux操作系统服务器上的卷挂载不上&#xff0c;业务中断。 服务器存储数据恢复过程&#xff1a; 1、…

18.Linux-配置DNF仓库

DNF仓库产生背景 在现实的场景中&#xff0c;我们经常要安装一些软件包&#xff0c;但由于现场不提供网络。 需要使用光盘或文件下载的方式去安装。 对于linux有两种离线安装方式&#xff1a;二进制文件安装和源码安装 其中二进制文件是比较简单的安装方式&#xff0c;不同的l…

C++学习9.27

1、顺序表、栈、队列都更改成模板类 &#xff08;1&#xff09;顺序表 #include <iostream> #include <cstring>using namespace std;template <typename T1,typename T2,typename T3> class My_string { private:T1 *ptr; //指向字符数组的指针T2…

iwebsec靶场 反序列化关卡通关笔记2-反序列化漏洞示例02

目录 第02关 反序列化漏洞示例02 1.打开靶场 2.源码分析 3.login函数利用 4.show函数利用 5.参数反序列化设计 6.show函数查询orange 7.增加注释语句 8.show函数SQL注入获取密码 &#xff08;1&#xff09;构造SQL语句 &#xff08;2&#xff09;构造序列化 &#…

OJ在线评测系统 后端判题机架构搭建 使用原生实现Java安全管理器环境隔离

原生实现安全管理器环境隔离 限制用户的操作权限 文件 网络 执行 Java安全管理器 SecurityManager 来实现更严格的限制 是 Java 提供的保护 JVM Java安全的机制 可以实现更严格的资源和操作限制 编写安全管理器 只需要继承 SecurityManager类 我们可以从这个参数perm参数拿…

Study--Oracle-09--部署Openfiler存储服务器

一、安装Oracle RAC需要存储&#xff0c;为此搭建安装openfiler用于模拟存储。 openfiler相关镜像包可从官网下载&#xff1a;Downloads | Openfiler 当前最新版本如下&#xff08;该笔记也是基于如下版本&#xff09; 二、安装步骤 https://zhuanlan.zhihu.com/p/519819303…

趋势外推法

趋势外推法主要利用图形识别法和差分法计算&#xff0c;进行模型的基本选择。 一、图形识别法。 这种方法是通过绘制散点图来进行的&#xff0c;即将时间序列的数据绘制成以时间 t 为横轴、时序观察值为纵轴的图形&#xff0c;观察并将其变化曲线与各类函数曲线模型的图形进行…

媒界:吉利星瑞百炼成钢,持续引领中国汽车价值向上

秋风送爽绘秋色&#xff0c;出行良辰恰逢时。9月28日至9月29日&#xff0c;2024安行中国汽车安全科技公益巡展迎来尾声&#xff0c;安行中国携手吉利汽车&#xff0c;步履轻盈地踏入苏州星湖天街&#xff0c;共同呈献一场融合环保科技前沿、安全驾驶理念与深厚文化底蕴的48小时…

设备管理系统-TPM(PC+APP/PDA全流程)高保真Axure原型 源文件分享

随着科技的不断发展&#xff0c;企业对于设备管理的需求也日益增强。为了满足企业在设备管理方面的各种需求&#xff0c;站长为大家整理了一套设备管理系统TPM&#xff08;PCAPP/PDA全流程&#xff09;高保真Axure原型&#xff0c;通过这套原型&#xff0c;企业能够实现对设备的…

Xinstall助力广告主实现精准投放,提升App广告效果!

随着移动互联网的快速发展&#xff0c;App广告投放已成为品牌推广的重要手段。然而&#xff0c;广告投放的效果如何&#xff0c;是否达到了预期的目标&#xff0c;这些问题一直困扰着广告主。今天&#xff0c;我们就来聊聊App广告投放数据统计的痛点&#xff0c;以及Xinstall如…

HBase DML操作代码汇总(表格数据的CRUD操作)

HBase DML操作 DML操作主要是关于对表格内部数据的增删改查。 HbaseDML package org.hbase;import org.apache.hadoop.hbase.Cell; import org.apache.hadoop.hbase.CellUtil; import org.apache.hadoop.hbase.CompareOperator; import org.apache.hadoop.hbase.TableName; i…

性能测试:性能测试计划

性能测试计划是在进行软件或系统的性能测试之前制定的详细计划和指导文件。它描述了所需性能测试的目标、范围、测试环境、资源需求、测试策略、测试用例、时间表等重要信息。 为什么要制定性能测试计划 制定性能测试计划的主要目的是确保性能测试的有效性和可靠性。以下是制…

通过OpenScada在ARMxy边缘计算网关上实现数字化转型

随着工业4.0概念的普及&#xff0c;数字化转型已成为制造业升级的关键路径之一。在此背景下&#xff0c;边缘计算技术因其能够有效处理大量数据、减少延迟并提高系统响应速度而受到广泛关注。ARMxy边缘计算网关&#xff0c;特别是BL340系列&#xff0c;凭借其强大的性能和灵活的…

大联大友尚集团推出基于炬芯科技产品的蓝牙音箱方案

大联大控股宣布&#xff0c;其旗下友尚推出基于炬芯科技&#xff08;Actions&#xff09;ATS2835P蓝牙音频SoC的蓝牙音箱方案。 图示1-大联大友尚基于炬芯科技产品的蓝牙音箱方案的展示板图 在智能音频设备市场持续升温的浪潮中&#xff0c;蓝牙音箱凭借音质卓越、操作简便等…

自定义认证过滤器和自定义授权过滤器

目录 通过数据库动态加载用户信息 具体实现步骤 一.创建数据库 二.编写secutity配置类 三.编写controller 四.编写服务类实现UserDetailsService接口类 五.debug springboot启动类 认证过滤器 SpringSecurity内置认证流程 自定义认证流程 第一步:自定义一个类继承Abstra…

【15%】100小时机器学习——什么是机器学习

前言 虽然已经好久没有更新了&#xff0c;但笔者最近一直都在努力学习哦。 前面三三两两根据GitHub上的项目写了一些实验操作&#xff0c;但是总觉得这样是不行的。碎片化的学习只能是建立在已知的基础上进行熟练&#xff0c;不能作为打基础的主力方法&#xff0c;最关键的是&a…

CJEval:一个基于中国初中考试的多样化考试问题数据集

2024-09-26&#xff0c;由腾讯YouTu Lab和北京大学联合发布的CJEval&#xff0c;是一个基于中国初中生考试数据的评估基准&#xff0c;用于测试和分析大型语言模型&#xff08;LLMs&#xff09;在教育任务中的表现&#xff0c;从而提高在线教育平台的智能化水平。 一、背景&…

【湖南步联科技身份证】 身份证读取与酒店收银系统源码整合———未来之窗行业应用跨平台架构

一、html5 <!DOCTYPE html> <html><head><meta http-equiv"Content-Type" content"text/html; charsetutf-8" /><script type"text/javascript" src"http://51.onelink.ynwlzc.net/o2o/tpl/Merchant/static/js…