SpringCloud 服务保护机制Hystrix

2023-11-16

微服务高可用技术

大型复杂的分布式系统中,高可用相关的技术架构非常重要。
高可用架构非常重要的一个环节,就是如何将分布式系统中的各个服务打造成高可用的服务,从而足以应对分布式系统环境中的各种各样的问题,避免整个分布式系统被某个服务的故障给拖垮。
比如:
服务间的调用超时
服务间的调用失败
要解决这些棘手的分布式系统可用性问题,就涉及到了高可用分布式系统中的很多重要的技术,包括:

  1. 资源隔离
  2. 限流与过载保护
  3. 熔断
  4. 优雅降级
  5. 容错
  6. 超时控制
  7. 监控运维

一、服务降级、熔断、限流概念

服务学崩效应

服务雪崩效应产生与服务堆积在同一个线程池中,因为所有的请求都是同一个线程池进行处理,这时候如果在高并发情况下,所有的请求全部访问同一个接口,
这时候可能会导致其他服务没有线程进行接受请求,这就是服务雪崩效应效应。
在这里插入图片描述

服务降级

在高并发情况下,防止用户一直等待,使用服务降级方式(直接返回一个友好的提示给客户端,调用fallBack方法)

服务熔断

熔断机制目的为了保护服务,在高并发的情况下,如果请求达到一定极限(可以自己设置阔值)如果流量超出了设置阈值,让后直接拒绝访问,保护当前服务。使用服务降级方式返回一个友好提示,服务熔断和服务降级一起使用

服务隔离

因为默认情况下,只有一个线程池会维护所有的服务接口,如果大量的请求访问同一个接口,达到tomcat 线程池默认极限,可能会导致其他服务无法访问。
解决服务雪崩效应:使用服务隔离机制(线程池方式和信号量),使用线程池方式实現隔离的原理: 相当于每个接口(服务)都有自己独立的线程池,因为每个线程池互不影响,这样的话就可以解决服务雪崩效应。
线程池隔离:
每个服务接口,都有自己独立的线程池,每个线程池互不影响。
信号量隔离:
使用一个原子计数器(或信号量)来记录当前有多少个线程在运行,当请求进来时先判断计数器的数值,若超过设置的最大线程个数则拒绝该请求,若不超过则通行,这时候计数器+1,请求返 回成功后计数器-1。
在这里插入图片描述

服务限流

服务限流就是对接口访问进行限制,常用服务限流算法令牌桶、漏桶。计数器也可以进行粗暴限流实现。

二、Hystrix

Hystrix简单介绍

*Hystrix是国外知名的视频网站Netflix所开源的非常流行的高可用架构框架。Hystrix能够完美的解决分布式系统架构中打造高可用服务面临的一系列技术难题。

Hystrix “豪猪”,具有自我保护的能力。hystrix 通过如下机制来解决雪崩效应问题。

在微服务架构中,我们把每个业务都拆成了单个服务模块,然后当有业务需求时,服务间可互相调用,但是,由于网络原因或者其他一些因素,有可能出现服务不可用的情况,当某个服务出现问题时,其他服务如果继续调用这个服务,就有可能出现线程阻塞,但如果同时有大量的请求,就会造成线程资源被用完,这样就可能会导致服务瘫痪,由于服务间会相互调用,很容易造成蝴蝶效应导致整个系统宕掉。因此,就有人提出来断路器来解决这一问题。

资源隔离:包括线程池隔离和信号量隔离,限制调用分布式服务的资源使用,某一个调用的服务出现问题不会影响其他服务调用。

降级机制:超时降级、资源不足时(线程或信号量)降级,降级后可以配合降级接口返回托底数据。
融断:当失败率达到阀值自动触发降级(如因网络故障/超时造成的失败率高),熔断器触发的快速失败会进行快速恢复。

缓存:提供了请求缓存、请求合并实现。*
在这里插入图片描述

Hystrix环境搭建

在这里插入图片描述

Maven依赖信息

<!-- hystrix断路器 -->
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
		</dependency>

开启Hystrix断路器

feign:
  hystrix:
enabled: true
    
#### hystrix禁止服务超时时间
hystrix:  
 command: 
   default: 
      execution: 
       timeout: 
        enabled: false
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
@EnableHystrix
public class AppOrder {
	public static void main(String[] args) {
		SpringApplication.run(AppOrder.class, args);
	}

}

服务降级处理

