Spring Cloud :Hystrix实现优雅的服务容错

目录

  • Hystrix概述:
  • 第一个Hystrix程序
    • 步骤1:创建父工程hystrix-1
    • 步骤2:改造服务提供者
    • 步骤3:改造服务消费者为Hystrix客户端
      • (1)添加Hystrix依赖
      • (2)添加@EnableHystrix注解
      • (3)创建Config配置类
      • (4)新建service包
      • (5)新建controller包
    • 步骤4:项目测试
  • 在Feign中使用Hystrix
    • 步骤1:开启Hystrix熔断
    • 步骤2:开启Feign Client功能
    • 步骤4:项目测试
    • 问题
      • 1.Hystrix 是怎么实现服务容错的?
      • 2.什么是Hystrix ?
  • 总结

Hystrix概述:

在这里插入图片描述

作为Spring Cloud体系内实现熔断机制的关键组件,Hystrix承担着服务容错保护的重要职责。

它由Netflix开源,旨在为分布式系统提供延迟处理和容错解决方案。

其核心作用在于引入延迟容忍与容错逻辑,精细管理分布式服务间的交互,确保系统的高可用性和鲁棒性。

在复杂分布式系统环境中,往往涉及数十个应用,这些应用依赖于多个项目。

不可避免地,每个依赖项目都有可能在某个时刻遭遇失败并触发故障。

若未对这些故障实施有效隔离措施,整个分布式系统可能面临崩溃风险。


在分布式系统中,当某个环节出现延迟时,可能会阻塞整个用户请求。

特别是在高流量情况下,后端依赖的延迟可能迅速导致全部服务资源在短短几秒内耗尽,从而无法处理后续请求,使应用发生故障。

更严重的是,这些问题还可能引发服务间延迟累积,占用备份队列、线程等关键资源,触发连锁反应般的级联故障。

为应对这些挑战,Hystrix应运而生。

它通过封装每一个依赖项,实现它们之间的相互隔离。

一旦延迟发生,问题被限制在局部资源中,并包含回退逻辑,该逻辑决定在依赖失败时应采取何种措施,确保系统的稳定性。


第一个Hystrix程序

步骤1:创建父工程hystrix-1

将搭建的Eureka基本应用中的3个子项目都复制到hystrix-1父工程中,并依次添加为Maven项目。
在这里插入图片描述

步骤2:改造服务提供者

在服务提供者eureka-provider中创建controller包,并在该包下创建HystrixController类,该类定义了一个demo ()方法,用于处理路径为/demo的请求。

HystrixController类的内容如下:
在这里插入图片描述

步骤3:改造服务消费者为Hystrix客户端

流程:

(1)添加Hystrix依赖

(2)添加@EnableHystrix注解

(3)创建Config配置类

(4)创建Service层类

(5)创建Controller层类


(1)添加Hystrix依赖

在项目eureka-consumer的pom文件中添加Hystrix的依赖如下:

在这里插入图片描述

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

添加后重新加载pom文件。

(2)添加@EnableHystrix注解

在启动类EurekaConsumerApplication中添加@EnableHystrix注解启动熔断功能。
在这里插入图片描述

(3)创建Config配置类

在eureka-consumer中创建config包,并在该包下创建类HystrixConfig。在HystrixConfig类中注入restTemplate的Bean对象。
在这里插入图片描述

(4)新建service包

在service包下新建LocalItemService类
在这里插入图片描述

被@HystrixCommand注解修饰的demo()方法就启动了Hystrix熔断器的功能fallbackMethod属性定义的是处理回退(fallback)逻辑的方法。如果必须在fallback逻辑方法中远程调度其他服务,最好在远程调度其他服务时,也加上熔断器。

注:@Autowired注解不能运行时可换成@Resource注解,按Bean的名称装配。

(5)新建controller包

在controller包下新建LocalItemController类
在这里插入图片描述

步骤4:项目测试

启动服务并进行测试。依次启动eureka-server,eureka-provider,eureka-consumer,在浏览器输入http://localhost:7006/demo?name=布说,观察浏览器显示的效果。
在这里插入图片描述
在这里插入图片描述

