Hystrix 简单聊聊断路器/熔断器

news2024/11/18 11:40:41

本文首发自「慕课网」,想了解更多IT干货内容,程序员圈内热闻,欢迎关注"慕课网"!

作者:风间影月|慕课网讲师 


什么是Hystrix

Hystrix 在SpringCloud中负责服务熔断服务降级的作用。
Hystrix 存在的目的也是为了防止过多超时导致系统瘫痪。比如多个服务之间的相互调用,如下图:

订单->商品->积分->日志
订单->支付->日志
商品->风控->日志
服务之间相互调用,假设某个链路上的某个服务比如日志服务超时了,不可被调用,那么其他的服务全部卡死,导致崩溃。

举一个生活中的例子:


在家里,我开了很多电器,这个时候如果没有一个保护装置的话,由于某个电器过载,最终会导致整个电路断掉,那么每户人家肯定会有一个装置叫做保险丝,那么Hystrix断路器就起到了保险丝的作用,他可以保护整个系统。
Hystrix在分布式系统或者微服务中,一旦出现了超时或者依赖服务不可用调用失败异常等情况,他能够保证整个系统不会整体宕机崩溃,从而提高整个系统的健壮性。

Hystrix的原理就是当某一个服务发生故障的时候,这个时候是不会有任何的正常响应的,但是通过Hystrix可以返回一个备用响应,也就是所谓的backup,如此一来,发生异常的系统就不会造成不必要的超时等异常现象,这就好比打篮球,上场必须要5人,但是如果有人受伤要下场,这个时候就必须要有backup球员,如果没有,这个球队很难进行比赛了。

简单一句话总结,就是Hystrix可以保证在众多微服务中一个服务出现了问题不会引发整体系统奔溃的一个开源组件。

服务熔断

熔断是一种微服务链路的保护机制,当某个服务(依赖)不可用/宕机/超时/异常的时候,会进行服务的熔断(是一个开关,会开启),这个发生故障的节点就被熔断了也就是不可用,不会再让用户调用到,那么此时就需要降级,来直接会返回一个错误的异常响应信息。当这个节点OK恢复了,hystrix会检测到,然后再把他恢复到整个链路。

熔断机制在很多行业里都有,比如股市,金融行业,都是为了更好更有效的控制,把损失控制在一定的范围内。

代码演示

  • pom 中加入依赖
<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
		</dependency>
  • 启动类开启熔断器
@EnableCircuitBreaker
  • 编写错误的controller
// 一旦服务调用失败,发生异常,会调用@HystrixCommand中的[graceDisplay]方法,这个方法就是兜底方法
    @HystrixCommand(fallbackMethod = "graceDisplay")
    public String helloHystrix() {

        Object o = "Hello hystrix~";

        int a = 1 / 0;

        return "Hello hystrix~";
    }

    public String graceDisplay() {
        return "Hello another me~";
    }
  • 测试:
    1. 如果正常访问,显示 Hello hystrix~

    2. 发生异常熔断,则展示:

服务器降级

当某个服务资源不够的时候,可以启用降级处理。

举一个例子,如下图:


假设我们家里用很多电器,其他电器正在使用中并且占用的电流啊电压啥的很大,空调我这个时候可以不用,把资源给到其他的电器,这时我们是直接把空调插头拔出,区别于熔断,熔断的话是发生异常后和谐的响应信息,而降级是我把这个服务关停了,随后在响应给用户。需要注意,由于服务关闭了,所以响应是发生在调用方的,也就是客户端,比如图中的电热水壶微波炉。当电压电流恢复后,我们再把空调插头插上即可,那么这就是降级的一种方式。

那么熔断和降级的异同点是啥呢?

  • 相同点:
    • 都是为了提升系统的可靠性
    • 都为了正确的返回响应给用户
  • 不同点:
    • 熔断:被调用的服务方(下游)发生故障导致
    • 降级:全局整体服务负载过高,有效调动资源服务,由调用方(上游)控制

熔断解耦分离

当使用@HystrixCommand的时候,每有一个controller的接口api,就会有一个熔断方法,这是成倍的增长的,数量会很多,维护不方便,所以需要解耦开来。而且,当我们关闭不用的微服务时,上游还是会调用下游,所以我们需要在上游服务这块,去增加降级的方法,如果服务无法调用,则调用上游服务中的降级方法即可。并且下游服务如果被我们关闭,上游的调用还是可以有响应给用户的。

@Component
public class HystrixFactoryCallback implements FallbackFactory<HystrixFactoryControllerApi> {

    @Override
    public HystrixFactoryControllerApi create(Throwable throwable) {
        return new HystrixFactoryControllerApi() {
            @Override
            public String helloFactory() {
                return "优雅的处理,只在客户端直接返回,下游服务关闭不影响";
            }
        };
    }
}


@FeignClient(value = EurekaServiceList.SERVICE_HYSTRIX, fallbackFactory = HystrixFactoryCallback.class)
public interface HystrixFactoryControllerApi {

