微服务_Hystrix

在每个服务中引用该组件,监控当前组件。可被GateWay、Fegin集成。

简介

作用:防止服务雪崩
Hystrix是一个由Netflix开源的容错框架,它主要用于分布式系统中的服务间通信。Hystrix通过在调用服务的过程中添加各种容错机制,来保护系统免受服务故障或网络中断的影响,从而提高了系统的可靠性和弹性。Hystrix提供了许多功能,例如超时控制、断路器、线程池隔离、请求缓存等等,它可以快速、可靠地为您的应用程序提供容错保护。

熔断器的原理很简单,如同电力过载保护器。它可以实现快速失败,如果它在一段时间内侦测到许多类似的错误,会强迫其以后的多个调用快速失败,不再访问远程服务器,从而防止应用程序不断地尝试执行可能会失败的操作,使得应用程序继续执行而不用等待修正错误,或者浪费 CPU
时间去等到长时间的超时产生。熔断器也可以使应用程序能够诊断错误是否已经修正,如果已经修正,应用程序会再次尝试调用操作。

Hystrix的主要特点包括:

快速失败(Fail Fast):当一个依赖服务出现故障时,Hystrix能够快速地中断请求,避免等待超时而浪费系统资源。
回退机制(Fallback):当一个依赖服务出现故障时,Hystrix能够提供回退逻辑,返回一个默认值或执行备选方案,从而保证系统的稳定性。
熔断器(Circuit Breaker):Hystrix能够自动地监控依赖服务的状态,当故障率达到一定阈值时,自动打开熔断器,防止请求继续发往不可用的依赖服务。
缓存(Cache):Hystrix能够提供缓存机制,避免对同一数据的重复请求,从而提高系统的性能。
隔离(Isolation):Hystrix能够通过线程池隔离、信号量隔离等机制,避免依赖服务的故障对系统的其他部分造成影响。
监控和度量(Monitoring and Metrics):Hystrix能够提供近乎实时的监控和度量,包括请求成功率、请求响应时间、熔断器状态等指标,从而帮助开发人员快速地定位和解决问题。

服务熔断

当满足一定的阈值的时候(默认10s内超过20个请求失败)

当失败率达到一定的时候(默认10s内50%的请求失败)

断路器将会开启

开启时,所有请求都不会进行转发

一段时间后(默认是5s),这个时候断路器是半开状态会让其中一个请求进行转发,如果成功,断路器关闭,若失败,重复4和5

快速上手

引入依赖

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

在入口类添加注解

@EnableCircuitBreaker

服务端熔断

设置熔断后的快速反应(备用处理)

@GetMapping("demo")
@HystrixCommand(fallbackMethod = "demoFallback")	//指定快速处理方案的方法名
public String demo(String id){
    if(){
        throw new RuntimeException("出错!")}
}

public String demoFallback(String id){
    
}

默认的处理

为每个方法都自定义处理方式,代码工作有些繁重,可以指定一个通用的默认的处理方法

@HystrixCommand(defaultFallback = "默认的处理")

默认的处理方法返回值为String,没有形参,因为要可以为不同的方法提供处理

自定义的处理方法形参和返回值要和对应的方法对应

注:用hystrix做服务端熔断,只有服务可用才能正常返回fallback处理,因为fallback处理也是该服务的一部分

消费端熔断

由Feign处理,假如整个服务断了,fallback都用不了,由Feign返回

熔断器触发机制

请添加图片描述

  • 怎么记录?失败的请求怎么办

OpenFeign整合

  • openfeign和gateway重复了吧,
  • 阿我明白了,,,openfegin是项目内部调用,这部分本来就不走网关,,而另外那些要访问网关的(比如前端?)他们需要在网关进行处理才行

openfeign底层默认集成hystrix

开启openFeign对hystrix支持

feign.hystrix.enabled=true

在feign的client接口上

@FeignClient(value = "服务id",fallback=实现类.class)

然后编写bean实现该client接口,重写对应方法,加上组件注解

用工厂模式

以若依项目为例

@FeignClient(value = ServiceNameConstants.SYSTEM_SERVICE, fallbackFactory = RemoteUserFallbackFactory.class)

编写工厂类,实现FallbackFactory<T>接口,重写create方法,返回一个内部类对象(毕竟工厂类要返回实体对象,但原client是个接口)

@Component
public class RemoteUserFallbackFactory implements FallbackFactory<RemoteUserService>
{
    private static final Logger log = LoggerFactory.getLogger(RemoteUserFallbackFactory.class);