关闭服务提供者eureka-provider,制造服务不可用的情形。再次请求 以上地址,观察浏览器显示的效果。
在这里插入图片描述


在Feign中使用Hystrix

创建父工程hystrix-2,将上述中的3个子项目都复制到hystrix-2父工程中,并依次添加为Maven项目。

步骤1:开启Hystrix熔断

Feign自带熔断功能,默认情况下,熔断功能是关闭的。如果要开启熔断,只需在配置文件中将hystrix.enabled设置为true即可。

开启Hystrix熔断功能。在eureka-consumer项目的配置文件application.yml中添加开启熔断的配置:
在这里插入图片描述

注:因为在Feign的起步依赖中引入了Hystrix依赖,所以在Feign中使用Hystrix不需要引入任何的依赖,只需要在配置文件中开启即可。

步骤2:开启Feign Client功能

因为使用Feign组件调用,需要在eureka-consumer项目的pom文件中加入feign依赖。

在项目eureka-consumer的pom文件中添加Feign的依赖如下:

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

添加后重新加载pom文件。

在eureka-consumer的启动类中添加@EnableFeignClients开启Feign Client功能。
![在这里插入图片描述](https://i-blog.csdnimg.cn/在这里插入图片描述

注:使用fallback属性指定的用于处理回退逻辑的类,必须实现@FeignClient注解修饰的接口。

步骤3:修改项目中接口

在service包中新建失败逻辑处理类LocalbushuoServiceImpl,并实现被@FeignClient修饰的LocalItemService接口。
在这里插入图片描述

进入项目eureka-consumer,删除掉之前的LocalItemService类。创建LocalItemService接口,并在上方的@FeignClient注解中,增加fallback属性配置,指定LocalItemServiceImpl类为失败逻辑处理类。

注:使用fallback属性指定的用于处理回退逻辑的类,必须实现@FeignClient注解修饰的接口。
在这里插入图片描述

步骤4:项目测试

启动服务并进行测试。依次启动eureka-server,eureka-provider,eureka-consumer,在浏览器输入http://localhost:7006/demo?name=www,观察浏览器显示的效果。
在这里插入图片描述

关闭服务提供者eureka-provider,制造服务不可用的情形。再次请求 以上地址,观察浏览器显示的效果。
在这里插入图片描述
在这里插入图片描述

问题

1.Hystrix 是怎么实现服务容错的?

Hystrix 主要通过以下几点实现服务容错:

断路器模式:当依赖服务频繁失败时,断路器会打开,直接拒绝请求,防止系统因等待响应而耗尽资源。当服务恢复后,断路器会进入半开状态,逐步恢复请求。(上述程序就是)

资源隔离:使用线程池或信号量隔离来限制依赖服务的请求,防止一个服务的问题影响到整个系统。
Fallback 机制:当依赖服务不可用时,提供一个备用响应(Fallback),确保请求不会完全失败,而是返回一个默认值或备用结果。

超时与重试:设置请求超时时间,超出时间直接返回错误;对于临时故障,可以配置重试机制。

2.什么是Hystrix ?

Hystrix 是一个由 Netflix 开发的开源库,用于提高分布式系统的服务弹性和可靠性。它通过增加延迟容忍和容错逻辑来防止级联故障。

主要功能包括:

  1. 断路器:监测依赖服务的故障,当检测到故障时,阻止请求发送到有问题的服务上,避免级联故障。

  2. 资源隔离:使用线程池隔离或信号量隔离来限制服务调用的资源消耗,防止系统不稳定。

  3. Fallback 回退机制:配置备用响应(Fallback),当依赖服务故障时返回备用结果,确保请求不会完全失败。

  4. 监控与仪表盘:提供实时监控数据,如延迟和错误率,并通过 Hystrix Dashboard 展示,帮助监控系统状态。

Hystrix 常与 Spring Cloud 集成,用于构建高可用和高弹性的微服务架构。尽管 Netflix 已停止维护 Hystrix,但它在许多现有项目中仍然广泛使用。

总结

在这里插入图片描述

每个微服务都需要独立部署,管理多个环境和配置,这无疑增加了部署的复杂性。

由于系统由众多微服务构成,一旦发生故障,定位问题的时间会相应增加,监控和故障排查的难度也随之增大。

此外,不同微服务对资源的需求各不相同,需要合理分配以避免资源浪费或不足。

激励自己:天行健,君子以自强不息。

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

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

相关文章

编程练习2 数据单元的变量替换

示例1: 1,2<A>00 示例2: 1,2<A>00,3<A>00 示例3: <B>12,1,2<B>1 示例4: <B<12,1 输出依次如下&#xff1a; #include<iostream> #include<vector> #include<string>using namespace std;/* 字符分割函数 将传入…

人工智能-大语言模型-微调技术-LoRA及背后原理简介

1. 《LORA: LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS》 LORA: 大型语言模型的低秩适应 摘要&#xff1a; 随着大规模预训练模型的发展&#xff0c;全参数微调变得越来越不可行。本文提出了一种名为LoRA&#xff08;低秩适应&#xff09;的方法&#xff0c;通过在Transf…

STM32 使用 CubeMX 实现按键外部中断

目录 问题背景知识参考需要改什么注意尽量不要在中断函数使用 循环函数做延时中断函数中延时方法调试 问题 我想实现按钮触发紧急停止类似功能&#xff0c;需要使用按键中断功能。 背景知识 GPIO 点亮 LED。stm32cubemx hal学习记录&#xff1a;GPIO输入输出。STM32—HAL库 …

活动系统开发之采用设计模式与非设计模式的区别-后台功能总结

1、数据库ER图 2、后台功能字段 题目功能字段 数据列表 编号题目名称选项数量状态 1启用0禁用创建时间修改时间保存 题目名称选项集 选项内容是否正确答案 1正确0错误启禁用删除素材图库功能字段 数据列表 编号原文件名称文件类型文件大小加密后文件名文件具体路径上传类型状态…

从零开始学习Python

目录 从零开始学习Python 引言 环境搭建 安装Python解释器 选择IDE 基础语法 注释 变量和数据类型 变量命名规则 数据类型 运算符 算术运算符 比较运算符 逻辑运算符 输入和输出 控制流 条件语句 循环语句 for循环 while循环 循环控制语句 函数和模块 定…

29 C 语言中的随机数实现:rand 与 srand

目录 1 为什么需要随机数&#xff1f; 1.1 背景介绍 1.2 应用场景 2 C 语言实现随机数 2.1 rand() 函数 2.1.1 函数原型 2.1.2 功能说明 2.1.3 案例演示 2.2 srand() 函数 2.2.1 函数原型 2.2.2 功能说明 2.2.3 案例演示 2.3 指定范围的随机数 2.3.1 获…

【JavaEE】数据链路层协议和DNS

&#x1f525;个人主页&#xff1a; 中草药 &#x1f525;专栏&#xff1a;【Java】登神长阶 史诗般的Java成神之路 &#x1f45c;一.以太网 以太网&#xff08;Ethernet&#xff09;是一种局域网技术&#xff0c;它定义了开放系统互连&#xff08;OSI&#xff09;模型中的物理…

Python网络爬虫获取Wallhaven壁纸图片(源码)

** 话不多说&#xff0c;直接附源码&#xff0c;可运行&#xff01; ** import requests from lxml import etree from fake_useragent import UserAgent import timeclass wallhaven(object):def __init__(self):# yellow# self.url "https://wallhaven.cc/search?co…

K8S介绍---搭建集群

Kubernetes介绍 官网&#xff1a;https://kubernetes.io/ 一、应用部署方式演变 1、传统部署&#xff1a;互联网早期&#xff0c;会直接将应用程序部署在物理机上 优点&#xff1a;简单&#xff0c;不需要其他技术的参与 缺点&#xff1a;不能为应用程序定义资源使用边界&a…

Java中List、ArrayList与顺序表

List、ArrayList与顺序表 List什么是List常用方法介绍List的使用 ArrayList与顺序表线性表顺序表接口的实现 ArrayList简介ArrayList的使用ArrayList的构造ArrayList的常见操作ArrayList的遍历ArrayList的扩容机制 ArrayList的具体使用杨辉三角简单的洗牌算法 ArrayList的问题及…

双向链表的基本结构及功能实现

1.基本结构: 双向链表是一种链表数据结构&#xff0c;它由一系列节点组成&#xff0c;每个节点包含三个部分&#xff1a; (1).数据域&#xff1a;存储节点的数据 (2).前驱指针:指向前一个节点 (3).后驱指针:指向下一个节点 2.基本特性&#xff1a; 双向链接: 与单向链表…

【WPF】02 按钮控件圆角配置及状态切换

按钮圆角 先从工具箱里拖进来一个Button控件&#xff0c;然后对这个按钮进行美化。 首先在 xaml 里按钮控件部分 添加如下代码&#xff1a; <Button x:Name"btnLogin" Content"登录" HorizontalAlignment"Center" Margin"0,399,0,0&q…

C++20中头文件compare的使用

<compare>是C20中新增加的头文件&#xff0c;此头文件是language support库的一部分。它包括&#xff1a;concepts、classes、customization point objects、functions。 1.concepts&#xff1a;三向比较运算符<>&#xff0c;目的是简化比对对象的过程&#xff0c;…

微服务配置管理——动态路由

动态路由 网关的路由配置全部是在项目启动时由org.springframework.cloud.gateway.route.CompositeRouteDefinitionLocator在项目启动的时候加载&#xff0c;并且一经加载就会缓存到内存中的路由表内&#xff08;一个Map&#xff09;&#xff0c;不会改变。也不会监听路由变更新…

【PG备份恢复】基于时间点的恢复(踩坑指南)

1 设置基于时间点恢复所需的配置 1.1 修改配置文件 postgresql.conf vim postgresql.conf archive_mode on archive_command cp %p /data1/backups/pg_wal_archive/%f wal_level replica 1.2 生效配置 2 进行一次全备 2.1 创建备份目录 mkdir -p /data/backup/pg_b…

C语言常见字符串函数模拟实现一:(strlen,strcpy,strcat,strcmp,strstr )

strlen模拟实现 重点&#xff1a;1.字符串已经\0作为结束标志&#xff0c;strlen返回的是字符串\0前面出现的字符个数&#xff08;不包含\0&#xff09; 2.参数指向的字符串必须要以\0结束。 3.注意函数的返回值是size_t&#xff0c;是无符号的&#xff0c;加减是无法对比的。…

thinkphp8 从入门到放弃(后面会完善用到哪里写到哪)

thinkphp8 从入门到放弃 引言 thinkphp* 大道至简一、 thinkphp8 安装安装Composerthinkphp 安装命令(tp-项目名称)多应用安装&#xff08;一个项目不会只有一个应用&#xff09;安装完文件目录如下本地部署配置伪静态好了项目可以run 二、架构服务&#xff08;Service&#xf…

大数据新视界 --大数据大厂之探索ES:大数据时代的高效搜索引擎实战攻略

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

app自动化前置准备环境搭建

编写脚本之前的一些前置准备工作。 1&#xff0c;安装appium server&#xff1a;官网地址&#xff1a;http://appium.io/ 安装教程&#xff1a;https://www.cnblogs.com/gancuimian/p/16536322.html 2&#xff0c;安装appium客户端&#xff1a; appium客户端安装相对较简单…

智谱清影 - CogVideoX-2b-部署与使用

&#x1f351;个人主页&#xff1a;Jupiter. &#x1f680; 所属专栏&#xff1a;Linux从入门到进阶 欢迎大家点赞收藏评论&#x1f60a; 目录 体验地址&#xff1a;[丹摩DAMODEL官网](https://www.damodel.com/console/overview) CogVideoX 简介本篇将详细介绍使用丹摩服务器部…