    // 当前类的所有接口只要有问题都会被HystrixFactoryCallback给处理

// 测试hystrix降级解耦
    @GetMapping("/helloFactory")
    public String helloFactory();
}

spring:
  main:
    allow-bean-definition-overriding: true    # 允许 @FeignClient 同名

feign:
  hystrix:
    enabled: true   # 开启@FeignClient的降级功能 fallbackFactory

上游:


    @Autowired
    HystrixFactoryControllerApi hystrixFactoryControllerApi;
    
        @GetMapping("/testHystrixFactoryApi")
    public Object testHystrixFactoryApi() {
        String result = hystrixFactoryControllerApi.helloFactory();
        return result;
    }

下游:

@RestController
public class FactoryController implements HystrixFactoryControllerApi {

    @Override
    public String helloFactory() {
        Object o = "Hello hystrix factory~";

        int a = 1 / 0;

        return "Hello hystrix factory~";
    }
}

简单总结一下

熔断:当一个服务发生故障异常,这个时候熔断当前整个服务,把这个服务变的不可被访问,而不是客户端请求这个服务的时候一直处于超时。
降级:当服务熔断后,我们需要提供新的一个兜底接口返回响应数据,如此一来,客户端能够友好的接受到响应消息。


欢迎关注「慕课网」帐号,我们会一直坚持内容原创,提供IT圈优质内容,分享干货知识,大家一起共同成长吧!

本文原创发布于慕课网 ,转载请注明出处,谢谢合作

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

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

相关文章

从 Elasticsearch 到 Apache Doris,10 倍性价比的新一代日志存储分析平台

作者介绍&#xff1a;肖康&#xff0c;SelectDB 技术副总裁 导语 日志数据的处理与分析是最典型的大数据分析场景之一&#xff0c;过去业内以 Elasticsearch 和 Grafana Loki 为代表的两类架构难以同时兼顾高吞吐实时写入、低成本海量存储、实时文本检索的需求。Apache Doris…

114-Linux_mysql基本操作

文章目录 一.数据库的基本操作1.数据库的登录及退出(1)连接数据库&#xff1a;(2)退出数据库 2.查看所有数据库3.显示时间4.显示数据库版本5.创建数据库6.查看创建数据库的语句7.查看当前使用的数据库8.查看当前用户9.使用某个数据库10.删除数据库 一.数据库的基本操作 1.数据…

训练计划安排(练一休一训练分化+倒金字塔训练法)

目录 练一休一训练分化每次训练的组数12-15组 &#xff08;4-5个动作&#xff09;QA 倒金字塔训练法倒金字塔热身正式组常见误区&#xff1a; 训练补剂bcaa咖啡因肌酸蛋白粉 如何降低皮质醇水平如何提升睾酮水平文献出处睡眠8h摄入适量脂肪&#xff08;0.8g每公斤体重&#xff…

【机器学习】集成学习—Boosting—GBM(Gradient Boosting Machine)解析

【机器学习】集成学习—Boosting—GBM&#xff08;Gradient Boosting Machine&#xff09;解析 文章目录 【机器学习】集成学习—Boosting—GBM&#xff08;Gradient Boosting Machine&#xff09;解析1. 介绍2. Boosting2.1 1. 强 / 弱学习器2.1.2 AdaBoost 3. GBM3.1 GBM 特例…

如何利用ChatGPT进行论文润色-ChatGPT润色文章怎么样

ChatGPT润色文章怎么样&#xff1f; ChatGPT可以润色文章&#xff0c;使用其润色功能可以为用户提供更加整洁、清晰、文采动人的文本。但需要注意以下几点&#xff1a; 需要保持文本的一致性和完整性。当使用ChatGPT进行润色时&#xff0c;需要注意保持文本的一致性和完整性。…

单调栈的学习

文章目录 单调栈的学习什么是单调栈&#xff1f;单调栈模板暴力解法单调栈解法 单调栈的简单变形1.[496. 下一个更大元素 I](https://leetcode.cn/problems/next-greater-element-i/)2.[739. 每日温度](https://leetcode.cn/problems/daily-temperatures/)3.[503. 下一个更大元…

Kali Linux 使用远程桌面连接——xrdpxfce

[笔者系统版本] [Kali]: Kali Linux 2023.1 [Kernel]: kernel 6.1.0 [Desktop]: Xfce 4.18.1 1. 前言 在 Windows 中我们会经常使用到远程桌面这样便利的工具&#xff0c;让我们随时随地都可以使用自己想要使用的电脑&#xff0c;或者同时使用多台设备&#xff0c;那么本文就将…

open3d 源码阅读image_processing.py

目录 1. open3d.geometry.Image和numpy互转 2. 对open3d.geometry.Image进行高斯过滤 3. 高斯金字塔过滤 4. sobel过滤 5. 可视化o3d.geometry.Image 1. open3d.geometry.Image和numpy互转 import numpy as np import matplotlib.pyplot as plt import matplotlib.image a…

Midjourney从入门到精通

