Spring Cloud -熔断器Hystrix

为什么需要服务降级或熔断

微服务架构与传统架构的一个显著区别就是服务变多了,任何一个服务调用失败、或者服务不可用,都会对整个应用造成影响。比如前段时间阿里云整体业务不可用,有多方猜测就是阿里云的某一个关键服务不可用导致的。

服务不可用在某种意义上来说是不可避免的,比如你的业务由20个微服务组成,确保20个服务中的任何一个在7*24小时的任何一个时间点都可用是很难做到的,在这个语意下,“确保任何一个服务发生故障的时候造成的影响最小化”才是更有意义的事情。

微服务环境下,服务与服务之间存在错综复杂的依赖关系,其中一个服务发生故障,很可能导致依赖他的其他服务也发生故障----这些依赖服务本身原本应该是健康的,只是由于被依赖的服务发生故障,调用发生故障的服务无法得到正确返回,从而导致健康服务本身也无法继续给其他服务提供正常服务。由此会导致故障的蔓延,在并发量非常大的情况下,这种故障蔓延会非常快,很可能最终导致整个业务的不可用。这就是人们常说的服务雪崩效应。

导致服务雪崩的一个重要原因,在大多数情况下并不是所有服务都依赖发生故障的服务,而是由于故障服务的其他若干依赖服务由于调用故障服务不能即使得到返回,在大并发量的业务场景下,被调用服务由于超时请求太多而占用掉应用有限的资源(比如Tomcat服务的并发线程数)从而导致依赖服务也发生故障(故障原因其实是超时调用导致的资源枯竭)------像多米诺骨牌一样,短时间之内故障迅速在应用中的所有服务或大部分服务中心蔓延,从而导致服务雪崩。

引用Hystrix官网的描述,服务正常时的情况:
在这里插入图片描述
当某一个服务发生延迟或故障时,某一个请求会被堵塞:
在这里插入图片描述
高并发场景下,多个请求会被堵塞:
在这里插入图片描述
最终会导致整个服务的瘫痪,而且会在应用中迅速蔓延,导致多个服务瘫痪从而应发服务雪崩。

服务降级或熔断机制是“服务雪崩”问题的有效解决方案。其目标就是在服务故障发生后,将影响降到最低:只影响故障服务自己、或者业务紧密相关的依赖服务,尽可能不影响其他服务。

Hystrix

What Is Hystrix?
In a distributed environment, inevitably some of the many service dependencies will fail. Hystrix is a library that helps you control the interactions between these distributed services by adding latency tolerance and fault tolerance logic. Hystrix does this by isolating points of access between the services, stopping cascading failures across them, and providing fallback options, all of which improve your system’s overall resiliency.

Hystrix能够在分布式环境中部分依赖服务发生故障的情况下通过提供延迟容忍及错误容忍的方法对故障服务进行隔离,从而阻止故障的蔓延,并同时可以提供fallback选项,Hystrix通过这些方案以提高应用系统的弹性。

目标:

Hystrix is designed to do the following:

  1. Give protection from and control over latency and failure from dependencies accessed (typically over the network) via third-party client libraries.
  2. Stop cascading failures in a complex distributed system.
  3. Fail fast and rapidly recover.
  4. Fallback and gracefully degrade when possible.
  5. Enable near real-time monitoring, alerting, and operational control.

Hystrix的目标:保护系统避免依赖服务之间发生故障蔓延,快速错误及快速恢复、fallback机制、准实时的服务监控。

以上内容来自于Hystrix官网。

虽然Hystrix已经遭到Spring Cloud的抛弃,其实可能也是因为NetFlix很早以前就停止了对Hystrix的更新。但是目前采用Hystrix作为熔断方案的微服务应用也不在少数,另外,Hystrix毕竟在Spring Cloud微服务版图上曾经风靡一时,还是值得花一点时间去研究学习一下的。

Hystrix配置

还是以我们前面有关Spring Cloud的几篇文章为基础,Ereka注册中心、userservice、orderservice的项目代码已经创建了,参考Spring Cloud应用- Eureka原理、搭建、Spring cloud负载均衡 @LoadBalanced注解原理。已搭建过的源码这里就不再贴出了。

我们在userService和orderService中都引入Hystrix,首先在pom文件中引入依赖:

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>springCloud</artifactId><groupId>com.example</groupId><version>0.0.1-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>userService</artifactId><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target></properties><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.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix</artifactId><version>2.2.10.RELEASE</version></dependency></dependencies>
</project>

