十一、Hystrix服务保护

news2024/11/27 4:03:53

目录

服务雪崩相关概念简述

服务的雪崩效应

造成服务雪崩的原因

服务雪崩最终的结果

防止服务雪崩的方法

一、服务降级

1、引入Hystrix 服务保护依赖

2、基于注解@HystrixCommand使用Hystrix

2.1、在需要进行服务保护的方法上添加注解@HystrixCommand,并指定降级方法名称

2.2、编写降级方法

2.3、通过注解@EnableHystrix开启服务保护机制

2.4、重启服务、访问超时接口

二、服务熔断

1、关键参数/指标:

1.1、统计周期

1.2、统计周期内的请求数阈值

1.3、统计周期内的错误请求比例阈值

1.4、熔断恢复时长

三、服务隔离

3.1、线程池隔离

3.1.1、groupKey--分组命名

3.1.2、commandKey--Hystrix中的命令命名

3.1.3、threadPoolKey--线程池命名

3.1.4、threadPoolProperties--用于为线程池设置的参数

3.1.5、常用的线程池设置参数

3.2、信号量隔离

3.3、两种隔离方式的优缺点

3.3.1、线程池隔离:(实现原理:各个服务独立的线程池)

3.3.2、信号量隔离:(实现原理:共用线程池,使用计数器进行限流)

3.4、两种隔离方式的使用选择

3.4.1、线程池隔离

3.4.2、信号量隔离


服务雪崩相关概念简述

服务的雪崩效应

简单来说就是因为项目中的某一个或多个服务不可用造成整个项目都不可用。

造成服务雪崩的原因

可以简单归纳为以下三种:

  1. 服务提供者不可用。如:硬件故障、程序BUG、缓存击穿、并发请求量过大等
  2. 重试加大流量。如:用户重试、代码重试逻辑等
  3. 服务调用者不可用。如:同步请求阻塞造成的资源耗尽等

服务雪崩最终的结果

服务链条中的某一个服务不可用,导致一系列的服务不可用,最终造成服务逻辑崩溃。

防止服务雪崩的方法

服务降级、服务熔断、服务隔离、限流、请求缓存、请求合并等

一、服务降级

        当请求超时、资源不足等情况发生时进行服务降级处理,不调用真实的服务逻辑,而是使用快速失败(fallback)方式直接返回一个兜底数据,快速响应客户端,保证服务链条的完整,避免服务雪崩。

Hystrix的使用

1、引入Hystrix 服务保护依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

2、基于注解@HystrixCommand使用Hystrix

2.1、在需要进行服务保护的方法上添加注解@HystrixCommand,并指定降级方法名称

2.2、编写降级方法

注意目标方法(需要服务保护的方法)与降级方法的参数列表和方法返回值要保持一致

2.3、通过注解@EnableHystrix开启服务保护机制

 2.4、重启服务、访问超时接口

由于超时并没有返回success,而是返回了fallback方法的兜底数据

底层实现原理:使用AOP切面代理技术

二、服务熔断

当一定时间内,异常请求比例(请求超时、网络故障、服务异常等)达到阈值时,启动熔断器,熔断器一旦启动,则会停止调用具体的服务逻辑,不调用真是服务逻辑,通过fallback快速返回托底数据,保证服务链的完整。

熔断自动恢复机制,如:当熔断器启动后,每隔5s尝试将新的请求发送给服务提供者,如果服务可正常执行并返回结果,则关闭熔断器,服务恢复,如果仍旧调用失败,则继续返回托底数据,熔断器持续保持开启状态。

1、关键参数/指标:

1.1、统计周期

滑动窗口时长

1.2、统计周期内的请求数阈值

当前请求数达到该阈值,就会开启熔断机制(熔断前提条件)

1.3、统计周期内的错误请求比例阈值

当错误比例达到阈值后将开启熔断(真正开启熔断器)

1.4、熔断恢复时长

当过了恢复时长后,熔断器进入半熔断状态

服务熔断需要配合服务降级,两者配合完成对服务的保护

