spring cloud之服务熔断

news2024/11/18 11:28:22

四、Hystrix组件(*)

- 官网:https://github.com/Netflix/Hystrix
- 在分布式环境中,许多服务依赖项不可避免的会失败。Hystrix是一个库,它通过添加延迟容忍和容错逻辑来帮助您控制这些分布式服务之间的交互。Hystrix通过隔离服务之间的访问点、停止它们之间的级联故障及提供后备选项来实现这一点,所有这些都可以提高系统的整体弹性。

1.服务雪崩

- 在微服务之间进行服务调用,由于某一个服务故障,导致级联的服务故障的现象,成为雪崩效应。
- 雪崩效应描述的是服务提供方不可用,导致消费方不可用,并将不可用逐渐扩大的过程。

微服务之间链路调用图示
在这里插入图片描述

在某一时刻流量突然波动很大,导致某一服务(如SeverC)扛不住请求的压力,变得不可用。那么ServerB的请求也会阻塞,慢慢耗尽serverB的线程资源,导致ServerB也变得不可用,同样也会导致ServerA不可用

在这里插入图片描述

2.服务熔断

"熔断器"本身是一种开关装置,当某个服务发生故障后,通过断路器(hystrix)的故障监控,某个异常条件被触发,直接熔断整个服务。向请求方返回一个符合预期的、可处理的备选响应(FallBack),而不是长时间的等待或者抛出异常,就保证了服务请求方的线程不会长时间占用,避免故障在分布式系统中蔓延,乃至雪崩。如果目标服务情况好转则恢复调用。服务熔断是解决服务雪崩的重要手段。

服务熔断图示:
在这里插入图片描述

3.服务降级

- 服务压力剧增时,为了保证核心服务正常运行,可以有策略的关闭微服务系统中的某些边缘服务

服务降级图示
在这里插入图片描述

4.服务熔断和服务降级总结

- 服务熔断必会触发服务降级,所以熔断也是降级的一种。区别在于熔断是对服务之间调用链的保护,而降级是对整个系统压力过载的一种保护。
- 都是从系统的可用性可靠性着想,为防止系统的整体缓慢甚至服务雪崩,所采取的保护手段。

5.服务熔断的实现

  • 1.添加依赖
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
  • 2.在启动类上添加注解 @EnableCircuitBreaker。开启服务熔断
@SpringBootApplication
@EnableDiscoveryClient
@EnableCircuitBreaker
public class HystrixApplication {

}
  • 3.服务熔断测试
在方法上添加注解@HystrixCommand(fallbackMethod = "demoFallback"),fallback指定服务熔断后的处理

@RestController
public class DemoController {

    @GetMapping("/demo")
    @HystrixCommand(fallbackMethod = "demoFallback")
    public String demo(@RequestParam Integer id){
        if (id <= 0) {
            throw new RuntimeException("ID无效");
        }
        return "demo ok";
    }

    /**
     * demo方法服务熔断后的处理
     */
    public String demoFallback(Integer id) {
        return "系统繁忙,请稍后再试!";
    }
}

错误请求,操作多次后,熔断器打开
在这里插入图片描述

在熔断器打开状态下,接下来(默认)5秒内,所有请求到该接口依然会熔断处理
在这里插入图片描述

熔断器打开状态下,5秒后,此时熔断器处于半开状态,允许放行一个请求进来,如果该请求执行成功,则断路器会关闭,反之重新打开断路器
在这里插入图片描述

  • Hystrix熔断器打开条件
- 1.当次数达到一定的阈值时(默认10秒内超过20个请求次数)
- 2.当失败率达到一定的比例(默认10秒内超过50%的请求失败)
  • Hystrix熔断器触发熔断机制流程图
    在这里插入图片描述
当Hystrix监控对该服务接口调用达到触发熔断器开启的条件时,会在系统中自动触发熔断器,此时任何到该接口的服务请求均不可用,默认5秒后,熔断器会处于半开状态,只允许放行一个请求到该服务接口,如果该请求执行成功,则断路器关闭,反之断路器重新打开

6.OpenFeign 集成 Hystrix

  • 1.添加依赖
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>

    <!-- consul 注册中心 -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-consul-discovery</artifactId>
    </dependency>
    <!-- hystrix 熔断 -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
    </dependency>
    <!--openfeign -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
</dependencies>
  • 2.配置文件
server.port=8855
# 服务名
spring.application.name=OPENFEIGN-HYSTRIX
# consul注册中心地址
spring.cloud.consul.host=localhost
spring.cloud.consul.port=8500
# 开启openfeign服务熔断处理(默认为false,不开启)
feign.hystrix.enabled=true
  • 3.在启动类上添加注解
@SpringBootApplication
@EnableDiscoveryClient // 开启服务注册客户端
@EnableCircuitBreaker // 开启断路器
@EnableFeignClients // 开启feign
public class OpenfeignHystrixApplication {

}
  • 4.OpenFegin 集成 Hystrix 测试
@RestController
@Slf4j
public class TestController {

    @Autowired
    private HystrixClient hystrixClient;