之后在模块的启动类中加入@EnableCircuitBreaker注解:


@SpringBootApplication
@EnableEurekaClient
@EnableCircuitBreaker
public class UserServiceApplication {public static void main(String[] args) {SpringApplication.run(UserServiceApplication.class);}
}

在controller上添加@HystrixCommand注解:

package com.example.controller;@RestController
@RequestMapping("/user")
@Slf4j
public class UserController {@Value("${server.port}")private String serverPort;@GetMapping("/getUser")@HystrixCommand(fallbackMethod = "fallback",commandProperties = {@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "3000")})public User getUser(){log.info("userController's getuser comming......");User user=new User();user.setName("zhangsan from:"+serverPort);try{log.info("I am sleepint for 10 second");Thread.sleep(10*1000);log.info("I weekup");}catch (Exception e){}return user;}public User fallback(){User user=new User();user.setName("userService服务异常");return user;}
}

@HystrixCommand有两个比较重要的参数:

  1. fallbackMethod:指定fallback方法
  2. commandProperties:通过@HystrixProperty注解指定超时时间

我们通过"execution.isolation.thread.timeoutInMilliseconds"参数指定服务超时时间为3秒。

在orderService服务中也做以上操作:引入依赖,添加注解以及fallback方法:


@RestController
@RequestMapping("/order")
@Slf4j
public class OrderController {@AutowiredOrderService orderService;@AutowiredFallbackHandle fallbackHandle;@GetMapping("/getOrder")@HystrixCommand(fallbackMethod = "fallback",commandProperties = {@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "5000")})public String getOrder(){log.info("Come here to get Order....===");return orderService.getOrder();}public String fallback(){return "orderService服务异常";}}

指定orderService的超时时间为5秒。

分析一下应用的逻辑:如果我们访问orderservice的getorder方法,会调用到userService的getUser方法,getUser方法中我们故意设置了sleep 10秒,这种情况下userService的get方法因为@HystrixCommand设置的等待时长为3秒、所以3秒后会出发fallback返回一个name为“userService服务异常”的user给orderService,此时尚未出发orderService的等待时长5秒,所以前端应该得到的是userService异常的消息。

测试验证:
在这里插入图片描述
我们把orderService等待时长设置为3秒、userService的等待时长设置为5秒,重新测试验证一下:

在这里插入图片描述

Hystrix对应用层异常的处理

对Hystrix来说,应用层发生异常和响应超时,其实都是服务不可用,都在Hystrix的服务职责范围之内,所以,都会出发熔断或服务降级机制。

测试发现,以上配置的情况下,应用层发生异常之后确实直接触发了Hystrix的服务降级、调用了fallback方法。但是同时有一个副作用是:应用层的异常被Hystrix吃掉了,应该是Hystrix捕获到异常并直接处理掉了之后直接调用fallback方法了,我们在应用后台的log中也没有看到应用的异常信息。

Hystrix熔断与服务降级

启用Hystrix之后,服务不可用的情况下调用fallback,就是服务降级:不能返回正常的服务,因此返回了一个fallback作为替代品。

其实服务降级也就是一种叫法,叫fail fast其实更科学,毕竟应用异常之后,能够以服务降级的方式、返回给调用方一个可接纳的降级服务,这种场景应该非常少见吧?调用方拿到的如果是fallback的返回,个人理解更多的作用是fail fast,快速告诉调用方:我挂了,你看着办。

熔断是在服务降级的前提下,多提供了一种对应用的保护,也就是在给一个fallback的同时触发断路开关:一段时间内(默认5s)Hystrix不会再调用故障服务了,即使在此之前故障服务已经恢复。

Hystrix具体的熔断配置以及原理,下一篇文章继续。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python_面向对象中的特殊成员

一、几个常见的特殊成员 # 都只是语法&#xff0c;无特殊意义 class Foo(object):def __init__(self,a1,a2):self.a1 a1self.a2 a2def __call__(self,*args,**kwargs):print(11111,args,kwargs)return 123def __getitem__(self, item):print(item)return 8def __setitem__(s…

【左程云算法全讲13】暴力递归

