SpringCloud之Hystrix

Hystrix理解

熔断器本身是一种开关装置,用于在电路上保护线路过载。当线路中有电器发生短路时,熔断器能够及时切断故障电路,防止发生过载、发热甚至起火等严重后果。这种保护机制被借鉴到分布式系统的设计中,形成了类似Hystrix中的熔断器功能。熔断器在分布式系统中的作用主要是快速失败并返回错误,避免因为某个服务的故障导致整个系统的崩溃。

一、服务熔断

解决的问题
解决服务雪崩效应

1、导入hystrix依赖

<!--        熔断器 hystrix-->
 <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-hystrix -->
 <dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
 </dependency>

2、使用服务熔断机制

在服务提供者基础上添加服务熔断机制,提供者=>这里!!!

3、控制层部分代码


@RestController
public class DeptController {
    @Autowired
    private DeptService deptService;
    @GetMapping("/dept/get/{id}")
    // 使用@HystrixCommand注解标记get方法,并指定fallback方法
    @HystrixCommand(fallbackMethod = "hystrixGet")
    public Dept get(@PathVariable("id") Long id){
        Dept dept = deptService.queryById(id);
        if( dept == null ){
            throw  new RuntimeException("id=>"+id+",不存在该用户信息,或信息无法找到");
        }
        return dept;
    }

    // 备选方案
    public Dept hystrixGet(@PathVariable("id") Long id){
        Dept dept = new Dept();
        dept.setDeptno(id)
                .setDname("id=>"+id+",不存在该用户信息")
                .setDb_source("no this database in MySQL");
        return dept;
    }
}

4、Hystrix服务提供者启动类

@EnableCircuitBreaker 开启熔断服务

@SpringBootApplication
@EnableEurekaClient  // 自动在服务启动后自动注册到Eureka中
@EnableCircuitBreaker // 熔断支持
public class SpringBootProviderHystrixApplication_8001 {
    public static void main(String[] args) {
        SpringApplication.run(SpringBootProviderHystrixApplication_8001.class,args);
    }
    // 下面的代码是固定的 配合监控使用
    @Bean
    public ServletRegistrationBean hystrixMetricsStreamServlet(){
        ServletRegistrationBean registration = new ServletRegistrationBean(new HystrixMetricsStreamServlet());
        registration.addUrlMappings("/actuator/hystrix.stream");
        return registration;
    }
}

5、测试结果

启动3个eureka服务、3个提供者服务、1个消费者服务,只是参考也可以不启动这么多服务,也可以使用单机版。

在这里插入图片描述

启动服务

客户端请求访问一个数据库不存在的信息http://localhost/consumer/dept/get/11,使用的是集群服务,其中只有一个服务实现了熔断机制,总有一次会显示提示信息。其它两次提供者服务没有使用熔断机制是不会返回信息的。
在这里插入图片描述

二、服务降级

和客户端有关,服务端提供降级信息。

使用场景

使用Hystrix服务降级使用场景,当故障服务调用失败或超时时,Hystrix会快速返回这个备选响应,而不是让调用方长时间等待或抛出异常。这样,即使部分服务出现问题,整个系统依然能够正常运行,用户也能够得到及时的反馈,而不是无休止的等待。

在这里插入图片描述

创建降级处理工厂类

1、实现FallbackFactory 降级处理工厂类

// 服务降级
@Component
public class DeptClientServiceFallbackFactory implements FallbackFactory {
    // 也就是放回整个类
    @Override
    public DeptClientService create(Throwable throwable) {
        return new DeptClientService() {
            @Override
            public Dept get(Long id) {
                return new Dept().setDeptno(id)
                        .setDname("id=>"+id+"没有找到该信息 ,这是客户端提供的降级信息,这个服务现在已经被关闭")
                        .setDb_source("没有可获得的数据");
            }

            // 下面的方法也需要返回结果,懒没有实现
            @Override
            public List<Dept> getAll() {
                return null;
            }

            @Override
            public boolean add(Dept dept) {
                return false;
            }
        };
    }
}