    @GetMapping("/test")
    public String test(@RequestParam Integer id) {
        String result = hystrixClient.demo(id);
        log.info("result:{}", result);
        return "test ok";
    }
}
---------------
- feign客户端接口
// fallback:当接口处理异常或不可用时,进行服务熔断处理
@FeignClient(value = "HYSTRIX", fallback = HystrixClientFallback.class)
public interface HystrixClient {

    @GetMapping("/demo")
    String demo(@RequestParam(value = "id") Integer id);
}  

- Openfeign接口服务熔断备选处理类,需实现HystrixClient接口
@Component
public class HystrixClientFallback implements HystrixClient {

    @Override
    public String demo(Integer id) {
        return "当前请求处理失败,进行服务熔断备选处理。id:" + id;
    }
}

在这里插入图片描述

7.Hystrix Dashboard(仪表盘)

- Hystrix Dashboard收集了每个HystrixCommand的一组度量,以高效的方式显示每个断路器的运行状况
- 作用:监控每一个@HystrixCommand注解的一组度量,构建一组信息,通过图形化方式展示当前方法@HystrixCommad的状态信息
  • 1.添加依赖
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>
  • 2.配置文件
server.port=9909
# 应用名
spring.application.name=HYSTRIX-DASHBOARD
# consul注册中心地址
# spring.cloud.consul.host=localhost
# spring.cloud.consul.port=8500
  • 3.在启动上添加注解@EnableHystrixDashboard
@SpringBootApplication
//@EnableDiscoveryClient
@EnableHystrixDashboard // 开启熔断器仪表盘
public class HystrixDashboardApplication {

}
  • Hystrix Dashboard图形化界面访问地址
http://localhost:9909/hystrix

在这里插入图片描述

添加需要监控的服务地址,点击【 Monitor Stream】
在这里插入图片描述

  • Hystrix目前状态
- Hystrix 和 Hystrix Dashboard已经进入维护模式
	- Hystrix Dashboard已经被废弃,替换产品:Netflix-Skunkworks/hystrix-dashboard

- 推荐使用阿里的 sentinel (流量卫兵)

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

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

相关文章

【【OpenCV实现图像:用OpenCV进行模板匹配】

文章目录 概要整体架构流程图像灰度化结论 概要 模板匹配是一种在图像处理领域广泛应用的技术&#xff0c;旨在寻找目标模板在源图像中的位置。该算法的核心思想是通过比较模板与源图像的局部区域&#xff0c;逐像素滑动&#xff0c;创建一个相似度图&#xff0c;反映了模板与…

【React】Redux基本使用

什么情况使用 Redux &#xff1f; Redux 适用于多交互、多数据源的场景。简单理解就是复杂 从组件角度去考虑的话&#xff0c;当我们有以下的应用场景时&#xff0c;我们可以尝试采用 Redux 来实现 某个组件的状态需要共享时 一个组件需要改变其他组件的状态时 一个组件需要…

sqli-labs(Less-2)

1.进入环境就是这样的界面 2. id1 and 11 页面返回正常 3. id1 and 12 页面显示不正常 由此可确实是数字型注入 4. 使用 order by 语句进行字段查询 说明页面存在三个字段 5. 使用联合查询 union select 6. 查询当前数据库的所有表 7. 查询某表的所有字段名 8. 查用户…

Linux信号量以及基于环形队列的生产者消费者模型

文章目录 信号量信号量的接口初始化销毁等待信号量发布信号量 环形队列结合信号量设计模型 实现基于环形队列的生产者消费者模型Task.hppRingQueue.hppmain.cc效果对于多生产多消费的情况 信号量 信号量的本质是一个计数器 首先一份公共资源在实际情况中可能存在不同的线程可…

关于修改了mysql的my_conf文件之后,不能生效问题

个人名片&#xff1a; &#x1f405;作者简介&#xff1a;一名大三在校生&#xff0c;热爱生活&#xff0c;爱好敲码&#xff01; \ &#x1f485;个人主页 &#x1f947;&#xff1a;holy-wangle ➡系列内容&#xff1a; &#x1f5bc;️ tkinter前端窗口界面创建与优化 &…

相关关系与因果关系

本文来自&#xff1a;https://towardsdatascience.com/a-step-by-step-guide-in-detecting-causal-relationships-using-bayesian-structure-learning-in-python-c20c6b31cee5 作者&#xff1a;Erdogan Taskesen 在机器学任务中&#xff0c;确定变量间的因果关系&#xff08;c…

CentOS修改root用户密码

一、适用场景 1、太久没有登录CentOS系统&#xff0c;忘记管理密码。 2、曾经备份的虚拟化OVA或OVF模板&#xff0c;使用模板部署新系统后&#xff0c;忘记root密码。 3、被恶意攻击修改root密码后的紧急修复。 二、实验环境 1、VMware虚拟化的ESXI6.7下&#xff0c;通过曾经…

基于PyTorch搭建你的生成对抗性网络