前言 什么是AI绘画 AI 绘画&#xff0c;顾名思义就是利用人工智能进行绘画&#xff0c;是人工智能生成内容&#xff08;AIGC&#xff09;的一个应用场景。其主要原理就是收集大量已有作品数据&#xff0c;通过算法对它们进行解析&#xff0c;最后再生成新作品&#xff0c;而算…

vue框架快速入门

vue 1、第一个Vue程序1.1、什么是Vue程序1.2、为什么要使用MVVM1.3、Vue1.4、第一个vue程序 2、基础语法2.1、v-bind2.2、v-if&#xff0c; v-else2.3、v-for2.4、v-on 3、Vue表单双绑、组件3.1、什么是双向数据绑定3.2、在表单中使用双向数据绑定3.3、什么是组件 4、Axios异步…

NixOS Legacy Boot(MBR) VmwareWorkstation安装向导

NixOS & Legacy Boot(MBR) VmwareWorkstation安装向导 目录 NixOS & Legacy Boot(MBR) VmwareWorkstation安装向导1. 下载镜像2. 创建空白虚拟机3. 使用命令行安装 NixOS3.1 Legacy Boot(MBR)3.2 格式化 4. configration.nix 配置文件5. 部署NixOS6. 部分教育站镜像源集…

Maven 3.9.1下载安装配置一条龙(无压力)亲测

这里写自定义目录标题 前言一、下载 Apache Maven 3.9.11.1、请先检查自己的IDEA是否有这个条件&#xff0c;是否兼容1.2、Maven下载 二、Windows安装配置Maven2.1、解压2.2、新建 repository 本地仓库2.3、配置环境变量MAVEN_HOME 软件路径M2_HOME 本地仓库路径配置Path2.3.1新…

关于maven

一、maven是什么 一个java项目构建工具 二、maven的作用 &#xff08;1&#xff09;依赖管理 不同框架整合&#xff0c;互相依赖jar包版本不同&#xff0c;版本不一样&#xff0c;程序跑起来就会报错。用maven管理jar包。 &#xff08;2&#xff09;跨平台构建项目 linux服…

数字信号处理3:A/D、D/A转换

信号这个东西&#xff0c;我们是实际应用中用的大多都是模拟信号&#xff0c;比如说语音、地震、雷达、声纳信号&#xff0c;这些都是模拟信号&#xff0c;但是&#xff0c;计算机想要通过数学方法处理模拟信号&#xff0c;就要先将模拟信号转换成具有有限精度的数字序列&#…

L4公司进军辅助驾驶,放话无图也能跑遍中国

作者 | Amy 编辑 | 德新 高阶智能驾驶走向规模量产&#xff0c;高精地图成为关键的门槛之一。今年&#xff0c;多家车企和智驾公司都喊出「不依赖高精地图&#xff0c;快速大规模落地」的口号。 华为、小鹏、元戎以及毫末等&#xff0c;可能是最快在国内量产 无高精图智…

TCP/IP网络编程(一)

TCP/IP网络编程读书笔记 第1章 理解网络编程和套接字1.1 理解网络编程和套接字1.1.1 构建打电话套接字1.1.2 编写 Hello World 套接字程序 1.2 基于Linux的文件操作1.2.1 底层访问和文件描述符1.2.2 打开文件1.2.3 关闭文件1.2.4 将数据写入文件1.2.5 读取文件中的数据1.2.6 文…

AI仿写软件-仿写文章生成器

AI仿写软件&#xff1a;高效出色的营销利器 作为互联网时代的营销人员&#xff0c;我们不仅需要品牌意识&#xff0c;还必须深谙营销技巧。万恶的时限压力使得我们不得不在有限的时间内输出更多的文本内容&#xff0c;以便吸引更多的关注。那么&#xff0c;如何解决这个问题呢…

C++网络基础知识面试题2

目录 1、使用TCP的常见协议有哪些&#xff1f;使用UDP的常见协议有哪些&#xff1f;简单说几个 2、如何判断访问目标地址的网络是通的&#xff1f;如何简单地查看到目标地址的网络是否有丢包和抖动&#xff1f; 3、如果知道目标服务器的服务端口有没有开启&#xff1f; 4、…

【NodeJs】使用Express框架快速搭建一个web网站

如果电脑有安装使用Nodejs&#xff0c;用得次数少的话&#xff0c;忘了怎么弄&#xff0c;可以看看这个文章&#xff0c;按照步骤&#xff0c;能快速搭建一个web网站服务器&#xff0c; 首先&#xff0c;你需要保证电脑系统有安装了Node.js&#xff0c;然后可以用VsCode开发工…

Java多线程基础概述

简述多线程&#xff1a; 是指从软件或者硬件上实现多个线程并发执行的技术。 具有多线程能力的计算机因有硬件支持而能够在同一时间执行多个线程&#xff0c;提升性能。 正式着手代码前&#xff0c;需要先理清4个概念&#xff1a;并发&#xff0c;并行&#xff0c;进程&#…