2、使用Feign来调用Http请求

@FeignClient注解添加 fallbackFactory 参数返回之前创建的DeptClientServiceFallbackFactory类

// fallbackFactory 放回工厂,降级操作
@FeignClient(name = "SPRINGCLOUD-PROVIDER-DEPT",fallbackFactory = DeptClientServiceFallbackFactory.class)
public interface DeptClientService {

    @GetMapping("/dept/get/{id}")
    public Dept get(@PathVariable("id") Long id);

    @GetMapping("/dept/list")
    public List<Dept> getAll();

    @PostMapping("/dept/add")
    public boolean add(Dept dept);
}

3、消费者客户端application.yml

# 核心配置展示

# feign 配置 在客户端
feign:
  hystrix:
    enabled: true # feign 开启服务降级

4、Feign客户端启动类

@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients(basePackages = {"com.jyl.springcloud"}) // 扫描到springcloud-api中的sercie包下的DeptClientService接口
public class DeptConsumer_Feign_80 {
    public static void main(String[] args) {
        SpringApplication.run(DeptConsumer_Feign_80.class,args);
    }
}

5、测试结果

当将所有的提供者服务关闭之后。

在这里插入图片描述

服务端提供者关闭

客户端访问http://localhost/consumer/dept/get/1 ,依旧可以返回内容,不会服务崩掉。

在这里插入图片描述

三、监控页面

项目名称:springcloud-consumer-hystrix-dashboard

1、导入依赖

 <!--        熔断 hystrix-->
 <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-hystrix -->
 <dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
 </dependency>

 <!-- dashboard       -->
 <dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
     <version>1.4.6.RELEASE</version>
 </dependency>

服务端提供者必须导入下面依赖:

 <!--        解决 eureka Status  actuator/info 完善监控信息-->
 <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-actuator</artifactId>
 </dependency>

2、application.yml

修改端口号,避免端口冲突

server:
  port: 9001

3、客户端启动类

@EnableHystrixDashboard开启监控

@SpringBootApplication
@EnableHystrixDashboard // 开启监控
public class DeptConsumerDashboard_9001 {
    public static void main(String[] args) {
        SpringApplication.run(DeptConsumerDashboard_9001.class,args);
    }

}

4、服务端提供者启动类

需要在服务端启动类中添加ServletRegistrationBean

@SpringBootApplication
@EnableEurekaClient  // 自动在服务启动后自动注册到Eureka中
@EnableDiscoveryClient // 服务发现
@EnableCircuitBreaker // 熔断支持
public class SpringBootProviderHystrixApplication_8001 {
    public static void main(String[] args) {
        SpringApplication.run(SpringBootProviderHystrixApplication_8001.class,args);
    }
    // 下面的代码是固定的
    @Bean
    public ServletRegistrationBean hystrixMetricsStreamServlet(){
        ServletRegistrationBean registration = new ServletRegistrationBean(new HystrixMetricsStreamServlet());
        registration.addUrlMappings("/actuator/hystrix.stream");
        return registration;
    }
}

5、测试结果

访问http://localhost:9001/hystrix

在这里插入图片描述

hystrix监控界面

点击Monitor Stream按钮实时监控服务端提供者localhost:8001
监控请求信息
在这里插入图片描述

hystrix监控面板

七色一圈一线

  • 七色
    在这里插入图片描述

  • 一圈
    实心圆:公有两种含义,他通过颜色的变化代表了实例的健康程度它的健康程度从绿色<黄色<橙色<红色递减
    该实心圆除了颜色的变化之外,它的大小也会根据实例的请求流量发生变化,流量越大,该实心圆就越大,所以通过该实心圆的展示,就可以在大量的实例中快速发现故障实例和高压力实例。

  • 一线
    曲线:用来记录2分钟内流量的相对变化,可以通过它来观察到流量的上升和下降趋势! I

如果不清楚请看B站大佬视频=>狂神说

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

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

相关文章