//fallbackMethod  方法作用服务降级执行
//HystrixCommand 默认开启线程池隔离,服务降级,服务熔断
	@HystrixCommand(fallbackMethod = "orderToUserInfoFallback")
	@GetMapping("/orderToUserInfo")
	public ResponseBase orderToUserInfoHystrix() {
		System.out.println("orderToUserInfo:" + "当前线程池名称:" + Thread.currentThread().getName());
		return memberServiceFeigin.getUserInfo();
	}

	@RequestMapping("/orderToUserInfoFallback")
	public ResponseBase orderToUserInfoFallback() {
		return setResultError("服务降级,服务器忙,请稍后重试!!!!");
	}

Fallback回调

	@RequestMapping("/orderToUserInfo")
	public ResponseBase orderToUserInfo() {
		return memberServiceFeigin.getUserInfo();
	}

  @Component
public class MemberServiceFallback extends BaseApiService implements   MemberServiceFeigin {
	public ResponseBase getUserInfo() {
		// 服务降级处理
		return setResultError("系统错误,请稍后重试!");
	}

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringCloud 服务保护机制Hystrix 的相关文章

  • 透明平开窗

    我有一点JWindow上面有一个标志 用户可以将东西拖到上面 我主要在 OS X 上开发我的应用程序 为了获得我使用的透明窗口 setBackground new Color 0 0 0 0 在 Mac 上 这工作得很好 但在 Window
  • 如何迭代所有注册表项?

    我正在尝试迭代所有注册表项以查找 包含 并删除 jre1 5 0 14 值 有办法做到吗 下面的代码只是在特定键下找到jre1 5 0 14 我确实想迭代所有的键 顺便说一句 if 子句获取是否等于 jre1 5 0 14 但如果它包含 j
  • JavaFX Platform.runLater 的使用以及从不同线程访问 UI

    我有几个问题Platform runLater 我有一个 JavaFX 应用程序类 在这个类中 我运行一个线程 该线程从网络套接字读取数据 现在当我创建一个新的Stage在线程内部 系统抛出异常 JavaFX 事件调度程序线程和我的网络读取
  • 使用 AbstractTableModel 获取 JTable 中选定的行

    我有一个JTable using AbstractTableModel我在哪里有一个JCheckBox在第一列中用于选择行 现在 我需要从已检查的表中获取选定的行 现在 我按顺序从第一行遍历到最后一行并获取所有选择的行 如下所示 List
  • 在Java中清空数组/处理

    除了循环遍历数组中的每个元素并将每个元素设置为 null 之外 Java 处理中是否有一个本机函数可以简单地清空数组 或销毁它 以便能够将其重新声明为新数组 There s Arrays fill myArray null 并不是说它执行的
  • @OneToMany 与 @JoinTable 错误

    我试图理解 OneToMany with JoinTable 对于这样的场景 我正在使用 JPA 2 1 Hibernate 5 0 4 和 Oracle 11 XE 当我打电话时userDao save user 下面的代码 我有 jav
  • 在 TestNG 中运行多个类

    我正在尝试自动化一个场景 其中我想登录一次应用程序 然后进行操作而无需再次重新登录 考虑一下 我有在特定类的 BeforeSuite 方法中登录应用程序的代码 public class TestNGClass1 public static
  • Java Spring 应用程序存在内存泄漏。系统非堆内存不断增加

    我已使用 yourkit 分析器监视我的 Web 应用程序 保留最大大小的主要对象是 SessionFactoryImpl webappclassloader 和 CGlib 对象显示 spring crone调度程序会导致内存泄漏吗 我尝
  • 要打乱的键值(整数、字符串)列表的最佳结构

    我需要在 Java 中实现一个结构 它是一个键值列表 类型为整数 字符串 并且我想对其进行洗牌 基本上 我想做类似的事情 public LinkedHashMap
  • 用 java 编写解释器时的 switch 或 if 语句

    当前的作业需要我编写一个程序 以一种非常微小且基本的编程语言 行为有点像 FORTRAN 来读取包含指令的文件并执行这些指令 基本上它是我猜的语言的简单解释器 它是完全线性的 所有语句都是按顺序定义的 并且只有字符串和整数变量 我需要查找和
  • 如何将自定义日志处理程序添加到 Google App Engine?

    我正在尝试向我的 java 应用程序添加自定义日志处理程序 我已经实现了一个扩展 java util Logging Handler 类的 InnerLogger 类 在我的logging properties中声明为处理程序 handle
  • 从关卡堆栈中获取相对比例的数学