前言 你听说过GANs吗&#xff1f;还是你才刚刚开始学&#xff1f;GANs是2014年由蒙特利尔大学的学生 Ian Goodfellow 博士首次提出的。GANs最常见的例子是生成图像。有一个网站包含了不存在的人的面孔&#xff0c;便是一个常见的GANs应用示例。也是我们将要在本文中进行分享的…

11.3SpringMVC

一.概念 1.SpringMvc: a.构建在Servlet(api)基础上. b.是一个Web框架(HTTP). c.来自于Spring webMVC模块. 2.MVC 二.注册路由的注解 1.RequestMapping("/test") // 路由注册 注意: 这个注解在类和方法上都要使用,代表不同等级的路由. 2.RestController a)R…

FPGA_边沿检测电路设计

FPGA_边沿检测电路设计 边沿检测原理图波形图分析实现方法方法一&#xff1a;与逻辑实现方法二&#xff1a;或逻辑实现方法三&#xff1a;与逻辑实现 边沿检测原理图 由状态转移表可以看出&#xff0c;其转换条件中需要检测到下降沿以及上升沿&#xff0c;而边沿检测其原理就是…

「题解」相交链表

&#x1f349;题目 题目链接 &#x1f349;解析 “提示”部分有提示链表数不为零&#xff0c;所以讨论链表为空的情况。 最简单粗暴的思路就是&#xff1a;遍历链表&#xff0c;先使用循环遍历A链表&#xff0c;然后嵌套循环遍历B&#xff0c;比对A、B是否存在地址相同的…

Windows10配置深度学习环境

一、Anaconda安装与虚拟环境创建 Anaconda的出现极大的方便了研究人员的Python开发工作&#xff0c;anaconda可以创建多个虚拟环境&#xff0c;这些虚拟环境就像一间间教室一样&#xff0c;虚拟环境彼此之间、虚拟环境与基础环境&#xff08;base&#xff09;之间互不影响&…

C++之Max

背景 想学习数据结构&#xff0c;这是看的课程的习题&#xff0c;讲课老师用的是类C语言&#xff0c;具体的实现还是得自己来。 准备工作 用开发工具Microsoft Visual Studio(VS)建立一个空白的C控制台项目 选择项目的存储路径 成功建立 我在 Microsoft Visual Studio中用…

VSCode配置msvc编译调试环境

1.VS Code简介 VS Code 使用 Electron 框架构建用户界面,该框架使用 Chromium 和 Node.js 构建桌面应用程序。这使得 VS Code 能够在 Windows、Linux 和 macOS 上运行,并且可以使用 Web 技术 (HTML、CSS 和 JavaScript) 构建用户界面。 VS Code 使用 Monaco 引擎来提供文本编辑…

OpenCV入门——图像视频的加载与展示一些API

文章目录 OpenCV创建显示窗口OpenCV加载显示图片OpenCV保存文件利用OpenCV从摄像头采集视频从多媒体文件中读取视频帧将视频数据录制成多媒体文件OpenCV控制鼠标关于[np.uint8](https://stackoverflow.com/questions/68387192/what-is-np-uint8) OpenCV中的TrackBar控件TrackBa…

antd中的form表单数据不更新

antd中的form表单 initialValue导致数据不更新问题 理解 &#xff1a; initialValue就是所谓的defaultValue,只会在第一次赋值的时候改变&#xff0c;却又有一些不同&#xff0c;因为 initialValue又会因其他改动而改变。 解决&#xff1a; form.resetFields();

内网Jenkins 部署.net(dotnet)项目

一、前置条件 内网部署Jenkins&#xff0c;并安装好所需插件 此篇内容需承接内网搭建Jenkins自动化远程部署项目到Windows服务器_jenkins内网安装-CSDN博客 &#xff0c;才更好操作与理解 二、在Jenkins中创建项目 三、配置项目 General Source Code Management Build Envi…

2023最新版本 从零基础入门C++与QT(学习笔记) -4- C/C++混合编程

&#x1f38f;在C兼容C只需要调用C头文件 &#x1f384;格式 &#x1f388; -1- extern(关键字) “C”{ }(花括号) &#x1f388; -2- 花括号里面填写要包含的头文件 &#x1f384;代码段格式 extern "C" {#include “stdio.h”#include “string.h” }&#x…

2023深圳高交会,11月15-19日在深圳会展中心盛大开幕,展出五天时间

跨越山海&#xff0c;共赴鹏城。 11月15日至19日&#xff0c;第二十五届中国国际高新技术成果交易会在深圳会展中心&#xff08;福田展区&#xff09;和深圳国际会展中心&#xff08;宝安展区&#xff09;两馆同时举行。一场不可错过的全球性高科技盛会如期而至。 科技赋能发…

2023年数据泄露事件频发,企业应该如何做好数据安全保护?

在当今数字化时代&#xff0c;每时每刻都会产生大量的数据&#xff0c;这些数据包含大量的敏感信息&#xff0c;网络犯罪者可以利用这些数据获取巨大的利益&#xff0c;由此他们会通过技术攻击、网络钓鱼等各种非法手段来获取&#xff0c;而这也导致数据泄露事件频频发生。 以下…