HystrixPropertiesManager有很多参数配置熔断器的指标

@HystrixCommand(fallbackMethod = "circuitBreakerFallback",commandProperties = {
        //统计周期,滑动窗口时长5s,单位ms
        @HystrixProperty(name= HystrixPropertiesManager.METRICS_ROLLING_STATS_TIME_IN_MILLISECONDS,
        value = "5000"),
        //熔断器开启前提条件,当达到这个阈值时,熔断器进入就绪状态
        @HystrixProperty(name=HystrixPropertiesManager.CIRCUIT_BREAKER_REQUEST_VOLUME_THRESHOLD,value = "4"),
        //统计周期内的错误率,当达到该阈值后,将开启熔断,如5秒内错误请求率达到30%就开启熔断器
        @HystrixProperty(name=HystrixPropertiesManager.CIRCUIT_BREAKER_ERROR_THRESHOLD_PERCENTAGE,value="30"),
        //熔断恢复时长设置,10s后进入半熔断状态
        @HystrixProperty(name=HystrixPropertiesManager.CIRCUIT_BREAKER_SLEEP_WINDOW_IN_MILLISECONDS,value = "10000")
})
@GetMapping("/circuitBreaker")
public String circuitBreaker() throws Exception{
    Thread.sleep(10000);
    return "success";
}


public String circuitBreakerFallback(){
    return "circuitBreaker server ";
}

三、服务隔离

当服务发生问题时,使用技术手段隔离请求,保证服务调用链的完整,隔离分为线程池隔离信号量隔离两种实现方式。

3.1、线程池隔离

它的目的是为每个微服务设置各自的线程池,互不影响,这样,如果某个微服务的线程池满了,不会影响其他微服务的线程池,而是调用fallback方法返回。引入线程池势必会造成一定的系统压力,因为线程池的上下文切换,调度,排队等会增加系统开销,但是hystrix在设计之初,认为它提供的好处远远可以忽略这些开销。

@HystrixCommand配置服务隔离参数

3.1.1、groupKey--分组命名

在application client 中会为每个application service服务设置一个分组,同一个分组下的服务调用同一个线程池。默认值为this.getClass().getSimpleName();

3.1.2、commandKey--Hystrix中的命令命名

默认为当前方法的方法名,可省略。用于标记当前要触发的远程服务是什么。

3.1.3、threadPoolKey--线程池命名

要求一个应用中全局唯一。多个方法使用同一个线程池命名,代表使用同一个线程池。默认值是groupKey数据。

3.1.4、threadPoolProperties--用于为线程池设置的参数

其类型为HystrixProperty数组。

3.1.5、常用的线程池设置参数

  1. coreSize--线程池最大并发数(核心线程数),建议设置标准为:每秒最大支持请求数*(99%平均响应时间+一定量的缓冲时间(99%平均响应时间的10%-20%))。如:每秒可以处理的最大请求数为1000,99%的平均响应时间为60ms,自定义的缓冲时间为60*20%=12ms,则最大并发数=1000*(0.060+0.012)=72
  2. maxQueueSize--BlockingQueue的最大长度,默认值为-1,即不限制。如果设置为正数,等待队列将从同步队列SynchronousQueue转换为阻塞队列LinkedBlockingQueue
  3. queueSizeRejectionThreshold--设置拒绝请求的临界值,默认值为5。此属性是配合阻塞队列使用的,也就是不适用maxQueueSize=-1(为-1时此设置无效)。用于设置阻塞队列限制的,如果超出限制,则拒绝请求。此参数的意义在于服务启动后,可以通过Hystrix的API调用config API动态修改而不用重启服务,不常用。

代码设置示例:

@HystrixCommand(fallbackMethod = "threadPoolFallback",commandKey = "testThreadPool",
        groupKey = "testThreadPool", threadPoolKey = "testThreadPool",threadPoolProperties = {
        //核心线程数,线程池最大并发数
        @HystrixProperty(name=HystrixPropertiesManager.CORE_SIZE,value = "10"),
        //最大线程数,默认为-1,即不限制,如果设置为正数
        //等待队列将从同步队列synchronousQueue转换为阻塞队列LinkedBlockingQueue
        @HystrixProperty(name=HystrixPropertiesManager.MAX_QUEUE_SIZE,value = "100"),
        //设置拒绝请求的临界值,默认值为5,此属性是配合阻塞队列使用的
        @HystrixProperty(name=HystrixPropertiesManager.QUEUE_SIZE_REJECTION_THRESHOLD,value = "80"),
})
@GetMapping("/threadPool")
public String threadPool() throws Exception{
    Thread.sleep(10000);
    return "success";
}

public String threadPoolFallback(){
    return "threadPoolFallback server down";
}

3.2、信号量隔离

它的目的是为每个微服务限流,能够限制并发的请求数。信号量隔离使用的其实就是并发框架中的semaphore信号量类,我们通过设定semaphore的信号数,相当于设置了此微服务的并发请求数,每一个微服务进来,都会执行semaphore的acquire方法来获得信号量,同时,返回结果后执行release方法释放信号量。

所谓信号量隔离,就是设置一个并发处理的最大极值。当并发请求数超过极值时,通过fallback返回托底数据,保证服务的完整性

简单来说信号量的资源隔离是一个开关的作用(也可以理解为一个计数器),比如:服务A的信号量大小为10,那同时只允许有10个tomcat线程来访问服务A,其他请求都会被拒绝,从而达到资源隔离和限流保护的作用。

代码设置示例:

@HystrixCommand(fallbackMethod = "semaphoreFallback",commandProperties = {
        //设置隔离方式,默认为线程池隔离
        @HystrixProperty(name=HystrixPropertiesManager.EXECUTION_ISOLATION_STRATEGY,value = "SEMAPHORE"),
        //设置最大并发数
        @HystrixProperty(name=HystrixPropertiesManager.EXECUTION_ISOLATION_SEMAPHORE_MAX_CONCURRENT_REQUESTS,value = "10"),
})
@GetMapping("/semaphore")
public String semaphore() throws Exception{
    if(System.currentTimeMillis()%2==0){
        Thread.sleep(10000);
    }
    return "success";
}

public String semaphoreFallback(){
    return "semaphore server down";
}

3.3、两种隔离方式的优缺点

3.3.1、线程池隔离:(实现原理:各个服务独立的线程池)

优点:线程是独立的,与其他服务接口线程互不影响,独立的线程也有并发处理的能力

      支持超时设置、支持异步处理

缺点:占用CPU的资源开销较大,每个命令涉及到调度、CPU计算、队列、上下文切换等,   这些操作都是在独立的线程上完成的,所以性能较低。

3.3.2、信号量隔离:(实现原理:共用线程池,使用计数器进行限流)

优点:资源开销相对较小(共用web容器里的线程池)

缺点:不支持超时设置,依赖于系统/socket连接超时。也不支持异步

3.4、两种隔离方式的使用选择

3.4.1、线程池隔离

业务复杂,请求并发量大,并且服务耗时长(一般是计算量大或者访问数据库或者RPC远程调用):采用线程池隔离,这样的话,可以保证大量的容器线程可用,不会由于服务原因,一直处于阻塞或者等待状态,快速失败返回。

3.4.2、信号量隔离

业务简单,请求并发量大,并且服务耗时短(一般是计算量小,或访问缓存,或者不涉及远程调用和第三方请求):采用信号量隔离:因为这类服务的返回往往非常快,不会占用容器线程太长时间,并且减少了线程切换的一些开销,提高了缓存服务的效率

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

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

相关文章

公有云云硬盘(EBS)有效范围内扩容/存储规格变更指导手册

一、背景 某公有云环境中,云主机直连的云硬盘存储某数据库数据,随着数据的积累,大约10亿多条数据,云硬盘急需扩容,但前期规划云硬盘未开启lvm卷,且当前存储容量未达EBS容量限制,最大可达32T,因此觉得采用EBS规格变更的方式来实现主机存储的扩容; 二、注意点: 1)过…