基于SpringBoot+Vue校园二手交易系统的设计与实现

系统介绍 自从新冠疫情爆发以来&#xff0c;各个线下实体越来越难做&#xff0c;线下购物的人也越来越少&#xff0c;随之带来的是一些不必要的浪费&#xff0c;尤其是即将毕业的大学生&#xff0c;各种用品不方便携带走导致被遗弃&#xff0c;造成大量的浪费。本系统目的就是让…

安装好fedora_kde系统后的操作

文章目录 1 前言2 办公软件2.1 输入法2.1.1 安装 fcitx52.1.2 安装 fcitx5-rime2.1.3 安装 東風破2.1.4 使用 東風破 安装 郭斌勇 大神的 新世纪五笔 项目2.1.5 配置 fcitx5-rime2.1.6 重新部署 3 感谢阅读~ 1 前言 本文用的是 fedora 40 kde plasma 6。 因为有很多的软件都同时…

2024全国大学生高新技术竞赛——算法智星挑战赛(A~J)

好多都是之前的原题&#xff0c;甚至有上次第二届全国大学生信息技术认证挑战赛的原题&#xff0c;刚打完又来一遍&#xff0c;没绷住。 A. 手机 原题之一&#xff0c;具体出处忘了 最无脑的方法直接用map记录每个按下的值就行了&#xff0c;代码仅供参考。 #include <bit…

MATLAB矩阵

MATLAB 矩阵 矩阵是数字的二维数组。 在MATLAB中&#xff0c;您可以通过在每行中以逗号或空格分隔的数字输入元素并使用分号标记每行的结尾来创建矩阵。 例如&#xff0c;让我们创建一个45矩阵一- 示例 a [ 1 2 3 4 5; 2 3 4 5 6; 3 4 5 6 7; 4 5 6 7 8] MATLAB将执行上述语…

pycharm使用ssh连接服务器

1、具体流程 打开pycharm – File – Setting 输入服务器的IP地址&#xff0c;端口号、登录账号名 输入登陆账号的密码 下一步 一些初级设置 2、一些需要注意的小问题 2.1 更改代码地址 2.2 本地代码上传到服务器 首先在需要上传文件右键 2.3 在服务器的环境中上新安装库&am…

Docker 简单使用及安装常用软件

一、Docker 安装、配置与卸载 1.1、Docker 安装 # 1.安装gcc环境 yum -y install gcc gcc-c && \# 2. 卸载docker旧版本&#xff08;可能之前有安装&#xff09; yum -y remove docker docker-common docker-selinux docker-engine && \# 3. 安装依赖的软件包…

【项目学习01_2024.04.27_Day01】

学习笔记 项目学习链接第2章 内容管理模块v3.11 模块需求分析1.1 什么是需求分析1.2 模块介绍1.3 业务流程1.4 界面原型 2 创建模块工程2.1 模块工程结构父工程和子工程之间的继承关系以及工程与工程之间的依赖关系&#xff0c;通俗理解&#xff1a;2.2 创建模块工程\pom\含义及…

go 安装软件报go.mod file not found

执行 go get -u github.com/go-sql-driver/mysql 下载mysql 报错 解决方法: 控制台&#xff1a;输入go env 返回如下&#xff1a; 红圈值为NUL&#xff0c;需要设置GOMOD的值, 然后再控制台执行 &#xff08;1&#xff09;mkdir mod (2)go mod init mod 然后再执行下载&…

AIGC——什么是人工智能生成内容

人工智能生成内容&#xff08;AIGC&#xff09;是当今数字时代的一个引人注目的前沿技术&#xff0c;它借助深度学习和自然语言处理等技术&#xff0c;使计算机系统具备了生成高质量文本、图像、音频等多媒体内容的能力。AIGC的出现不仅推动了信息技术的发展&#xff0c;也在多…

【匹配】匈牙利匹配算法

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 匈牙利匹配算法 1. 正文 1.1 基础概念 二分图 顶点分为两个集合&#xff0c;集合间顶点相连&#xff0c;集合内点不相连 匹配 一个匹配就是一个边的…