    为这个可怕的标题道歉 我花了 10 分钟试图用一句话来解释这一点 但失败了 虽然提示这个问题的应用程序是用Java Android 编写的 但我认为它非常通用并且适用于任何语言 欢迎使用伪代码 或简单的英语 回复 我不确定是否应该标记所有通
  • 如何使用 Guava 连接字符串?

    我写了一些代码来连接字符串 String inputFile for String inputLine list inputFile inputLine trim 但我不能使用 连接 所以我决定使用 Guava 所以我需要使用Joiner
  • Java ConcurrentModificationException [重复]

    这个问题在这里已经有答案了 当删除倒数第二个元素时 没有 ConcurrentModificationException List
  • 是否可以为 azure blob 存储中的给定目录生成具有写入权限的 SAS(共享访问签名)

    我们的 blob 存储帐户结构 容器名称 simple 在这个容器内我们有 blob aa one zip aa two zip bb ss zip bb dd zip 是否可以生成对aa 目录 有写权限 但对bb 目录 没有访问权限的SA
  • 在Java中多次读取System.in会导致IOException?

    我正在尝试创建一个小命令行游戏来强化我在过去几个月中在 Java 中学到的一些东西 我正在尝试创建一个名为 readInput 的方法 它返回一个我可以一次又一次调用的字符串 第一次它工作正常 但第二次它会导致 IO Exception 如
  • 我们可以有虚假中断吗?

    我正在创建一个任务轮询器 每分钟都会查找任务 它看起来像这样 public class Poller private final ExecutorService e Executors newSingleThreadExecutor pub
  • 如果抛出RuntimeException,是否可以将其作为异常捕获?

    如果我有一个try抛出一个块RuntimException子类 可以是后续的catch块将其捕获为Exception 具体来说 public class MyAppException extends RuntimeException In
  • java.io.EOFException:没有更多可用数据 - 预期结束标记 关闭开始标记

    我正在使用 xmpp 开发一个聊天应用程序 根据我们的要求 我们有三台服务器 Apache Tomcat 7 ejabbered 2 1 11 和 mysql 5 5 to run xmppbot on tomcat used below
  • 如何使用剪辑来减少绘画时间?

    我正在尝试使用 Clip 来减少 CPU 负载 但剪辑在屏幕上留下了一些我似乎无法摆脱的垃圾 另外 打开和关闭剪辑似乎对 CPU 负载没有影响 在任一情况下 大部分时间似乎都花在重绘管理器和绘制缓冲图像上 import static jav

随机推荐

  • halcon 测量

    dev set draw margin dev set line width 3 创建包含了检测的边缘ROI区域 注意所画的矩形区域的长轴要与检测边界垂直 Row 599 5 Column 1073 5 Phi rad 87 0643 Le
  • oracle number17,2018-10-17 oracle 常用语法函数总结

    1 Oracle正则匹配使用 PS 这条SQL可以通过正则匹对查询一下 表A的字段a是否有非数字的数据 有时候数据表的一些字段是varchar类型的 如果sql里用to number的话 就肯定会报无效数字的错误 select from 表
  • VS2008下的配置opencv

    openCV 2 2以及2 2以下版本 不自带编译好的dll动态库和lib静态库文件 其中的bin和lib都是未经编译的 还不能直接使用的 因此需要进行下载CMake来对于Opencv源代码进行重新编译 才能得到最终的dll和lib库文件
  • 本人亲自整理的极客时间设计模式之美下部的硬核笔记(残缺版)最近加班太多,搞不了太多,只能尽量了xd们

    设计模式之美 下 https www yuque com zcming123 uygxde cbwnad 这位猿 三连 再走吧 以下内容是为了让搜索引擎 检测到这篇文章 要阅读体验 请点击上面的连接 点击我 去我的语雀看 对了 我看到语雀那
  • Spring Boot 基础知识

    概述 什么是 Spring Boot Spring Boot 是 Spring 开源组织下的子项目 是 Spring 组件一站式解决方案 主要是简化了使用 Spring 的难度 简省了繁重的配置 提供了各种启动器 开发者能快速上手 Spri
  • STM32F103系列定时器通道对应IO汇总

