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 {
    @Autowired
    OrderService orderService;
    @Autowired
    FallbackHandle 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具体的熔断配置以及原理,下一篇文章继续。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

火星探测器背后的人工智能:从原理到实战的强化学习

目录 一、引言二、强化学习基础强化学习的基本概念主要算法概述Q-Learning 示例代码 环境建模与奖励设计 三、火星探测器任务分析任务需求与挑战探测器环境建模目标设定与奖励机制层层递进的关系 四、强化学习模型设计模型架构概述DQN架构核心组件&#xff1a; 状态、动作与奖励…

RT-Thread基于STM32H743的网络通信调试

使用STM32H743开发网络通信&#xff0c;本以为会很简单&#xff0c;实际却遇到好多问题&#xff0c;记录一下&#xff0c;以备后续查看。 1.新建工程&#xff0c;系统版本选择的是4.1.1&#xff0c;芯片型号是STM32H743IIK6. 2.修改系统时钟&#xff0c;使用外部25MHz晶振&…

C++类与对象(1)—初步认识

目录 一、面向过程和面向对象 二、类 1、定义 2、类的两种定义方式 3、访问限定符 4、命名规范化 5、类的实例化 6、计算类对象的大小 7、存储方式 三、this指针 1、定义 2、存储位置 3、辨析 四、封装好处 一、面向过程和面向对象 C语言是面向过程的&#xf…

记录联系ThinkPad T490扬声器无声音但插耳机有声音的解决办法

型号&#xff1a;联想ThinkPad T490&#xff0c;系统Win10 64位。 现象&#xff1a;扬声器无声音&#xff0c;插耳机有声音。且右下角小喇叭正常&#xff0c;设备管理器中驱动显示一切也都正常&#xff08;无黄色小叹号&#xff09;。 解决办法&#xff1a; 尝试了各种方法&a…

基础课7——数据预处理

在智能客服系统中&#xff0c;数据预处理是进行自然语言处理&#xff08;NLP&#xff09;的关键步骤之一。它是对用户输入的文本数据进行分析、处理和转换的过程&#xff0c;目的是将原始文本数据转化为计算机可理解的语言&#xff0c;为后续的智能回答提供支持。 1.什么是数据…

数据结构-插入排序+希尔排序+选择排序

目录 1.插入排序 插入排序的时间复杂度&#xff1a; 2.希尔排序 希尔排序的时间复杂度&#xff1a; 3.选择排序 选择排序的时间复杂度&#xff1a; 所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的…

基于SpringBoot+MyBatis-Plus的教务管理系统

基于SpringBootMyBatis-Plus的教务管理系统 教务管理系统开发技术功能模块代码结构数据库设计运行截图源码获取 教务管理系统 欢迎访问此博客&#xff0c;是否为自己的毕业设计而担忧呢&#xff1f;是否感觉自己的时间不够做毕业设计呢&#xff1f;那你不妨看一下下面的文章&a…

CUDA编程一、基本概念和cuda向量加法

目录 一、cuda编程的基本概念入门 1、GPU架构和存储结构 2、cuda编程模型 3、cuda编程流程 二、cuda向量加法实践 1、代码实现 2、代码运行和结果 有一段时间对模型加速比较感兴趣&#xff0c;其中的一块儿内容就是使用C和cuda算子优化之类一起给模型推理提速。之前一直…

2023年最新软件安装管家目录

最新软件安装管家目录 软件目录 ①【电脑办公】电脑系统&#xff08;直接安装&#xff09;Win7Win8Win10OfficeOffice激活office2003office2007office2010office2013office2016office2019office365office2021wps2021Projectproject2007project2010project2016project2019projec…

python基础练习题库实验3

题目1 编写一个程序&#xff0c;根据以下定价计算成本。 Number of itemsCost1-50每件3美元 邮费: 10美元超过50每件2美元 邮寄&#xff1a;免费 举个例子&#xff1a; 代码 items_num input("Enter the number of items: ") items_num_i int(items_num) ite…

JVM虚拟机:通过日志学习PS+PO垃圾回收器

我们刚才设置参数的时候看到了-XXPrintGCDetails表示输出详细的GC处理日志&#xff0c;那么我们如何理解这个日志呢&#xff1f;日志是有规则的&#xff0c;我们需要按照这个规则来理解日志中的内容&#xff0c;它有两个格式&#xff0c;一个格式是GC的格式&#xff08;新生代&…

Leetcode—206.反转链表【简单】

2023每日刷题&#xff08;三十三&#xff09; Leetcode—206.反转链表 头插法实现代码 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ struct ListNode* reverseList(struct ListNode* head) {if(head NULL…

PaddlePaddle:开源深度学习平台

深度学习作为人工智能领域的重要分支&#xff0c;正在全球范围内得到广泛应用。而在构建和训练深度学习模型时&#xff0c;选择一个高效、易用且功能强大的开源平台是至关重要的。PaddlePaddle&#xff08;即飞桨&#xff09;作为国内领先的深度学习平台&#xff0c;一直以来都…

13.真刀实枪做项目---博客系统(页面设计)

文章目录 1.预期效果1.1博客列表页效果1.2博客详情页效果1.3博客登陆页效果1.4博客编辑页效果 2.实现博客列表页2.1实现导航栏2.2实现版心2.3实现个人信息2.4实现博客列表2.5博客列表页完整代码 3.实现博客正文页3.1引入导航栏3.2引入版心3.3引入个人信息3.4实现博客正文3.5博客…

C++17中std::variant的使用

可变参数模板类std::variant表示类型安全联合体(type-safe union)。std::variant的实例在任何给定时间要么保存其替代类型之一的值&#xff0c;要么在错误的情况下无值。 与union一样&#xff0c;如果std::variant保存某个对象类型T的值&#xff0c;则T的对象表示形式将直…

【音视频基础】AVI文件格式

AVI文件采用的是RIFF文件结构方式。波形音频wave&#xff0c;MIDI和数字视频AVI都采用这种格式存储。 AVI文件的整体结构如下图所示 构造RIFF文件的基本单元叫做数据块&#xff08;Chunk&#xff09;&#xff0c;每个数据块包含3个部分 4字节的数据块标记&#xff08;或者叫…

动 态 规 划

一、&#xff08;what&#xff1f;&#xff09; 二、&#xff08;why&#xff1f;&#xff09; 三、&#xff08;how&#xff1f;&#xff09; 四、典型例题分析&#xff1a; 例题1&#xff1a;神奇的兔子序列 输入&#xff1a;月数 输出&#xff1a;兔子数 思路&#xff1…

基于机器学习的居民消费影响因子分析预测

项目视频讲解: 基于机器学习的居民消费影响因子分析预测_哔哩哔哩_bilibili 主要工作内容: 完整代码: import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns import missingno as msno import warnings warnings.filterwarnin…

Python------列表 集合 字典 推导式(本文以 集合为主)

推导式&#xff1a; 推导式comprehensions&#xff08;又称解析式&#xff09;&#xff0c;是Python的一种独有特性。推导式是可以从一个数据序列 构建 另一个 新的数据序列&#xff08;一个有规律的列表或控制一个有规律列表&#xff09;的结构体。 共有三种推导&#xff…

二十三种设计模式全面解析-当你的对象需要知道其他对象的状态变化时,观察者模式是你的救星!

在软件设计的世界中&#xff0c;有一种设计模式以其简洁而强大的特性闪耀着光芒&#xff0c;它就是——观察者模式&#xff08;Observer Pattern&#xff09;。这个模式它定义了一种一对多的依赖关系&#xff0c;让多个观察者对象同时监听某一个主题对象&#xff0c;为我们创造…