Matlab入门教程|002球的体积问题

写给Matlab小白的教程。如果你已经安装了Matlab&#xff0c;手头有一堆Matlab教程&#xff0c;面对书中一堆术语和命令不知所措&#xff0c;那么&#xff0c;请看本教程&#xff0c;从零开始&#xff0c;快速上手。 1 本文要点 初等代数计算&#xff1a;求函数值&#xff0c;求…

算法小技巧:空间换时间,时间换空间?

前言&#xff1a;小细节&#xff0c;大道理&#xff0c;思路在前&#xff0c;代码在后。 名词解释&#xff1a; 算法效率&#xff1a;往往由时间效率和空间效率两个方面决定。 时间效率&#xff1a;时间效率被称为时间复杂度&#xff0c;指的是算法执行过程耗费的时间…

英文论文(sci)解读复现【NO.10】宁夏酿酒葡萄病虫害智能检测平台设计

此前出了目标检测算法改进专栏&#xff0c;但是对于应用于什么场景&#xff0c;需要什么改进方法对应与自己的应用场景有效果&#xff0c;并且多少改进点能发什么水平的文章&#xff0c;为解决大家的困惑&#xff0c;此系列文章旨在给大家解读发表高水平学术期刊中的 SCI论文&a…

龙蜥产品生态总监做客 InfoQ:后 CentOS 时代,国产操作系统能否扛起大旗?

随着 CentOS 全面停服即将进入尾声&#xff0c;企业选择一款既可保障系统稳定运行&#xff0c;又可提供专业技术支持的操作系统迁移显得尤为重要。那么&#xff0c;现存的 CentOS 以及衍生版用户或将面临哪些风险&#xff1f;一套完整的迁移方案应该包括哪些步骤&#xff1f;在…

Shap-E:3D资产的生成式AI大模型

OpenAI 刚刚发布了 Shap-E&#xff0c;这是一种基于文本提示和图像创建 3D 资产的生成模型&#xff0c;能够生成带纹理的网格和神经辐射场 &#xff0c;从而实现各种 3D 输出。 推荐&#xff1a;用 NSDT设计器 快速搭建可编程3D场景。 在本教程中&#xff0c;我们将引导你在 Go…

【云原生进阶之PaaS中间件】第一章Redis-2.3.1主从复制部署模式

1 部署架构 Redis在日常部署的时候&#xff0c;可以有多种部署模式&#xff1a;单机、主从、哨兵、集群&#xff08;分区分片&#xff09;&#xff0c;因此本文将对上面这四种模式进行详细的讲解&#xff0c;特别是集群模式将进行最细致的讲解&#xff08;现行普遍使用的方式&a…

Cpolar内网穿透本地MariaDB数据库

Cpolar内网穿透本地MariaDB数据库 cpolar内网穿透本地MariaDB数据库&#xff0c;实现外公网环境下使用navicat图形化工具远程连接本地内网的MariaDB数据库 配置MariaDB数据库 安装MariaDB数据库 进入MariaDB数据库官网https://mariadb.com/downloads/community/,然后下载相应的…

知行之桥2023版本发布

我们很高兴地宣布知行之桥EDI系统2023版本正式发布。本次发布的知行之桥2023版&#xff08;版本号&#xff1a;8518&#xff09;包含了新的企业级功能&#xff0c;以下是新版本的一些亮点&#xff1a; 1.新增了概览页面&#xff0c;支持查看消息的整个生命周期&#xff0c;添加…

MySQL基础(三十三)MySQL事务日志

事务有4种特性&#xff1a;原子性、一致性、隔离性和持久性。那么事务的四种特性到底是基于什么机制实现呢&#xff1f; 事务的隔离性由 锁机制 实现。而事务的原子性、一致性和持久性由事务的 redo 日志和undo 日志来保证。 REDO LOG 称为 重做日志 &#xff0c;提供再写入操…