    @Override
    public RemoteUserService create(Throwable throwable)
    {
        log.error("用户服务调用失败:{}", throwable.getMessage());
        return new RemoteUserService()
        {
            @Override
            public R<LoginUser> getUserInfo(String username, String source)
            {
                return R.fail("获取用户失败:" + throwable.getMessage());
            }

            @Override
            public R<Boolean> registerUserInfo(SysUser sysUser, String source)
            {
                return R.fail("注册用户失败:" + throwable.getMessage());
            }
        };
    }

整合GateWay过滤器

spring:
  cloud:
    gateway:
      routes:
        # 系统模块
        - id: ruoyi-system
          uri: lb://ruoyi-system
          predicates:
            - Path=/system/**
          filters:
            - StripPrefix=1
            # 降级配置
            - name: Hystrix
              args:
                name: default
                # 降级接口的地址
                fallbackUri: 'forward:/fallback'

上面配置包含了一个Hystrix过滤器,该过滤器会应用Hystrix熔断与降级,会将请求包装成名为fallback的路由指令RouteHystrixCommandRouteHystrixCommand继承于HystrixObservableCommand,其内包含了Hystrix的断路、资源隔离、降级等诸多断路器核心功能,当网关转发的请求出现问题时,网关能对其进行快速失败,执行特定的失败逻辑,保护网关安全。

配置中有一个可选参数fallbackUri,当前只支持forward模式的URI。如果服务被降级,请求会被转发到该URI对应的控制器。控制器可以是自定义的fallback接口;也可以使自定义的Handler,需要实现接口org.springframework.web.reactive.function.server.HandlerFunction<T extends ServerResponse>

Hystrix Dashborad 图形化监控

显示状态信息。不是很重要,不推荐

是不是有统一的微服务监控能取代?

引入dashborad依赖, 默认@EnableDiscoveryClient开启
erver.HandlerFunction`。

Hystrix Dashborad 图形化监控

显示状态信息。不是很重要,不推荐

引入dashborad依赖, 默认@EnableDiscoveryClient开启

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

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

相关文章

助你更好的理解 Python 字典

助你更好的理解 Python 字典 字典是Python中的常用数据类型之一&#xff0c;可将数据存储在键/值对中&#xff0c;同 Java 中的 Map 相似。 1、什么是字典理解&#xff1f; 字典理解是创建字典的一种优雅简洁的方法。 字典理解优化 使用字典理解优化函数。 示例&#xff…

深入理解Linux虚拟内存管理(七)

系列文章目录 Linux 内核设计与实现 深入理解 Linux 内核 Linux 设备驱动程序 Linux设备驱动开发详解 深入理解Linux虚拟内存管理&#xff08;一&#xff09; 深入理解Linux虚拟内存管理&#xff08;二&#xff09; 深入理解Linux虚拟内存管理&#xff08;三&#xff09; 深入理…

chatgpt赋能python:Introduction

Introduction 在机器学习中&#xff0c;模型的训练是非常重要的步骤之一。模型训练意味着为数据拟合合适的参数&#xff0c;以便能够准确地预测未来的值。Python是一种功能强大的编程语言&#xff0c;提供许多库和框架来训练机器学习模型。在本文中&#xff0c;我们将探讨如何…

mysql 最常用的一些语句

1 数据库相关操作 CREATE DATABASE IF NOT EXISTS daily-test DEFAULT CHARSET utf8 COLLATE utf8_general_ci&#xff1b; drop database daily_test; use daily_test 具体操作如下图上所示&#xff1a; 2 mysql常用数据类型 MySQL 数据类型 | 菜鸟教程 3 数据库表相关操作…

CSS基础学习--13 Display(显示) 与 Visibility(可见性)

一、定义 display属性设置一个元素应如何显示 visibility属性指定一个元素应可见还是隐藏 二、隐藏元素 - display:none或visibility:hidden 隐藏一个元素可以通过把display属性设置为"none"&#xff0c;或把visibility属性设置为"hidden"。但是请注意&am…

chatgpt赋能python:Python怎么抢优惠券?优惠不再是梦想!

Python怎么抢优惠券&#xff1f;优惠不再是梦想&#xff01; 在如今的消费社会&#xff0c;优惠券已成为人们购物时追逐的目标。而优惠券的数量有限且抢手&#xff0c;往往仅能在短时间内领取&#xff0c;因此初次抢到心仪的优惠券可谓令人欣喜不已。而对于程序员们而言&#…

上线客流人数统计系统实现资源的最大化利用

在流量管理方面&#xff0c;智慧客流采集系统的应用可以帮助商家实现资源的最大化利用。通过对客流量数据的分析&#xff0c;商家可以准确把握客流量变化规律&#xff0c;进而制定出最优化的资源配置方案。 AI客流视觉监控 一、某汽车4S店智慧客流采集系统案例展示 以某汽车4S…

ESXi 7.0 U3m Dell (戴尔) 定制版 OEM Custom Installer CD

VMware ESXi 7.0 Update 3m - 领先的裸机 Hypervisor (All OEM Customized Installer CDs) ESXi 7.0 U3m Standard (标准版) ESXi 7.0 U3m Dell (戴尔) 定制版 OEM Custom Installer CD ESXi 7.0 U3m HPE (慧与) 定制版 OEM Custom Installer CD ESXi 7.0 U3m Lenovo (联想) 定…

python中变量与字符串详解!!

❄️作者介绍&#xff1a;奇妙的大歪❄️ &#x1f380;个人名言&#xff1a;但行前路&#xff0c;不负韶华&#xff01;&#x1f380; &#x1f43d;个人简介&#xff1a;云计算网络运维专业人员&#x1f43d; 前言 初学者经常会遇到的困惑是&#xff0c;看书上或者是听课都懂…

django中url和视图函数path re_path views.py

目录 url的定义url的格式django中的urldjango中的创建自己的urldjango访问测试django中的path动态django中的path动态案例django中的path动态类型django中的path动态案例-计算器django的正则路由re_path() url的定义 url 统一资源定位符 url 用来表示互联网上某个资源的地址 …

详解c++---set的介绍

目录标题 set容器的介绍set的构造函数insert函数的介绍find函数erase函数count函数lower_boundupper_boundmultiset set容器的介绍 set容器可以看成我们上一篇文章学习的K结构的搜索二叉树&#xff0c;所以set容器不仅可以存储数据&#xff0c;还可以对数据进行排序和去重&…

新项目之初性能测试工作如何前移?

最近刚接手一个新项目&#xff0c;在最开始的时候要求对这个项目做性能测试&#xff0c;产品经理也给不出性能需求&#xff0c;只因为这个项目是电商项目&#xff0c;可能会有高并发&#xff0c;秒杀的场景&#xff0c;所以产品经理要求我们对这个项目必须做性能测试&#xff0…

【Linux:进程间信号】

文章目录 1 生活角度的信号2 技术应用角度的信号3 信号的产生3.1 由系统调用向进程发信号3.1.1 signal3.1.2 kill3.1.3 raise 3.2 由软件条件产生信号3.3 硬件异常产生信号3.4 通过终端按键产生信号3.5 总结思考一下 4 信号的保存4.1信号其他相关常见概念4.2在内核中的表示4.3 …

命令行创建uniapp项目

命令行创建uniapp项目 除了使用HBuilderX工具可视化搭建项目外&#xff0c;DCloud官方还提供了一个脚手架用于命令行搭建项目。 环境安装 全局安装vue-cli npm i vue/cli4 -g建议使用vue-cli 4.x版本&#xff0c;vue-cli 5.x与webpack存在冲突&#xff0c;会导致运行报错 …

【软件测试】测试用例设计要点总结

文章目录 考试题型简答题(一) 等价类划分1.1 划分等价类1.2 设计测试用例 (二) 边界值分析2.1 列出边界值分析表2.2 设计测试用例 (三) 因果图分析3.1 确定原因和结果3.2 确定原因和结果之间的逻辑关系3.3 在因果图上使用标准的符号标明约束条件 (四) 判定表驱动4.1 将因果图转…

如何利用ChatGPT写毕业论文

如何利用ChatGPT写毕业论文 ChatGPT是什么&#xff1f;利用ChatGPT写毕业论文的步骤1.准备数据2.训练模型3.生成论文4.检查论文 总结地址 ChatGPT是什么&#xff1f; ChatGPT是一个基于GPT-2模型的开源聊天机器人&#xff0c;它可以回答用户的问题&#xff0c;进行闲聊和提供各…

【头歌-Python】9.2 能带曲线绘制(project) 第1~3关

第1关&#xff1a;能带曲线绘制一 任务描述 本关任务&#xff1a;使用matplotlib绘制图形。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a; 使用 matplotlib 绘制图形python 读取文件 python 读取文件 python读取文件可以用以下函数实现&#xff1a; # …

Java学习笔记(视频:韩顺平老师)4.0

如果你喜欢这篇文章的话&#xff0c;请给作者点赞哟&#xff0c;你的支持是我不断前进的动力。 因为作者能力水平有限&#xff0c;欢迎各位大佬指导。 目录 如果你喜欢这篇文章的话&#xff0c;请给作者点赞哟&#xff0c;你的支持是我不断前进的动力。 控制结构 顺序 分…

用了【WRITE-BUG数字空间】,其他文档软件可以卸载、注销账号了

都3202年了文档都进化成在线协同编辑文档了 让我看看谁还在用本地软件写文档啊~滋滋滋 使用【WRITE-BUG数字空间】云文档全键盘写作不是梦&#xff01;铁汁&#xff0c;听我句劝&#xff0c;把本地软件卸载了奥&#xff0c;你把握不住~ 程序员兄弟姐妹们的最爱编辑器&#x…

TCP协议流程详解,抓包分析

目录 TCP概念TCP工作层TCP协议头部解析TCP抓包解析TCP三次握手&#xff0c;数据收发&#xff0c;四次挥手抓包TCP状态迁移 TCP概念 传输控制协议&#xff08;TCP&#xff0c;Transmission Control Protocol&#xff09;是一种面向连接的、可靠的、基于字节流的传输层通信协议&…