    1 通用定时器 TIM2 Default Remap CH1 ETR PA0 PA15 CH2 PA1 PB3 CH3 PA2 PB10 CH4 PA3 PB11 TIM3 Default Remap CH1 PA6 PB4 PC6 CH2
  • 在Windows服务器上搭建Nuget私人服务器(超~详细)

    在Windows服务器上搭建Nuget私人服务器 一 使用VS2017 VS2019新建空白解决方案 操作如图 步骤一 这里以VS2019为例 打开VS2019 选择 创建新项目 选项 步骤二 选择 空白解决方案 点击 下一步 步骤三 填写
  • React中setState()更新状态的两种写法及相关问题

    1 setState updater callback 函数式的setState updater是一个返回stateChange对象的函数 如下代码所示 它接收的state和props都保证为最新 updater的返回值会与state进行浅
  • 关于Socket编程中的inet_ntop、inet_pton和inet_ntoa、inet_addr

    VS2013中调试Socket代码时 遇到了点小问题 问题代码为 cpp view plain copy inet ntoa addrClient sin addr 生成错误消息为 plain view plain copy error C
  • Spark中的基本概念

    Spark中的基本概念 1 基本概念 1 1 RDD 弹性分布式数据集 1 2 DAG 有向无环图 1 3 Partition 数据分区 1 4 NarrowDependency 窄依赖 1 5 ShuffleDependency 宽依赖
  • 互斥锁,自旋锁,原子操作的原理,区别和实现

    一 互斥锁 原理 互斥锁属于sleep waiting类型的锁 例如在一个双核的机器上有两个线程 线程A和线程B 它们分别运行在Core0和Core1上 假设线程A想要通过pthread mutex lock操作去得到一个临界区的锁 而此时
  • windows系统软件开发平台配置

    1 mongodb安装及配置 参考文档 https blog csdn net xuforeverlove article details 88344213 1 1 临时启动mongodb服务 a 打开mongodb安装文件夹 进入并复制d
  • 【七夕活动精选】致你的七夕礼物——3D Heart,跳动的 3D 爱心

    程序效果很简单 是一颗跳动的爱心 在心脏下面有一行小字写着 七夕快乐 按住鼠标左键并拖动可以让它旋转起来 按住右键可以让这颗心暂时停止跳动 执行效果如下 完整的源代码如下 程序名称 致你的七夕礼物 3D Heart 编译环境 Visual
  • sqli-labs 41——65关攻略

    Less 41 基于错误的POST型单引号字符型注入 与之前讲的Less 40的区别 s q l S E L E C T F R O M u s e r s W H E R E i d sql SELECT FROM users WHERE
  • 2023年华中杯选题人数公布

    2023年华中杯选题人数公布 经过一晚上代码的编写 论文的写作 C题完整版论文已经发布 注 蓝色字体为说明备注解释字体 不能出现在大家的论文里 黑色字体为论文部分 大家可以根据红色字体的注记进行摘抄 对应的详细的写作视频教程 争取1号晚上发
  • [机器学习笔记] 支持向量机SVM 和逻辑回归LR的异同

    参考 https www cnblogs com zhizhan p 5038747 html 为什么把SVM和LR放在一起进行比较 一是因为这两个模型应用广泛 二是因为这两个模型有很多相同点 在使用时容易混淆 不知道用哪个好 特别是对初学
  • 性能测试-压力测试-jmeter简单实战

    文章目录 一 压力测试 1 性能指标 响应时间 RT HPS Hits Per second TPS Transaction Per second QPS Query Per second 最大响应时间 Max Response Time
  • oracle如何提高数据库的性能和可用性

    进行数据库优化 通过定期执行优化操作 如维护索引 调整内存参数 优化 SQL 语句等 可以提高数据库的性能和可用性 执行数据库碎片整理 通过执行表空间碎片整理 索引碎片整理 表碎片整理等操作 可以优化数据库的碎片 提高数据存储效率 执行数据
  • ruoyi对数据二次处理后分页失效

    业务场景 正常业务场景下 在service层只做一次查询就能满足需求 若需要分页 只需在Controller层添加继承BaseController 使用startPage 和getDataTable 即可 业务需求存在需要对查询的数据做二次
  • SpringCloud 服务保护机制Hystrix

    微服务高可用技术 大型复杂的分布式系统中 高可用相关的技术架构非常重要 高可用架构非常重要的一个环节 就是如何将分布式系统中的各个服务打造成高可用的服务 从而足以应对分布式系统环境中的各种各样的问题 避免整个分布式系统被某个服务的故障给拖垮