深度学习之神经网络是如何自行学习的?

大家好&#xff0c;我是带我去滑雪&#xff01; 深度学习算法是一种神经网络&#xff0c;而神经网络就是数据结构的图形结构&#xff0c;函数集的运算是向量和矩阵运算&#xff0c;调整函数集的参数需要使用微分和偏微分来找出最优解。深度学习可以通过几何学来进行解释&#x…

Excel的“升级版本”, 终于在2023年找到,替代Office包里的Access

Access的用户基数很大 首先&#xff0c;你要明白的是&#xff0c;Access是一款办公软件&#xff0c;其次才是一个数据库&#xff01; 之所以一直以来被微软放在Office的包里&#xff0c;没有被淘汰&#xff0c;是因为Access在Excel处理大数据时崩溃的时候&#xff0c;面向很多…

本机连接aws的ec2时报错:所选用户的用户密钥未在远程主机上注册

引言 由于工作的需要&#xff0c;所以需要去学习下AWS相关的知识&#xff0c;所以自己注册了一个AWS的账号去进行学习。 问题发现 按照启动ec2实例的步骤&#xff1a;选择镜像->选择系统配置->配置密钥对->配置安全组->设置存储卷大小->启动实例 在上述操作…

237:vue+openlayers绘制多边形,生成geojson数据,计算出面积

第237个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+openlayers中绘制多边形形,利用Geojson的writeFeatures,来生成geojson格式的数据,然后使用turf.area来计算面积。这里面着重解决了在3857的坐标系下,将geojson文件的坐标转化为4326的状态。 直接复制下面的 vue…

短视频矩阵源码系统

短视频矩阵源码系统开发要则&#xff1a; 1. 需求分析&#xff1a;对短视频平台的需求进行全面分析&#xff0c;确立系统开发目标和方向。 2. 技术选型&#xff1a;选用最适合的技术开发短视频矩阵系统&#xff0c;如前端框架、数据库、服务器等。 3. 系统设计&#xff1a;按…

EBAZ4205踩坑记录

这块ZYNQ-7000的二手板子很经典&#xff0c;最早在2019年被人发现。板子资源还是不错的&#xff0c;共引出了3*14个PL侧的IO&#xff0c;可用来研究PL、PS-PL交互&#xff0c;学习PS侧SDK&#xff0c;Linux开发。唯一的遗憾是Bank电压固定为3.3V&#xff0c;没法玩LVDS。 参考…

golang中的websocket,使用wireshark抓包

websocket 是一个长连接协议&#xff0c;全双工通信&#xff0c;主要应用在及时通信&#xff1a;实时聊天&#xff0c;游戏&#xff0c;在线文档等等。 简单示例 客户端 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8&quo…

分支语句和循环语句

控制语句&#xff1a;用于控制程序的执行流程&#xff0c;以实现程序的各种结构方式&#xff0c;它们由特定的语句定义符组成&#xff0c;C语言有9种控制语句&#xff0c;可分为三类&#xff1a; 条件判断语句也叫分支语句&#xff1a;if语句&#xff0c;switch语句&#xff1b…

【基础算法】贪心算法基础

系列综述&#xff1a; &#x1f49e;目的&#xff1a;本系列是个人整理为了秋招算法的&#xff0c;整理期间苛求每个知识点&#xff0c;平衡理解简易度与深入程度。 &#x1f970;来源&#xff1a;材料主要源于代码随想录进行的&#xff0c;每个算法代码参考leetcode高赞回答和…

对SRC逻辑漏洞挖掘的思考

对SRC逻辑漏洞挖掘的思考 1.限制购买逻辑漏洞一人一单限制差价活动购买限制 2.支付类逻辑漏洞3.接口未授权逻辑漏洞4.越权类逻辑漏洞5.修改返回包进入后台6.任意用户注册7.重置任意用户 1.限制购买逻辑漏洞 一人一单限制 很多厂商都会搞一些活动&#xff0c;在享受优惠的时候…