系列综述&#xff1a; &#x1f49e;目的&#xff1a;本系列是个人整理为了秋招面试的&#xff0c;整理期间苛求每个知识点&#xff0c;平衡理解简易度与深入程度。 &#x1f970;来源&#xff1a;材料主要源于左程云算法课程进行的&#xff0c;每个知识点的修正和深入主要参考…

csapp attack lab phase4

csapp attack lab phase4 每个gadget由一系列指令字节组成&#xff0c;最后一个字节为0xc3&#xff0c;编码为ret指令。 举个例子: 48 89 c7 是指令 movq %rax, %rdi&#xff0c; 对应的地址是0x400f15 0x3 也就是0x400f18, 是开始的指令位置。 例如&#xff1a; ret编码为0…

YOLO目标检测——无人机检测数据集下载分享【含对应voc、coco和yolo三种格式标签】

实际项目应用&#xff1a;无人机识别数据集说明&#xff1a;无人机检测数据集&#xff0c;真实场景的高质量图片数据&#xff0c;数据场景丰富标签说明&#xff1a;使用lableimg标注软件标注&#xff0c;标注框质量高&#xff0c;含voc(xml)、coco(json)和yolo(txt)三种格式标签…

MySQL数据库下载及安装教程(最最新版)

MySQL数据库下载及安装教程&#xff08;最最新版&#xff09; 一、下载mysql数据库二、安装Mysql三、验证是否安装成功&#xff08;一&#xff09;、命令提示符cmd窗口验证&#xff08;二&#xff09;、MySQL控制台验证 一、下载mysql数据库 进入MySQL官方网站&#xff08;htt…

CCF CSP认证 历年题目自练Day47

题目 试题编号&#xff1a; 201712-3 试题名称&#xff1a; Crontab 时间限制&#xff1a; 10.0s 内存限制&#xff1a; 256.0MB 样例输入 3 201711170032 201711222352 0 7 * * 1,3-5 get_up 30 23 * * Sat,Sun go_to_bed 15 12,18 * * * have_dinner 样例输出 201711170…

杭州信息安全

更轻量级的用户开销 (Lower online burden) 更灵活的通信模型 (Flexible metadata-private messaging) 一对一通信 >多对一、一对多通信 Group messaging Broadcast / anycast 元数据隐私保护技术在其他系统的推广

<Linux>(极简关键、省时省力)《Linux操作系统原理分析之进程管理2》(4)

《Linux操作系统原理分析之进程管理2》》&#xff08;4&#xff09; 3 进程管理3.5 P、V操作3.5.1 信号量3.5.2 信号量的应用3.5.3 进程同步机制 3.6 进程通信3.6.1 消息通信3.6.2 信箱通信 3.7 死锁3.7.1 死锁的定义3.7.2 死锁产生的必要条件3.7.3 死锁的预防3.7.4 死锁的避免…

flink入门

1.安装flink&#xff0c;启动flink 文档地址&#xff1a;Apache Flink 1.3-SNAPSHOT 中文文档: Apache Flink 中文文档 代码&#xff1a;GitHub - apache/flink: Apache Flink 2. 打开端口 端口号&#xff0c; 启动jar ### 切换到flink 目录bin下 [rootlocalhost ~]# cd /…

Vue3 toRef函数和toRefs函数

当我们在setup 中的以读取对象属性单独交出去时&#xff0c;我们会发现这样会丢失响应式&#xff1a; setup() {let person reactive({name: "张三",age: 18,job: {type: "前端",salary:10}})return {name: person.name,age: person.age,type: person.jo…

2023最新最全【CUDA Toolkit 12.3】下载安装零基础教程【附安装包】

官网地址&#xff1a;这里 CUDA是英伟达公司开发的一种并行计算平台和编程模型。它利用GPU的强大计算能力&#xff0c;加速各种数学和科学计算、数据分析、机器学习、计算机视觉等任务。CUDA包括CUDA编程语言、CUDA运行时库、NVIDIA显卡等组件。 CUDA的编写方式分为两种&…

Python aiohttp 完全指南:快速入门

aiohttp 就是 Python 中一款优秀的异步 Web 框架&#xff0c;它能够帮助我们构建高效的异步 Web 应用和异步 HTTP 客户端。在本文中&#xff0c;我们将深入探讨 aiohttp 是什么以及如何使用它&#xff0c;通过简单易懂的案例带领你理解异步编程&#xff0c;以及如何处理异步请求…