Linux基础——Linux开发工具(make/makefile,git)

前言&#xff1a;在经过前面两篇学习&#xff0c;大家对Linux开发工具都有一定的了解&#xff0c;而在此之前最重要的两个工具就是vim&#xff0c;gcc。 如果对这两个工具不太了解&#xff0c;可以先阅读这两篇文章&#xff1a; Linux开发工具 (vim) Linux开发工具 (gcc/g) 首先…

汇智知了堂携手西华大学共探鸿蒙生态发展之路

近日&#xff0c;汇智知了堂有幸走进美丽的西华大学&#xff0c;为师生们带来了一场别开生面的鸿蒙专场讲座。本次讲座旨在深入解析鸿蒙生态的发展前景&#xff0c;增进同学们对鸿蒙系统的认识&#xff0c;同时展示汇智知了堂在产教融合领域的专业实力。 在讲座现场&#xff…

app渗透测试

1.夜神模拟器搭建流程 直接自定义安装 就可以了 如果是androd7本 修改为低于7版本的 调整夜神版本 2.burp设置代理 可以自己指定电脑ip windows cmd ifconfig 设置-添加-指定地址端口 然后导出证书或者在夜神模拟器使用指定的ip加端口访问下载 3.安装证书 如果是导出的…

(学习日记)2024.05.03:UCOSIII第五十七节:User文件夹函数概览(uCOS-III->Source文件夹)第三部分

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

Pytorch 计算深度模型的大小

计算模型大小的方法 卷积 时间复杂度 与 空间复杂度 的计算方式&#xff1a; C 通道的个数&#xff0c;K卷积核大小&#xff0c;M特征图大小&#xff0c;C_l-1是输入通道的个数&#xff0c;C_l是输出通道的个数 1 模型大小 MB 计算模型的大小的原理就是计算保存模型所需要…

嵌入式全栈开发学习笔记---Linux基本命令2

目录 cp 源路径 目的路径 cp -r 源路径 目的路径 mv 源路径 目的路径 mv oldname newname 接下来我们继续介绍两个常用的命令 一个是拷贝文件&#xff0c;一个是剪切文件 &#xff0c;或者也可以用来改名字。 cp 源路径 目的路径 “cp”用来拷贝文件或者目录&#xff0c;…

jpa分页插件对象Pageable出现了错误异常如何解决?

jpa分页插件对象Pageable出现了错误异常如何解决&#xff1f;&#xff01; 一般来说&#xff0c;遇到这种的错误异常情况&#xff0c;通常情况 下&#xff0c;都是因为程序员把传递的分页页码数字写错了。 正常情况下&#xff0c;分页页码起始数字应该是0&#xff1b;而不是1…

【研发管理】产品经理知识体系-产品创新中的市场调研

导读&#xff1a;在产品创新过程中&#xff0c;市场调研的重要性不言而喻。它不仅是产品创新的起点&#xff0c;也是确保产品成功推向市场的关键步骤。对于产品经理系统学习和掌握产品创新中的市场调研相关知识体系十分重要。 目录 概述&#xff1a;市场调研重要性 1、相关概…

Python脚本:论文必备!给PDF指定页面后添加空白页

一、代码 直接上代码 import PyPDF2,os from datetime import datetimedef add_blank_pages(pdf_path, page_numbers):pdf_writer PyPDF2.PdfWriter()timestamp datetime.now().strftime("%Y%m%d%H%M%S")# 读取PDF文件with open(pdf_path, rb) as pdf_file:pdf_r…

【Java EE】Spring核心思想(一)——IOC

文章目录 &#x1f38d;Spring 是什么&#xff1f;&#x1f384;什么是IoC呢&#xff1f;&#x1f338;传统程序开发&#x1f338;传统程序开发的缺陷&#x1f338;如何解决传统程序的缺陷&#xff1f;&#x1f338;控制反转式程序开发&#x1f338;对比总结 &#x1f332;理解…